用到按键就要处理因为机械结构带来的按键抖动问题,也就是按键消抖。
按键消抖原理:在按键按下以后延时一段时间再去读取按键值,如果此时按键值还有效就表示这是一次有效的按键,中间的延时就是消抖的。
但是,延时函数会浪费CPU性能,因为延时函数是空跑。如果按键是用中断方式实现的,就更不能在中断服务函数里面使用延时函数,因为中断服务函数最基本的要求就是快进快出。
而定时器设置好定时时间,CPU就可以去做其他事情去了,时间到了就会触发中断,然后在中断中做相应的处理即可。
因此,可以借助定时器来实现消抖,按键采用中断驱动方式,当按键按下以后触发按键中断,在按键中断中开启一个定时器,定时器为10ms,当定时时间到了以后就会触发定时器中断,最后在定时器中断处理函数中读取按键的值,如果按键值还是按下状态就表示这是一次有效的按键。
- t1~t3这一段时间就是按键抖动,需要消除。
- 设置按键为下降沿触发,因此在t1,t2,t3这三个时刻都会触发按键中断。
- 每次进入中断处理函数都会重新开启定时器中断,所以会在t1,t2,t3这三个时刻开启定时器中断。
- 但是t1-t2,t2-t3这两个时间段是小于我们设置的定时器中断周期(也就是消抖时间,比如10ms)。
- 所以虽然t1开启了定时器,但是定时器定时时间还没到t2时刻就重置了定时器,最终只有t3时刻开启的定时器能完整的完成整个定时周期并触发中断。