0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

按键消抖的软件和硬件方法

CHANBAEK 来源:硬件工程师干货 作者:硬件工程师干货 2023-03-01 10:53 次阅读

1、先看一下按键抖动波形

采用锅仔片式按键测量波形。 按键按下与抬起的部分都出现抖动,大致时间10ms左右。 为了防止按键误按或者重复识别,必须要按键消抖处理。 按键消抖有软件方法和硬件方法。

2、硬件方法:

一般增加对地滤波电容,利用电容两端电压不能突变的特性减少抖动杂波,使波形更加规整。

其它的复杂方法如RS触发器电路一般用在没有软件的场合,这里就不做介绍了。

3、软件方法:采用延时检测的方法错开抖动区域。

代码实现1: 这种方法在主循环内轮询按键状态,查询GPIO状态,这种方法最简单,也最常见,但是会增加主循环的负荷,按键按下时会阻塞主循环,降低主循环实时性。 当然主循环的阻塞是否有影响,根据自己情况判断。

while(1)
{
    if(KeyGpio == 0)
    {
        DelayMs(10);    //延时10ms
        if(KeyGpio == 0)
        {
            //按键处理代码
        }
    }
    //其它代码
}

代码实现2: 按键GPIO初始化为中断方式,按键按下后产生外部中断事件,进入中断处理函数中,延时消抖,最终调用按键处理函数,或者设置标志位去主循环里调用按键处理函数。 这种在中断中延时消抖的方法不少人使用,其性能还不如第一种方法,缺点很明显,中断中延时会导致低优先级中断阻塞,也导致主循环阻塞,实时性更差。

void KeyGpio_IrqHandler(void)
{
    if(KeyGpio == 0)
    {
        //延时10ms
        DelayMs(10);
        if(KeyGpio == 0)
        {
            //按键处理代码
            KeyFunction(); 
        }
    }
    ClearIrqFlag();
}

代码实现3: 按键GPIO初始化为中断方式,按键按下后产生外部中断事件,进入中断处理函数中,不采用延时消抖,而是开启了一个定时器,定时器设定为10ms后产生中断,定时器中断后再次检测按键GPIO,如果仍然是按下状态则调用按键处理函数。 中断中只是开启了定时器,并未阻塞,主循环也没有阻塞,从性能上最优,但是这种方法用到了一个定时器,占用了处理器资源。

void KeyGpio_IrqHandler(void)
{
    if(KeyGpio == 0)
    {
        //未开启定时情况下进入,防止重复开启定时器
        if(isTimerStart() == 0)
        {
              // 设置定时器时间为10ms
            InitTimer(10);
            // 开启定时器
            StartTimer();
        }
    }
    ClearKeyIrqFlag();
}


void Timer_IrqHandler(void)
{
    StopTimer();
    if(KeyGpio == 0)
    {
        //按键处理代码
        KeyFunction(); 
    }
    ClearTimerIrqFlag();
}

以上示例伪代码采用10ms延时,使用时可根据实际情况调整。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 软件
    +关注

    关注

    69

    文章

    5007

    浏览量

    88010
  • 波形
    +关注

    关注

    3

    文章

    379

    浏览量

    31636
  • 触发器
    +关注

    关注

    14

    文章

    2003

    浏览量

    61312
  • GPIO
    +关注

    关注

    16

    文章

    1216

    浏览量

    52329
  • 按键消抖
    +关注

    关注

    2

    文章

    27

    浏览量

    10485
收藏 人收藏

    相关推荐

    按键硬件电路原理详解

    按键通常的按键所用开关为机械弹性开关,当机械触点断开、闭合时,由于机械触点的弹性作用,一个按键开关在闭合时不会马上稳定地接通,在断开时也
    的头像 发表于 02-02 09:42 9759次阅读
    <b class='flag-5'>按键</b>的<b class='flag-5'>硬件</b><b class='flag-5'>消</b><b class='flag-5'>抖</b>电路原理详解

    单片机的按键与几种按键电路

    按键电路 一、 硬件按键电路控制电路 所示利用RC 积分电路来达成杂波的滤除
    的头像 发表于 12-17 07:45 10.6w次阅读
    单片机的<b class='flag-5'>按键</b><b class='flag-5'>消</b><b class='flag-5'>抖</b>与几种<b class='flag-5'>按键</b>电路

    按键

    请问大家的按键是用什么方法解决的,如普通的按键如何
    发表于 09-26 22:17

    FPGA按键方法

    FPGA按键方法
    发表于 05-01 16:12

    技术分享:明德扬按键的原理和基于fpga的设计

    按键按键可分为硬件
    发表于 08-02 10:38

    按键硬件原理

    按键硬件原理:利用电容充放电特性来实现,因为电容为储能元件。它两端的电压不能出现突变,即有一个充放电的过程下降沿触发电路:上升沿触发电路:什么是RC电路?STM8S手册中IO口的逻
    发表于 12-07 12:47

    有什么方法去实现按键

    怎样用软件即程序来实现按键呢?有什么方法去实现按键
    发表于 12-15 07:25

    介绍独立按键方法

    目录按键介绍按键方法按键检测原理C51例程欢迎加QQ及邮件交流
    发表于 01-14 07:49

    按键延时方法和目的分别是什么

    的地方,开发成本高,操作难度大,可移植性差。软件就相对较好些,新手即可操作,延时,并非
    发表于 01-17 06:26

    按键都有哪些处理方式?

    按键都有哪些处理方式除了硬件电路用软件怎么实
    发表于 11-01 07:06

    基于FPGA的按键电路设计

    采用了VHDL语言编程的设计方法,通过FPGA来实现按键硬件电路。论述了基于计数器、RS触发器和状态机3种
    发表于 12-05 14:13 224次下载

    VHDL—按键

    按键检测需要,一般有硬件软件两种方式。硬件就是加去抖动电路,这样从根本上解决
    发表于 11-11 17:17 2次下载

    使用51单片机实现按键的资料和程序免费下载

    抖动是机械按键存在的现象,是必须要进行处理的。一般处理有两种方式:一种是硬件,另一种是软件
    发表于 07-05 17:41 5次下载
    使用51单片机实现<b class='flag-5'>按键</b><b class='flag-5'>消</b><b class='flag-5'>抖</b>的资料和程序免费下载

    【单片机】按键及原理(硬件软件方法详解)

    浅谈:在设计单片机按键输入的时候,进行按键是防止按键输入被CPU误读多次的必要手段。一、按键
    发表于 11-11 12:06 15次下载
    【单片机】<b class='flag-5'>按键</b><b class='flag-5'>消</b><b class='flag-5'>抖</b>及原理(<b class='flag-5'>硬件</b>和<b class='flag-5'>软件</b><b class='flag-5'>方法</b>详解)

    按键/开关量信号监测实现方案

    关于按键或者开关量信号监测,可以参考本公众号的另外一篇原创文章:按键常用的软
    的头像 发表于 09-19 11:35 1164次阅读