目录
一、题目
二、程序代码
1.LCD显示
void LCD_Proc(void)
{
sprintf((char *)LCD_Str," No %d ",time_save_add);
LCD_DisplayStringLine(Line1,LCD_Str);
if(set_time==1)
{
LCD_SetTextColor(Yellow);
LCD_DisplayChar(Line3,224,(Time_H/10+0x30));
LCD_DisplayChar(Line3,208,Time_H%10+0x30);
LCD_SetTextColor(Black);
}
else
{
LCD_SetTextColor(Black);
LCD_DisplayChar(Line3,224,(Time_H/10+0x30));
LCD_DisplayChar(Line3,208,Time_H%10+0x30);
}
LCD_DisplayChar(Line3,192,':');
if(set_time==2)
{
LCD_SetTextColor(Yellow);
LCD_DisplayChar(Line3,176,(Time_M/10+0x30));
LCD_DisplayChar(Line3,160,Time_M%10+0x30);
LCD_SetTextColor(Black);
}
else
{
LCD_SetTextColor(Black);
LCD_DisplayChar(Line3,176,(Time_M/10+0x30));
LCD_DisplayChar(Line3,160,Time_M%10+0x30);
}
LCD_DisplayChar(Line3,144,':');
if(set_time==3)
{
LCD_SetTextColor(Yellow);
LCD_DisplayChar(Line3,128,(Time_S/10+0x30));
LCD_DisplayChar(Line3,112,Time_S%10+0x30);
LCD_SetTextColor(Black);
}
else
{
LCD_SetTextColor(Black);
LCD_DisplayChar(Line3,128,(Time_S/10+0x30));
LCD_DisplayChar(Line3,112,Time_S%10+0x30);
}
switch(Tim_State)
{
case 1:
sprintf((char *)LCD_Str," Standby ");
LCD_DisplayStringLine(Line5,LCD_Str);break;
case 2:
sprintf((char *)LCD_Str," Setting ");
LCD_DisplayStringLine(Line5,LCD_Str);break;
case 3:
sprintf((char *)LCD_Str," Running ");
LCD_DisplayStringLine(Line5,LCD_Str);break;
case 4:
sprintf((char *)LCD_Str," Pause ");
LCD_DisplayStringLine(Line5,LCD_Str);break;
}
sprintf((char *)LCD_Str," %d ",set_time);
LCD_DisplayStringLine(Line6,LCD_Str);;
sprintf((char *)LCD_Str," Test:%d ",Key_time);
LCD_DisplayStringLine(Line7,LCD_Str);
}
2. 按键功能
void Key_Proc(void)
{
if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0)==GPIO_PIN_RESET)//B1
{
HAL_Delay(10);
if((HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0)==GPIO_PIN_RESET)&&(Key_busy==0))
{
Key_busy=1;
}
}
else if( (HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0)!=GPIO_PIN_RESET)&&(Key_busy==1))
{
time_save_add+=1;
if(time_save_add==6)
{
time_save_add=1;
}
Read_Time_Proc();
Save_temporary=1;
Key_time_sign=0;
Key_busy=0;
}
else if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1)==GPIO_PIN_RESET)//B2
{
HAL_Delay(10);
if((HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1)==GPIO_PIN_RESET)&&(Key_busy==0))
{
Key_time_sign=1;
Key_busy=2;
}
}
else if((HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1)!=GPIO_PIN_RESET)&&(Key_busy==2))
{
Key_time=0;
if (Time_0_8_sign==1)//大于0.8
{
Tim_State=3;//启动
Save_temporary=1;//储存标志
Save_Time_Proc();//保存
HAL_Delay(1);
}
else if (Time_0_8_sign==0)
{
Tim_State=2;//设置模式
set_time+=1;
if(set_time==4)
{
set_time=1;
}
}
Time_0_8_sign=0;
Key_time_sign=0;
Key_busy=0;
}
else if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2)==GPIO_PIN_RESET)//B3
{
HAL_Delay(10);
if((HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2)==GPIO_PIN_RESET)&&(Key_busy==0))
{
Key3_time_sign=1;
Key_busy=3;
}
}
else if((HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2)!=GPIO_PIN_RESET)&&(Key_busy==3) )
{
Key_time=0;
Key3_time_sign=0;
if(Time_0_8_sign==0)
{
if(set_time==1)
{
Time_H+=1;
}
else if(set_time==2)
{
Time_M+=1;
}
else if(set_time==3)
{
Time_S+=1;
}
}
Key_busy=0;
}
else if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)==GPIO_PIN_RESET)//B4
{
HAL_Delay(10);
if((HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)==GPIO_PIN_RESET)&&(Key_busy==0))
{
Key_time_sign=1;
Key_busy=4;
}
}
else if(((HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)!=GPIO_PIN_RESET)&&(Key_busy==4)))
{
Key_time_sign=0;//停止计时标志位
Key_time=0;
if(Time_0_8_sign==1)//大于0.8
{
Tim_State=1;
Time_0_8_sign=0;
}
else if(Time_0_8_sign==0)
{
Tim_State+=1;
if( (Tim_State!=3)&&(Tim_State!=4) )
{
Tim_State=3;//运行
}
if(Tim_State==3)//运行
{
HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1);
__HAL_TIM_SET_COMPARE(&htim3,TIM_CHANNEL_1,800);
}
else if(Tim_State==4)//暂停
{
HAL_TIM_PWM_Stop(&htim3,TIM_CHANNEL_1);
LED=0x00;
}
}
Key_busy=0;
}
}
3. 长按判断功能
//长短按键
if( (Key_busy==1)||(Key_busy==2)||(Key_busy==3)||(Key_busy==4) )
{
Key_time++;
if(Key_time>=8)
{
Time_0_8_sign=1;
}
}
if( (Key_busy==3)&&(Time_0_8_sign==1) )
{
Add_key3_num++;
if(Add_key3_num>=3)
{
if(set_time==1)
{
Time_H++;
}
else if(set_time==2)
{
Time_M+=1;
}
else if(set_time==3)
{
Time_S+=1;
}
Add_key3_num=0;
}
}
总结
改变了按键的编写方式,让按键不会因为多个按键同时按下而产生误识别的操作。