这次来分享按键的长按和短按的方法
按键消抖一般分为4步:
1、判断按键是否按下
2、消抖
3、再次判断按键是否按下
4、等待按键松开
实现效果:
1.短按-------LED1状态取反
2.长按-------LED0状态取反
下面就直接根据代码来解释
key.c
u8 KeyAge=0,KeyPressed=0,KeyProssed=0;
#define Short_Time 1 //100ms
#define Long_Time 9 //500ms
void KEY_Scan1(void)
{
if(KEY0==0)
{
KeyAge++;
if(KeyAge>Short_Time) //消抖
{
KeyPressed=1;
}
}
else
{
//按键松开
if((KeyPressed)&&(KeyProssed==0)) //按键处理过长按了 就不再执行其他动作
{
Key_Short_Pro(); // 短按处理进程
}
KeyPressed=0;
KeyAge=0;
KeyProssed=0;
}
if((KeyAge>Long_Time)&&(KeyProssed==0)) //消抖
{
Key_Long_Pro(); // 长按处理进程
KeyProssed=1; //按键已经处理过了
}
}
void Key_Short_Pro(void)
{
LED0_Toggle;
}
void Key_Long_Pro(void)
{
LED1_Toggle;
}
这里是timer.c
//定时器3中断服务函数调用
u8 clock_50ms;
u8 key1_pressed;
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim==(&TIM3_Handler))
{
// LED1_Toggle; //LED0反转
clock_50ms++;
}
}
main.c这样写
这里,定时器每50ms产生一次中断,进入这个while里面的if
while(1)
{
if(clock_50ms>0)
{
clock_50ms=0;
KEY_Scan1();
}
}
分享解决疑惑
1.之前没搞明白,长按了,不会触发短按的效果吗?
答:一起来分析代码就明白了

首先,key按下,就进入①处来判断,进行46行的if判断,发现不成立,跳出,这时候是跳出key_scan函数,过了50ms,又进入了一次中断,这时候的46行的if成立,只要我们不松手,都不会进入else,那假设我们还在按key,这时候64行的if慢慢的接近成立,直到它成立,43行的if这里就执行完了,就会执行64的if,这时候因为64的jf成立,所以LED状态会取反,这样就实现了长按的效果。

2277

被折叠的 条评论
为什么被折叠?



