底层硬件底板按键抖动:关于按键抖动的时间、按键消抖

        通常按键抖动所用的开关都是机械弹性开关,当机械触点断开、闭合时,由于机械触点的弹性作用,一个按键开关在闭合时不会马上就稳定的接通,在断开时也不会一下子彻底断开,而是在闭合和断开的瞬间伴随着一连串的抖动,如下图所示。

理想状态下的按键        

 

 按键稳定闭合时间长短是由操作人员决定的,通常都会在100ms以上,刻意快速按的话能达到40~50ms左右,很难在低了。抖动时间是由按键的机械特性决定的,一般都会在10ms以内,为了确保程序对按键的一次闭合或者一次断开只响应一次,必须进行按键的消抖处理。

 

        在绝大多数情况下,是用软件即程序来实现消抖的。最简单的消抖原理,就是当检测到按键状态变化后,先等待一个10ms左右的延迟时间,让抖动消失后再进行一次按键状态检测,如果与刚才检测到的状态相同,就可以确认按键已经稳定的动作了。实际应用中,这种做法局限性大(实时性差)           

软件去抖的几个思路:

1、延迟
先定义一个变量记录按键的状态:char key;
然后轮询检测按键状态,当按键状态改变的时候,判断为有按键动作,接下来进入延迟函数;
等到延迟时间过了之后,再读取按键状态,如果按键状态仍为按下状态,则说明确实是有按键动作,不是抖动。

2、中断加延迟方式
单片机总是轮询状态会浪费很多资源,尤其是单片机运行的时间,可以通过中断方式来解决。
中断模式下,单片机不需要轮询按键状态,当有中断产生的时候才会进入延时函数,进行按键去抖程序。

这种情况下,延时函数在哪里进行处理就有两种选择:
一种是放在中断函数中进行,这个时候中断函数占用的时间就比较长,影响响应速度;
另一种是放在中断函数之外进行,这个时候就缩短了中断处理时间,但是这个时候就需要一个标志位来表明是否有中断产生,而且单片机也需要不断查询,只是节约了查询时候读取IO状态的步骤。

3、持续采样
持续采样会大大提高采样的准确度,但是同时也会增加CPU的开销。
在使用中,需要根据需要选择不同的采样频率,一般每10ms采集一次就足够了。


关于延迟方法:
简单的延时,可以采用空循环来实现,这个方法比较消耗CPU的资源,CPU任务较重的时候不建议使用。延时函数可以考虑使用定时器替换,但这又消耗了定时器资源,不过只要够用的话还是尽量用,毕竟可以减轻CPU的负担。

关于一次按键过程中产生多次中断的处理:
一次按键过程,可能产生多次中断,可以设置一个标志位来显示是否处于按键识别处理阶段,如果处于按键识别处理阶段即便产生中断也不进行任何响应,这样就可以忽略多余的中断了。

 

                                                                                                                               

猜你喜欢

转载自blog.csdn.net/Eliauk1234/article/details/121381439