公众号文章同步阅读网址:www.netor0x86.com
前两篇文章中,通过开发板上的按钮控制了 LED 灯的亮和灭。本篇文章中来整理一下关于按键抖动的问题。
在日常生活中,我们使用各种遥控器的时候,可能会出现按键不灵的情况,比如空调的遥控器无法打开或关闭空调,电视遥控器无法切换电视台等。
按键抖动与此类似,不过现象刚好与此相反。按键不灵是操作按键无法完成我们想要的功能,而按键抖动就是按键过于“灵敏”从而产生了我们不想要的情况。比如,我们可能是轻轻晃动了一下开发板,就完成了按键所要完成的功能。比如,按下按键的功能是让 LED 灯亮起,那么可能我们并没有按下按键,只是轻轻地晃动一下开发板 LED 就亮了……!这不是灵异事件,而是按键抖动!
这种情况可能是电路板或元器件在生产时的原因产生的,也可能是因为开发板频繁使用导致元器件松动的原因产生的,或者使用时间久了而老化了的原因产生的,反正是各种可能,各种情况吧!所以我总结什么是抖动就是,因开发板的晃动从而发生了电平的改变,进而产生了预期外的情况(总结不一定到位,理解就好!)。
解决方法也比较简单,我们在通过软件消抖时,是进行两次检查,而两次检查之间有一个时间间隔,也就是说电平的改变要有一个时间的持续,而不是瞬间即逝的改变。这种方法类似在 Java 中实现单例模式时有一个双重检查的方式。
比如,在查询法中检测按钮是否被按下,就是通过判断指定的 P 口是否有低电平被输入,如果有就将 LED 灯点亮。当产生抖动时,指定 P 口也输入了一个低电平,那么单片机就会把 LED 点亮。但是这个抖动产生的低电平时间很短。
时间短的意思是,我们认为的按下按键并松开按键,可能需要有个几百毫秒的时间,那么这个低电平会持续几百毫秒;而产生抖动时,这个低电平可能只持续几毫秒、几十毫秒,而几毫秒、几十毫秒我们人是无法完成按键按下并松开的,所以抖动产生的电平时间很短。(如果你说抖动的时间也有几百毫秒了,那么就建议换一个板子吧!)
所以,我们在查询法中检测按钮时,并不是检测一次,而是检测两次,两次之间有一个小小的时间间隔,如果这个时间间隔之间都有低电平,则认为是按钮真的被按下了,而不是产生了抖动。
代码实现,在上篇文章的代码基础上进行修改即可(上篇文章地址:),代码如下:
#include <intrins.h>
#include "reg52.h"
sbit led1 = P3 ^ 7;
sbit key1 = P2 ^ 1;
sbit key2 = P2 ^ 0;
void Delay2000ms() //@11.0592MHz
{
unsigned char i, j, k;
_nop_();
i = 15;
j = 2;
k = 235;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void main()
{
while (1)
{
if (key1 == 0)
{
Delay2000ms();
if (key1 == 0)
{
led1 = 0;
}
}
if (key2 == 0)
{
Delay2000ms();
if (key2 == 0)
{
led1 = 1;
}
}
}
}
上面的代码中,Delay2000ms() 函数表示延迟 2 秒中,是使用 STC-ISP 生成的一个函数。实际代码中,可以不使用这么大的延迟。在我测试的时候,我的开发板不存在按键抖动的情况,因此我使用 2 秒是为了测试。当我短暂的按下按键时(小于 2 秒)并不会让 LED 灯亮起,这样可以模拟抖动。想要让 LED 灯亮起,需要按住按键在 2 秒或以上才可以。
按照上面的方式,修改上篇文章中的代码,就可以完成软件消抖的功能了!
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有