一个关于按键的道理
-
在按键被按下的时候,发生的信号不是一个完美的信号,而是会产生一些抖动,连续产生几个信号后,稳定下来,经过按键厂家们的测试,大概在10ms~20ms之后,按键信号会稳定下来。
消抖
-
其实就是消除这10ms~20ms期间的信号不稳定。
定时器延时消抖原理
-
收到按键信号后,设定一个闹钟,闹钟将在10ms之后提醒我们进行处理按键信号。如果发生抖动,则在下一个按键信号修改闹钟的时间为这个时刻的10ms之后,以此类推。
-
最后按键信号稳定下来之后,只会触发一个闹钟。
软件实现
步骤一、定义定时器结构体,初始化并添加
static struct timer_list _timer;
// 初始化
init_timer(&_timer);
// 设置回调函数
_timer.function = _timer_callback;
// 添加定时器
add_timer(&_timer);
步骤二、实现定时器回调函数
static void _timer_callback(unsigned long data)
{
//。。。。
}
步骤三、设置定时器触发时间——10ms
jiffies:Linux系统的滴答计数值,每5ms加一,也就是说,定时器的时间只能设定为5ms的倍数。
HZ:一个宏,表示一秒的计数值,这里HZ = 200,表示一秒有200个滴答。
——所以10ms就表示为 10ms = 1000ms / 100 = HZ / 100;
mod_timer(&_timer, jiffies + HZ / 100);
步骤四、删除定时器
del_timer(&_timer);