前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C51 单片机开发按键软件消除的抖动

C51 单片机开发按键软件消除的抖动

作者头像
码农UP2U
发布2024-04-11 15:09:34
1500
发布2024-04-11 15:09:34
举报
文章被收录于专栏:码农UP2U码农UP2U

公众号文章同步阅读网址:www.netor0x86.com

前两篇文章中,通过开发板上的按钮控制了 LED 灯的亮和灭。本篇文章中来整理一下关于按键抖动的问题。

0x01:按键抖动的产生

在日常生活中,我们使用各种遥控器的时候,可能会出现按键不灵的情况,比如空调的遥控器无法打开或关闭空调,电视遥控器无法切换电视台等。

按键抖动与此类似,不过现象刚好与此相反。按键不灵是操作按键无法完成我们想要的功能,而按键抖动就是按键过于“灵敏”从而产生了我们不想要的情况。比如,我们可能是轻轻晃动了一下开发板,就完成了按键所要完成的功能。比如,按下按键的功能是让 LED 灯亮起,那么可能我们并没有按下按键,只是轻轻地晃动一下开发板 LED 就亮了……!这不是灵异事件,而是按键抖动!

这种情况可能是电路板或元器件在生产时的原因产生的,也可能是因为开发板频繁使用导致元器件松动的原因产生的,或者使用时间久了而老化了的原因产生的,反正是各种可能,各种情况吧!所以我总结什么是抖动就是,因开发板的晃动从而发生了电平的改变,进而产生了预期外的情况(总结不一定到位,理解就好!)。

0x02:软件消抖方法

解决方法也比较简单,我们在通过软件消抖时,是进行两次检查,而两次检查之间有一个时间间隔,也就是说电平的改变要有一个时间的持续,而不是瞬间即逝的改变。这种方法类似在 Java 中实现单例模式时有一个双重检查的方式。

比如,在查询法中检测按钮是否被按下,就是通过判断指定的 P 口是否有低电平被输入,如果有就将 LED 灯点亮。当产生抖动时,指定 P 口也输入了一个低电平,那么单片机就会把 LED 点亮。但是这个抖动产生的低电平时间很短。

时间短的意思是,我们认为的按下按键并松开按键,可能需要有个几百毫秒的时间,那么这个低电平会持续几百毫秒;而产生抖动时,这个低电平可能只持续几毫秒、几十毫秒,而几毫秒、几十毫秒我们人是无法完成按键按下并松开的,所以抖动产生的电平时间很短。(如果你说抖动的时间也有几百毫秒了,那么就建议换一个板子吧!)

所以,我们在查询法中检测按钮时,并不是检测一次,而是检测两次,两次之间有一个小小的时间间隔,如果这个时间间隔之间都有低电平,则认为是按钮真的被按下了,而不是产生了抖动。

0x03:代码实现

代码实现,在上篇文章的代码基础上进行修改即可(上篇文章地址:),代码如下:

代码语言:javascript
复制
#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 秒或以上才可以。

按照上面的方式,修改上篇文章中的代码,就可以完成软件消抖的功能了!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-03-31,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 码农UP2U 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 0x01:按键抖动的产生
  • 0x02:软件消抖方法
  • 0x03:代码实现
相关产品与服务
腾讯云服务器利旧
云服务器(Cloud Virtual Machine,CVM)提供安全可靠的弹性计算服务。 您可以实时扩展或缩减计算资源,适应变化的业务需求,并只需按实际使用的资源计费。使用 CVM 可以极大降低您的软硬件采购成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档