赛题
部分程序
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_TIM3_Init();
MX_TIM6_Init();
/* USER CODE BEGIN 2 */
m24c02_init();
LED_init();
KEY_init();
LCD_Init(); //LCD初始化
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
KEY_function();
LED_function();
PWM_function();
LCD_function();
}
/* USER CODE END 3 */
void LCD_function(void)
{
u8 a;
if(get_time_task(TASK_TIMES.LCD_TIME)==0)
{
TASK_TIMES.LCD_TIME=get_time()+LCD_time;
LCD_Line2_buf[5]=flag_storage+1+48; //存储位
if((timer_statr==1)||(timer_statr==2)) {a=6;} //在启动或暂停状态下,显示倒计时时间
else if(timer_statr==3) {a=5;} //在设置状态下,显示设置时间
else {a=flag_storage;} //在停止状态下,显示当前存储位时间
LCD_Line4_buf[6]=storage_buf[a][0]/10+48; LCD_Line4_buf[7]=storage_buf[a][0]%10+48;
LCD_Line4_buf[9]=storage_buf[a][1]/10+48; LCD_Line4_buf[10]=storage_buf[a][1]%10+48;
LCD_Line4_buf[12]=storage_buf[a][2]/10+48;LCD_Line4_buf[13]=storage_buf[a][2]%10+48;
if(timer_statr==3) //在设置状态下,被选中的时间高亮
{
if(flag_set_time==0) {LCD_SetTextColor(Red);LCD_DisplayStringLine2(Line4,LCD_Line4_buf+6,6,2);LCD_SetTextColor(White);}
else {LCD_DisplayStringLine2(Line4,LCD_Line4_buf+6,6,2);}
if(flag_set_time==1) {LCD_SetTextColor(Red);LCD_DisplayStringLine2(Line4,LCD_Line4_buf+9,9,2);LCD_SetTextColor(White);}
else {LCD_DisplayStringLine2(Line4,LCD_Line4_buf+9,9,2);}
if(flag_set_time==2) {LCD_SetTextColor(Red);LCD_DisplayStringLine2(Line4,LCD_Line4_buf+12,12,2);LCD_SetTextColor(White);}
else {LCD_DisplayStringLine2(Line4,LCD_Line4_buf+12,12,2);}
}
else { LCD_DisplayStringLine(Line4,LCD_Line4_buf); } //其他状态正常显示
LCD_DisplayStringLine(Line2,LCD_Line2_buf); //刷新LCD第2行
LCD_DisplayStringLine(Line6,&LCD_Line6_buf[timer_statr][0]); //刷新LCD第6行
}
}
void PWM_function(void)
{
static u8 flag=0xff;
if(timer_statr!=flag) //定时器状态发送改变
{
if(timer_statr==1) { HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1); } //启动
else { HAL_TIM_PWM_Stop(&htim3,TIM_CHANNEL_1); } //停止
}
flag=timer_statr;
}
按键扫描(长短按)
u8 KEY_scan(void)
{
u8 val=0;
u8 key=0; //第7位为长短按标志位
static u8 falg_down_up=0;
static u8 key_val;
static u32 key_down_time=0;
if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0)==RESET) val=1;
else if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1)==RESET) val=2;
else if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2)==RESET) val=3;
else if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)==RESET) val=4;
else val=0;
if((val!=0))
{
if(falg_down_up==0) //刚按下
{
key_down_time=sys_time;
falg_down_up=1;
key_val=val;
}
else if(falg_down_up==1) //等待按下时间超过0.8秒
{
if((sys_time-key_down_time)>800) //第一次超过0.8秒,此次为长按
{
falg_down_up=2;
key=key_val;
key|=0x80;
}
}
else if(falg_down_up==2) //等待长按松开
{
key=key_val;
key|=0x80;
}
}
else if(val==0) //按键松开
{
if(falg_down_up==1) //上个状态为按下,时间小于0.8秒,此次状态为短按
{
falg_down_up=0;
key=key_val;
}
else if(falg_down_up==2) //长按松开
{
falg_down_up=0;
key=0;
}
}
return key;
}
按键功能
void KEY_handle(u8 key)
{
static u8 key_time=0;
if(key&0x80) //长按功能
{
key&=0x7f; //长按标志位清零
if(key==1)
{
;
}
else if(key==2) //临时存储到当前存储位,退出设置状态
{
if(timer_statr==3) //在设置状态
{
storage_buf[flag_storage][0]=storage_buf[5][0]; //临时存储位赋值给当前存储
storage_buf[flag_storage][1]=storage_buf[5][1];
storage_buf[flag_storage][2]=storage_buf[5][2];
X24c02_buf[1+flag_storage*3+0]=storage_buf[flag_storage][0];
X24c02_buf[1+flag_storage*3+1]=storage_buf[flag_storage][1];
X24c02_buf[1+flag_storage*3+2]=storage_buf[flag_storage][2];
m24c02_write(X24c02_buf+1+flag_storage*3,DATA_ARR+1+flag_storage*3,3); //保存到EEPROM
timer_statr=0; //退出设置状态
}
}
else if(key==3) //时间快速递增
{
if(++key_time>=5)
{
key_time=0;
if(flag_set_time==0) {if(++storage_buf[5][flag_set_time]>23) {storage_buf[5][flag_set_time]=0;}}
else {if(++storage_buf[5][flag_set_time]>59) {storage_buf[5][flag_set_time]=0;}}
}
}
else if(key==4) //定时器返回停止状态
{
if(timer_statr!=3) {timer_statr=0;} //在设置状态该功能无效
}
}
else //短按功能
{
if(key==1) //切换存储位置
{
if(++flag_storage==5) {flag_storage=0;}
LCD_Line4_buf[6]=storage_buf[flag_storage][0]/10+48; LCD_Line4_buf[7]=storage_buf[flag_storage][0]%10+48;
LCD_Line4_buf[9]=storage_buf[flag_storage][1]/10+48; LCD_Line4_buf[10]=storage_buf[flag_storage][1]%10+48;
LCD_Line4_buf[12]=storage_buf[flag_storage][2]/10+48; LCD_Line4_buf[13]=storage_buf[flag_storage][2]%10+48;
}
else if(key==2) //切换时间设置和存储键
{
if(timer_statr!=3) //未在设置状态,切换到设置状态
{
timer_statr=3;flag_set_time=0;
storage_buf[5][0]=storage_buf[flag_storage][0]; //当前存储位赋值给临时存储
storage_buf[5][1]=storage_buf[flag_storage][1];
storage_buf[5][2]=storage_buf[flag_storage][2];
}
else if(timer_statr==3) //在设置状态
{
if(++flag_set_time==3) {flag_set_time=0;} //切换时分秒设置
}
}
else if(key==3) //时间加1
{
if(flag_set_time==0) {if(++storage_buf[5][flag_set_time]>23) {storage_buf[5][flag_set_time]=0;}}
else {if(++storage_buf[5][flag_set_time]>59) {storage_buf[5][flag_set_time]=0;}}
}
else if(key==4) //定时器启动键
{
if(timer_statr==1) {timer_statr=2;} //启动状态切换为暂停状态
else //其他状态切换启动状态
{
if(timer_statr==0) //停止切换为启动
{
storage_buf[6][0]=storage_buf[flag_storage][0];
storage_buf[6][1]=storage_buf[flag_storage][1];
storage_buf[6][2]=storage_buf[flag_storage][2];
}
else if(timer_statr==2) //暂停状态切换为启动状态
{
;
}
else if(timer_statr==3) //设置状态切换为启动状态
{
storage_buf[6][0]=storage_buf[5][0];
storage_buf[6][1]=storage_buf[5][1];
storage_buf[6][2]=storage_buf[5][2];
}
if((storage_buf[6][0]!=0)||(storage_buf[6][1]!=0)||(storage_buf[6][2]!=0)) //时间不为0方可启动
{timer_statr=1;}
}
}
}
}
void KEY_function(void)
{
u8 key;
if(get_time_task(TASK_TIMES.KEY_TIME)==0)
{
TASK_TIMES.KEY_TIME=get_time()+KEY_time;
key=KEY_scan(); //扫描按键
KEY_handle(key); //按键功能
}
}
完整程序下载
下载链接:
链接:https://pan.baidu.com/s/1LMECSy3GuABduu42YUJdSQ
提取码:qy2o