在嵌入式蓝桥杯第14届中考察了按键长按的处理,尝试了自己的想法没有成功,所以写个文章研究一下。
我原来的想法是:
按下按键后打开定时器,定时器计时2s,如果定时器正在运行,就轮询检测按键是否松开,如果松开就是短按。如果定时器计时完成就关闭定时器,等待按键松开,就是长按。这个方式也是没问题的。
代码如下:
//PWM_C初始化为1,在定时器超时后PWM_C=0判定为长按
if(PWM_C==1)//长按
{
HAL_TIM_Base_Start_IT(&htim6);
while(HAL_TIM_Base_GetState(&htim6)==HAL_TIM_STATE_BUSY)//定时器正在运行
{
if(HAL_GPIO_ReadPin(B4_GPIO_Port,B4_Pin)==GPIO_PIN_SET)//按键提前松开,就是短按
{
HAL_TIM_Base_Stop_IT(&htim6);
return;
}
}
//如果是长按就等待按键松开
if(PWM_C==0)
while(HAL_GPIO_ReadPin(B4_GPIO_Port,B4_Pin)==GPIO_PIN_RESET);
}
else//短按
PWM_C=1;
(我以为错了,但其实是忘记了我的LED灯设置为自动熄灭,以为是按键长按的问题,写这篇文章的时候才发现)
这种设计只适合于一种长按时间,有时候需要长按3s做出一种响应而长按4s又做出另一种响应。这就需要在定时器中做一个计数的操作,每过1s就加1,判断这个值就可以知道是是什么状态了。
原理和上面的差不多,可以参考麦克斯同学的文章。