专注电子技术学习与研究
当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章

关于单片机独立按键的详解

作者:佚名   来源:本站原创   点击数:  更新时间:2013年12月02日   【字体:

   键的闭合与否,反应在口线的电平上,即口线的电平是呈现高电平还是低电平状态。因此,可以通过口线电平高、低状态的检测,来确认按键是否按下。

但如果在触点抖动期间检测按键的通与断状态,可能导致判断出错,即按键一次按下或释放被错误地认为是多次操作,这种情况是不允许出现的。为了克服按键触点机械抖动所致的检测误判,确保CPU对一次按键动作只确认一次按键,必须采取去抖动措施。



 

 

消除按键抖动的措施:

    具体措施可从硬件、软件两方面予以考虑。在键数较少时,可采用硬件去抖,而当键数较多时,采用软件去抖。

软件措施:

在第一次检测到有键按下时,执行一段延时10ms的子程序,之后,

再次检测该键的电平状态,如果该键电平仍保持闭合状态电平,

则确认为真正有键按下。否则,认为无键按下;

同理,在检测到该键释放后,也应采用相同的步骤进行确认,
从而可消除抖动的影响。

code:
 
/*独立按键,采用共阳极数码管*/
#include<reg52.h>
#include<intrins.h>
#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++)
{
}
}
}

 

关闭窗口

相关文章