电子常识
通常按键所用的开关都是机械弹性开关,当机械触点断开、闭合时,由于机械触点的弹性作用,一个按键开关在闭合时不会马上就稳定的接通,在断开时也不会一下子彻底断开,而是在闭合和断开的瞬间伴随了一连串的抖动,如图1所示
图1按键抖动状态图
按键稳定闭合时间长短是由操作人员决定的,通常都会在100ms以上,刻意快速按的话能达到40-50ms左右,很难再低了。抖动时间是由按键的机械特性决定的,一般都会在10ms以内,为了确保程序对按键的一次闭合或者一次断开只响应一次,必须进行按键的消抖处理。当检测到按键状态变化时,不是立即去响应动作,而是先等待闭合或断开稳定后再进行处理。按键消抖可分为硬件消抖和软件消抖。
硬件消抖:
利用电容的充放电特性来对抖动过程中产生的电压毛刺进行平滑处理,从而实现消抖。但实际应用中,这种方式的效果往往不是很好,而且还增加了成本和电路复杂度,所以实际中使用的并不多。如图2所示
图2硬件电容消抖
软件实现消抖:
最简单的消抖原理,就是当检测到按键状态变化后,先等待一个10ms左右的延时时间,让抖动消失后再进行一次按键状态检测,如果与刚才检测到的状态相同,就可以确认按键已经稳定的动作了。
#include 《stc12c5a.h》
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
sbit x0=P3^0;
sbit x1=P3^1;
sbit x2=P3^2;
sbit x3=P3^3;
sbit y0=P1^0;
sbit y1=P1^1;
sbit y2=P1^2;
sbit y3=P1^3;
delay(ulong a1)
{
ulong a2;
for(a2=0;a2《a1;a2++);
}
main()
{
P2=0x00;
while(1)
{
if(x0==0)
{
//按下相应的按键,数码管显示相应的码值
delay(1000);
if(x0==0)
{
P0=0x06;//数码管显示“1”
}
}
if(x1==0)
{
//按下相应的按键,数码管显示相应的码值
delay(1000);//去抖动
if(x1==0) //检测按键确实按下,进行按键处理
{
P0=0x5B;//数码管显示“2”
//这里可以添加按键按下所需要的操作,如数据加减乘除,蜂鸣器等设备开关
}
}
if(x2==0)
{ //按下相应的按键,数码管显示相应的码值
delay(1000);
if(x2==0)
{
P0=0x4F;//数码管显示“3”
}
}
if(x3==0)
{ //按下相应的按键,数码管显示相应的码值
delay(1000);
if(x3==0)
{
P0=0x66;//数码管显示“4”
}
}
}
}
全部0条评论
快来发表一下你的评论吧 !