打印
[开发资料]

单片机消除按键抖动的三种方法及对比

[复制链接]
2797|75
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
laocuo1142|  楼主 | 2023-4-23 14:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

1、没有消除抖动的原始代码:

  • #include <REGX52.H>

  • #include <intrins.h>

  • sbit KeyValue=P3^7;

  • unsigned char code segment[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

  • //定义数码管显示0~9

  • void main(){

  •         static char count=1;

  •         P2=segment[0]; //开始运行显示0

  •         while(1){

  •                 if(KeyValue==0){

  •                         P2=segment[count];

  •                         count++;

  •                         if(count>=10){   //超过0~9,数码管显示回到0

  •                                 count=0;

  •                         }

  •                 }

  •         }

  • }



使用特权

评论回复
沙发
laocuo1142|  楼主 | 2023-4-23 14:27 | 只看该作者
2、延时消除抖动

存在如下缺点:

delay()延时函数会占用大量时间;

#include <REGX52.H>

#include <intrins.h>

sbit KeyValue=P3^7;

unsigned char code segment[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

void delay(){ //延时程序

        unsigned int i=20500;

        while(i--);

}

void main(){

        static char count=1;

        P2=segment[0];

        while(1){

                if(KeyValue==0){//按键按下

                        delay();//延时一段时间

                        if(KeyValue==0){//重新判断按键状态

                                P2=segment[count];

                                count++;

                                if(count>=10){

                                count=0;

                                }

                        }

                }

        }

}

使用特权

评论回复
板凳
laocuo1142|  楼主 | 2023-4-23 14:27 | 只看该作者
3、使用定时器消抖

原理说明:1次按下+1次抬起构成一个按键动作,当同时检测到这两个动作时,才完成一次按键操作。按下时,将按键值存储为0;抬起时,将按键值存储为1。在前一次的按键值为0的前提下,检测当前按键值是否为1,如果为1,表示此次按键有效,否则此次按键无效。

缺点:会占用一个定时

#include <REGX52.H>

#include <intrins.h>

sbit KeyValue=P3^7;

bit  KeyStatus=1;

unsigned char code segment[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};



void main(){

        bit KeySave=1;

        unsigned char count=0;

        P2=segment[0];

        /**************开启中断**************************/

        EA=1;

        TMOD=0x01;

        TH0=0xF8;

        TL0=0xCD;

        ET0=1;

        TR0=1;

        while(1){

                if(KeyStatus!=KeySave){//检测按键值是否改变,初始时按键值为1,在此检测按键值是否变为0,为0则继续

                        if(KeySave==0){//如果前一次的按键值为0,说明本次按键抬起,本次按键有效;否则为按键按下操作,跳转到最后一步,将按键值取反

                                count++;//对按键值+1

                                if (count>=10){

                                        count=0;

                                }

                                P2=segment[count];

                        }

                        KeySave=~KeySave;

                }

        }

}

void InterruptTimer0() interrupt 1 {

        static unsigned KeyBuff=0xff;

        TH0=0xF8;

        TL0=0xCD;

        KeyBuff=(KeyBuff<<1)|KeyValue;

        switch(KeyBuff){

          case 0xff:

                        KeyStatus=1;

                  break;

          case 0x00:

                        KeyStatus=0;

                  break;

          default:

                  break;

  }        

}

使用特权

评论回复
地板
晓伍| | 2023-5-11 15:44 | 只看该作者
延时消抖的问题就在于延长多长时间不好掌握啊

使用特权

评论回复
5
八层楼| | 2023-5-11 16:04 | 只看该作者
还有一种就是短时间内读取多次,然后取多

使用特权

评论回复
6
观海| | 2023-5-11 16:26 | 只看该作者
感觉通过软件消抖远不如通过硬件消抖简单

使用特权

评论回复
7
guanjiaer| | 2023-5-11 16:42 | 只看该作者
如果是使用中断模式然后还不消抖的话 那程序就要乱套了

使用特权

评论回复
8
heimaojingzhang| | 2023-5-11 17:19 | 只看该作者
软件消抖如何避免丢到正常的按键操作呢

使用特权

评论回复
9
tpgf| | 2023-5-11 17:55 | 只看该作者
heimaojingzhang 发表于 2023-5-11 17:19
软件消抖如何避免丢到正常的按键操作呢

感觉这个不好操作,只能是根据经验来了  丢了也就丢了吧

使用特权

评论回复
10
fcccc| | 2023-5-11 22:02 | 只看该作者
heimaojingzhang 发表于 2023-5-11 17:19
软件消抖如何避免丢到正常的按键操作呢

可以使用扫描的模式,例如每隔1ms扫描一次,连续读取到10~20次算有效按键.

使用特权

评论回复
11
E=MC2U| | 2023-5-15 22:23 | 只看该作者
现在都是硬件防抖的,还靠软件来算?

使用特权

评论回复
12
AdaMaYun| | 2024-1-27 16:18 | 只看该作者
硬件消抖最安全

使用特权

评论回复
13
OKAKAKO| | 2024-1-27 16:22 | 只看该作者
软件消抖其实还是挺实用的

使用特权

评论回复
14
LOVEEVER| | 2024-1-27 16:50 | 只看该作者
楼主说的是软件消除策略

使用特权

评论回复
15
小夏天的大西瓜| | 2024-1-27 20:57 | 只看该作者
硬件设计才是关键的

使用特权

评论回复
评论
forgot 2024-1-31 17:31 回复TA
硬件很关键 
16
forgot| | 2024-1-31 17:31 | 只看该作者
比较实用的软件消抖

使用特权

评论回复
17
gygp| | 2024-2-3 16:37 | 只看该作者
通过使用电路元件(如电阻、电容、二极管或RS触发器等)来消除按键抖动。

使用特权

评论回复
18
febgxu| | 2024-2-3 19:35 | 只看该作者
常用的硬件去抖电路包括电阻-电容(RC)滤波电路和施密特触发器。

使用特权

评论回复
19
ingramward| | 2024-2-3 20:04 | 只看该作者
软件消抖是通过编写程序来消除按键抖动。

使用特权

评论回复
20
adolphcocker| | 2024-2-3 22:03 | 只看该作者
软件消抖易于实现,且灵活性强              

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1095

主题

4661

帖子

11

粉丝