机械按键会抖动,在人的感官上来说,可以忽略不计,但是,对于主频动则上MHz的单片机来说,这是不容忽略的,机械按键的抖动时长一般为10到80ms,具体的抖动平均时长,可以通过定时器输入捕获时长来判断,或者使用延时来判断哪个时间最适合消抖,另外,需要使用标志位,这是为了让按键的按下判断能只执行一次,除非松开,否则无法再次进入按键判断;
具体实现代码如下:
u8 key_scan(void)//长按,短按模式
{
static u8 flag = 0;//按键标志位
static u16 count = 0;//按键时长计数值
if(flag == 0 && KEY)
{
delay_ms(50);
if(KEY)//如果达到消抖时间后按键还是按下的情况,标志位置一
{
flag = 1;
}
}
else if(flag == 1 && !KEY)//除非松开按键且标志位为1,才能进入结束判断
//因为松开时也会发生抖动,但是因为按键消抖,使得它无法把标志位变为1,所以不会二次进入结束判断状态
{
if(count >= 50)//长按模式,按下时长大于500ms
{
flag = 0;
count = 0;
return KEY_LONG;
}
else if(count < 50)//短按模式
{
flag = 0;
count = 0;
return KEY_SHORT;
}
}
if(flag == 1)//当按键按下后,此处用来计算按键时长
{
delay_ms(10);
count++;
}
return 0;
}