键的闭合与否,反应在口线的电平上,即口线的电平是呈现高电平仍是低电平状况。因而,能够经过口线电平高、低状况的检测,来承认按键是否按下。
但假如在触点颤动期间检测按键的通与断状况,或许导致判别犯错,即按键一次按下或开释被过错地以为是屡次操作,这种状况是不允许呈现的。为了战胜按键触点机械颤动所造成的的检测误判,保证CPU对一次按键动作只承认一次按键,有必要采取去颤动办法。
消除按键颤动的办法:
具体办法可从硬件、软件两方面予以考虑。在键数较少时,可选用硬件去抖,而当键数较多时,选用软件去抖。
软件办法:
在第一次检测到有键按下时,履行一段延时10ms的子程序,之后,
再次检测该键的电平状况,假如该键电平仍坚持闭合状况电平,
则承以为真实有键按下。不然,以为无键按下;
同理,在检测到该键开释后,也应选用相同的过程进行承认,
然后可消除颤动的影响。
code:
/*独立按键,选用共阳极数码管*/
#include
#include
#define uint unsigned int
#define uchar unsigned char
sbit key1=P2^3;
sbit ledA=P1^0;
uchar num;
void delay(uint z);
uchar code dutable[]={
0xc0,0xf9,0xa4,0xb0,0x99,
0x92,0x82,0xf8,0x80,0x90};//段选0~9
void main()
{
while(1)
{
if(key1==0)
{
delay(10);//去按下颤动延时
if(key1==0)
{
ledA=0;
num++;
if(num==10)
{
num=0;
}
}
while(!key1);//等候按键开释
delay(10);//去开释颤动延时
while(!key1);//确认现已开释
}
else
{
ledA=1;
}
P0=dutable[num];
}
}
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x–)
{
for(y=0;y<=110;y++)
{
}
}
}