#include "stm32f10x.h" // Device header
#include "Delay.h"
#include "OLED.h"
#include "MatrixKey.h"
uint8_t num[16]={1,2,3,10, //控制键盘
4,5,6,11, //10表示调节继电器一的时间,11为暂停时间,12为继电器二的时间,13为启动
7,8,9,12, //15表示关闭重新调节时间
16,0,15,13 //16表示为输入时间完毕
};
int main(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
while (1)
{
OLED_Clear();
MatrixKey_Init();
Delay_ms(1000);
uint8_t KeyNum,Num,dy;
uint32_t sum1,sum2,sum3;
unsigned char i,j,k,x;
i=j=k=1; //初始时间的位数
sum1=5; //继电器一连接时间
sum2=5; //暂停时间
sum3=5; //继电器二连接时间
x=0;
OLED_Init();
OLED_ShowChinese(0, 0, "继电器一:");
OLED_ShowChinese(0, 20, "停止:");
OLED_ShowChinese(0, 40, "继电器二:");
OLED_ShowNum(80, 0, sum1, i, OLED_8X16);
OLED_ShowNum(80, 20, sum2, j, OLED_8X16);
OLED_ShowNum(80, 40, sum3, k, OLED_8X16);
OLED_Update();
KeyNum=MatrixKey_GetValue();
if (KeyNum>0)
{
Num=num[KeyNum-1];
if (Num<=13&&Num>=10)
{
dy=Num;
switch(dy)
{
case 10:
sum1=0;
i=0;
OLED_ShowChinese(80, 0, ";;");
OLED_Update();
Delay_ms(100);
while (1)
{
OLED_Init();
KeyNum=MatrixKey_GetValue();
if (KeyNum>0)
{
Num=num[KeyNum-1];
if(Num<=9)
{
sum1=sum1*10+Num;
i++;
OLED_ShowNum(80, 0, sum1, i, OLED_8X16);
OLED_Update();
Delay_ms(100);
}
if(KeyNum==16)
{
break;
}
}
}
break;
case 11:
sum2=0;
j=0;
OLED_ShowChinese(80, 20, ";;");
OLED_Update();
Delay_ms(100);
while (1)
{
OLED_Init();
KeyNum=MatrixKey_GetValue();
if (KeyNum>0)
{
Num=num[KeyNum-1];
if(Num<=9)
{
sum2=sum2*10+Num;
j++;
OLED_ShowNum(80, 20, sum2, j, OLED_8X16);
OLED_Update();
Delay_ms(100);
}
if(KeyNum==16)
{
break;
}
}
}
break;
case 12:
sum3=0;
k=0;
OLED_ShowChinese(80, 40, ";;");
OLED_Update();
Delay_ms(100);
while (1)
{
OLED_Init();
KeyNum=MatrixKey_GetValue();
if (KeyNum>0)
{
Num=num[KeyNum-1];
if(Num<=9)
{
sum3=sum3*10+Num;
k++;
OLED_ShowNum(80, 40, sum3, k, OLED_8X16);
OLED_Update();
Delay_ms(100);
}
if(KeyNum==16)
{
break;
}
}
}
break;
case 13:
break;
}
while (1)
{
GPIO_WriteBit(GPIOA, GPIO_Pin_8, Bit_SET);
for(int a=0;a<=1000;a++)
{
Delay_ms(sum1);
KeyNum=MatrixKey_GetValue();
if(KeyNum==15)
{
x=1;
break;
}
}
if(x==1)
{
GPIO_WriteBit(GPIOA, GPIO_Pin_8, Bit_RESET);
GPIO_WriteBit(GPIOA, GPIO_Pin_9, Bit_RESET);
break;
}
GPIO_WriteBit(GPIOA, GPIO_Pin_8, Bit_RESET);
for(int a=0;a<=1000;a++)
{
Delay_ms(sum2);
KeyNum=MatrixKey_GetValue();
if(KeyNum==15)
{
x=1;
break;
}
}
if(x==1)
{
GPIO_WriteBit(GPIOA, GPIO_Pin_8, Bit_RESET);
GPIO_WriteBit(GPIOA, GPIO_Pin_9, Bit_RESET);
break;
}
GPIO_WriteBit(GPIOA, GPIO_Pin_9, Bit_SET);
for(int a=0;a<=1000;a++)
{
Delay_ms(sum3);
KeyNum=MatrixKey_GetValue();
if(KeyNum==15)
{
x=1;
break;
}
}
if(x==1)
{
GPIO_WriteBit(GPIOA, GPIO_Pin_8, Bit_RESET);
GPIO_WriteBit(GPIOA, GPIO_Pin_9, Bit_RESET);
break;
}
GPIO_WriteBit(GPIOA, GPIO_Pin_9, Bit_RESET);
for(int a=0;a<=1000;a++)
{
Delay_ms(sum2);
KeyNum=MatrixKey_GetValue();
if(KeyNum==15)
{
x=1;
break;
}
}
if(x==1)
{
GPIO_WriteBit(GPIOA, GPIO_Pin_8, Bit_RESET);
GPIO_WriteBit(GPIOA, GPIO_Pin_9, Bit_RESET);
break;
}
}
}
}
}
}
以上是程序部分
接线是把继电器输入口直接接在A8,A9脚,然后接了一个oled和矩阵键盘


不知道为什么芯片一开始是正常工作的,过两天再去用的时候发现一通电芯片就很烫,应该烧了
继电器是带光耦隔离的
