一种软件去除键抖动的方法
sbit endebounce=flag^0;
sbit getkey=iag^1;
sbit kprocess=flag^2;
sbit ACC_7=ACC^7;
void main(void);
void debounce(void);
void get_key_value(void);
void main(void)
{
/*初始化*/
kinput=Ktemp=kready=Kstore=0;
endebounce=0;
getkey=0;
kprocess=0;
TMOD=0x01;
TL0=0xe0;
TH0=0xb1;
TR0=1;
ET0=1;
EA=1;
/*……*/
while(1)/*循环*/
{
debounce();/*调用去除键抖动函数*/
get_key_value();/*调用获取键值函数*/
key_processing();/*调用键处理函数*/
/*other functions*/
}
}
void debounce(void)
{
if (endebounce)
{
/*以下是去除键抖动表达式*/
Kreqdy=Ktemp & Kinput Kready & (Ktemp^Kinput);
Ktemp=Kinput;
/*以下表示式用于输出重复键和非重复键*/
Koutput=Kready &(~Kstore Kconst);
Kstore=Kready;
if (Koutput ! =0)/*如果有键按下,置标志准备获取键值*/
getkey=1;
}
}
void get_key_value(void)
{
if(getkey)
{
unsigned char temp;
unsigned char j;
getkey=0;/*清标志*/
for(j=0;j<8;j++)
{
temp=_cror_(koutput,1);/*循环右移寻找按下的键*/
if(_testbit_(ACC_7))/*如果ACC_7=1,找到了按下的键*/
{
key_value=j;/*获得键值*/
j=8;/*找到按下的键就退出循环*/
kprocess=1;/*置标志,准备进行键处理*/
}
else Koutput=temp;/*准备下一次寻找*/
}
}
}
void timer0_interrupt_handler(void) interrupt using1
{
TL0=0xe0;/*加载定时器参数,使晶振频率12MHz时中断周期为20ms*/
TH0=0xb1;
/*键扫描*/
P2_0;/*使能键扫描位*/
Kinput=~P0;/*从P0读入按键信息,反相后保存*/
endebounce;/*置标志位准备去抖动*/
/*其它与定时器有关的语句*/
}