单片机消除按键抖动的三种方法及对比
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
[*] while(1){
[*] if(KeyValue==0){
[*] P2=segment;
[*] count++;
[*] if(count>=10){ //超过0~9,数码管显示回到0
[*] count=0;
[*] }
[*] }
[*] }
[*]}
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;
while(1){
if(KeyValue==0){//按键按下
delay();//延时一段时间
if(KeyValue==0){//重新判断按键状态
P2=segment;
count++;
if(count>=10){
count=0;
}
}
}
}
} 3、使用定时器消抖
原理说明:1次按下+1次抬起构成一个按键动作,当同时检测到这两个动作时,才完成一次按键操作。按下时,将按键值存储为0;抬起时,将按键值存储为1。在前一次的按键值为0的前提下,检测当前按键值是否为1,如果为1,表示此次按键有效,否则此次按键无效。
缺点:会占用一个定时
#include <REGX52.H>
#include <intrins.h>
sbit KeyValue=P3^7;
bitKeyStatus=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;
/**************开启中断**************************/
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;
}
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;
}
} 延时消抖的问题就在于延长多长时间不好掌握啊 还有一种就是短时间内读取多次,然后取多 感觉通过软件消抖远不如通过硬件消抖简单 如果是使用中断模式然后还不消抖的话 那程序就要乱套了 软件消抖如何避免丢到正常的按键操作呢 heimaojingzhang 发表于 2023-5-11 17:19
软件消抖如何避免丢到正常的按键操作呢
感觉这个不好操作,只能是根据经验来了丢了也就丢了吧 heimaojingzhang 发表于 2023-5-11 17:19
软件消抖如何避免丢到正常的按键操作呢
可以使用扫描的模式,例如每隔1ms扫描一次,连续读取到10~20次算有效按键. 现在都是硬件防抖的,还靠软件来算? 硬件消抖最安全 软件消抖其实还是挺实用的 楼主说的是软件消除策略 硬件设计才是关键的 比较实用的软件消抖 通过使用电路元件(如电阻、电容、二极管或RS触发器等)来消除按键抖动。 常用的硬件去抖电路包括电阻-电容(RC)滤波电路和施密特触发器。 软件消抖是通过编写程序来消除按键抖动。 软件消抖易于实现,且灵活性强