51单片机按键消抖方式总结

尊重他人劳动成果,请勿转载!!!

电路图如下:
MCU采用89C52单片机,晶振12MHZ。
Proteus仿真电路图
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;
			}
		}
	}
}

按键效果如下:

51单片机按键抖动

2、延时消除抖动

存在如下缺点:

  1. delay()延时函数会占用大量时间;
  2. 需要while循环不断的扫描按键,对单片机运算资源的浪费。
#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;
				}
			}
		}
	}
}

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;
  }	
}

  • 29
    点赞
  • 133
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

karwen2020

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值