上次介绍了按键消抖,这次讲一下如何实现同一个按键的长按和短按?
bitLock=0; //按键自锁标志位,防止按键按下一直被触发
bitShortClickTmp=0; //按键短按预处理
bitShortClick=0; //按键短按标志位
bitLongClick=0; //按键长按标志位
u8cnt=0; //作为按键按下延时计数
/***按键没有被按下时,处于高电平的状态,芯片有些引脚内置上拉电阻,所以外接下拉,
如果按键被按下,电位被拉低,就会处于低电平的状态,以此判断按键被按下********/
void key_scan(void)
{
if(KEY)
{
bitLock=0; //按键松开自动清零
u8cnt=0;
if(bitShortClickTmp) //按键短按预处理
{
bitShortClick=1; //并没有触发,只是预置好
bitShortClickTmp=0;
}
}
else if(bitLock==0) //按键按下
{
u8cnt++;
if(u8cnt==5) //按键按下50ms才确定按键短按
{
bitShortClickTmp=1;
}
if(u8cnt>99) //这里的时间可以自己把握,长按的时候人一般看到现象才会松手
{
u8cnt=0;
bitLock=1; //按键自锁标志位置1,只有按键松开才会置0,有效防止按键一直触发
bitShortClickTmp=0;
bitLongClick=1; //按键长按触发,调用完需要及时清零,防止一直触发
}
}
}
void main(void)
{
t0timer_init();
while(1)
{
if(bit10ms)
{
bit10ms=0;
key_scan();
}
}
}
标志位调用完要及时的清零,防止一直被触发。