前言:在之前的博客中,已经发布了按键仅单击判断的程序【蓝桥杯嵌入式】以定时中断的方式处理按键,现通过修改Keyprocess()函数和Key结构体来进行双击和长按的判断
修改struct Key:
struct Keys{
uint8_t state;
uint16_t flag;
uint8_t times;
uint8_t SingleSignal; //500ms-
uint8_t DoubleSignal; //500ms wait 200ms
uint8_t LongSignal; //500ms+
};
修改KeyProcess():
void KeyProcess(){
Key[0].state = !HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0);
Key[1].state = !HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1);
Key[2].state = !HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2);
Key[3].state = !HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0);
for(int i=0;i < 4;i++){
//按下
if(Key[i].state == 1){
if(Key[i].flag < 50){
Key[i].flag = 50;
Key[i].times ++;
}
else{
Key[i].flag ++;
}
}
//抬起
else{
//长按判断500ms+
if(Key[i].flag >= 50 + 50){
Key[i].flag = 5; //倒数50ms清除标志位
Key[i].times = 0; //按下次数置0
Key[i].LongSignal = 1; //挂起长按标志位
}
//短按及等待双击
else if(Key[i].flag < 50 + 50 && Key[i].flag >= 50){
Key[i].flag = 20; //等待200ms内的下次一按下
}
//倒计时
else if(Key[i].flag > 0 && Key[i].flag < 50){
Key[i].flag --;
}
//flag为0时操作
else{
//按下次数为1
if(Key[i].times == 1){
Key[i].SingleSignal = 1;//
Key[i].flag = 5;
Key[i].times = 0;
}
//按下次数为2
else if(Key[i].times == 2){
Key[i].DoubleSignal = 1;
Key[i].flag = 5;
Key[i].times = 0;
}
//各标志位置0
else{
Key[i].times = 0;
Key[i].SingleSignal = 0;
Key[i].DoubleSignal = 0;
Key[i].LongSignal = 0;
}
}
}
}
}