在设计单片机按键输入的时候,进行按键消抖是防止按键输入被CPU误读多次的必要手段。
一、按键消抖方法(软件)
如果按键较多的情况下,常用软件方法消抖
(1)延时消抖(延时函数按键消抖)
检测出键闭合后执行一个延时程序,5~10ms(取决于机械特性)的延时,让前沿抖动消失后再一次检测键的状态,如果仍保持闭合状态电平,则确认为真正的按下按键。当检测到按键释放后,也要给5~10ms的延时,待后沿抖动消失后才能转入该键的执行程序。
缺点:程序在空跑,会浪费CPU资源、不够精准。
if(PXin(x)==KEY_PRESS)
{
delay_ms(10);
if(PXin(x)==KEY_PRESS)
{
//按键处理
}
}
注:如果按键是用中断方式实现的,那就更不能在中断服务函数里面使用延时函数,因为中断服务函数最基本的要求就是快进快出!
(2)定时器消抖(定时按键消抖)
原理:按键采用中断驱动方式,当按键按下以后触发按键中断,在按键中断中开启一个定时器,定时周期为10ms,当定时时间到了以后就会触发定时器中断,最后在定时器中断处理函数中读取按键的值,如果按键值还是按下状态那就表示这是一次有效的按键。
图中 t1 ~ t3 这一段时间就是按键抖动,是需要消除的。设置按键为下降沿触发(由按键的电路决定),因此会在 t1、t2 和 t3 这三个时刻会触发按键中断,每次进入中断处理函数都会重新开器定时器中断,所以会在 t1、t2 和 t3 这三个时刻开器定时器中断。但是 t1 ~ t2 和 t2 ~ t3 这两个时间段是小于我们设置的定时器中断周期(也就是消抖时间,比如 10ms),所以虽然 t1 开启了定时器,但是定时器定时时间还没到 t2 时刻就重置了定时器,最终只有 t3 时刻开启的定时器能完整的完成整个定时周期并触发中断,我们就可以在定时器中断处理函数里面做按键处理了。
优点:节约CPU资源
缺点:消耗一个定时器