最低级的就是硬延时检测了,通过硬延时10~20ms消抖。
普遍采用的都是定时扫描,通过定时中断消抖。这个是核心思想。
例举网上几个常用的算法。
1、
unsigned char Trg;//Trg(triger) 代表的是触发 unsigned char Cont;//Cont(continue)代表的是连续按下。 void KeyRead( void ) { unsigned char ReadData = PINB^0xff; Trg = ReadData & (ReadData ^ Cont); Cont = ReadData; } 评:不推荐使用,原因,消抖不严格。 2、
Keradyn=Ktemp Kinput+Kreadyn-1 (Ktemp ⊙Kinput) (1)
Ktemp=Kinput (2)
评:推荐使用,缺点是扩展新功能不易。
3、 马老师利用状态机写的按键检测程序:
评:灵活多用,消抖次数更改方便。扩展多功能程序稍显复杂。
4、
上述都是用在按键检测场合,特殊IO检测可能需要多次长时间消抖。
比如车辆ACC检测,直接按下面的方式效果更好。
if(!ACC_INPUT) {
if(accon < 10) {
if(++accon == 10) {
accoff = 0;
}
}
}
else{
if(++accoff > 3) accon = 0;
}