键的闭合与否,反应在口线的电平上,即口线的电平是呈现高电平还是低电平状态。因此,可以通过口线电平高、低状态的检测,来确认按键是否按下。
但如果在触点抖动期间检测按键的通与断状态,可能导致判断出错,即按键一次按下或释放被错误地认为是多次操作,这种情况是不允许出现的。为了克服按键触点机械抖动所致的检测误判,确保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++)
{
}
}
}