一种软件去除键抖动的方法
0
由图2获得了如下最简逻辑表达式,作为表达式(1)的扩展:
Kstore中是上一次的Kready,所以
Kstroe=Kready(4)
根据表2绘出的卡诺图如图2所示。
表达式(3)是1个包含了表达式(1)的通用逻辑表达式。它用于既有重复键输出也有非重复键输出的系统中。对于只有重复键输出的系统,Kconst全为1,则Koutput=Kready,所以只用表达式(1)就可以了。如果系统只要求非重复键输出,则Kconst全为0,表达式(3)简化为:
在实际应用中,1个比特表示1个键。C51中的字符变量可以处理8个键,如果系统需要更多的键,可选用整型变量、长整型变量或数组。如果系统的按键数量过多,则会占用较多单片机宝贵的内部寄存器,这是该方法的不足之处。
三.应用程序实例
为了进一步理解上述方法如何在编程中得以实现,在此提供了1个用C51单片机编程语言编制的8个按键的键处理程序,以供参考。该程序在KEILC51V6.02/uVsion2demo编译环境下编译通过。
#include<intrins.h>
#include<at89x51.h>
unsignedcharkey_value;
unsignedcharKinput;
unsignedcharKtemp;
unsignedcharKstore;
unsignedcharKready;
unsignedcharKoutput;
unsignedcharbdataflag;
codeunsignedcharKconst=0xaa;/*重复键和非重复键格式*/
sbitendebounce=flag^0;
sbitgetkey=iag^1;
sbitkprocess=flag^2;
sbitACC_7=ACC^7;
voidmain(void);
voiddebounce(void);
voidget_key_value(void);
voidmain(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();/*调用键处理函数*/
/*otherfunctions*/
}
}
voiddebounce(void)
{
if(endebounce)
{
/*以下是去除键抖动表达式*/
Kreqdy=Ktemp&Kinput|Kready&(Ktemp^Kinput);
Ktemp=Kinput;
/*以下表示式用于输出重复键和非重复键*/
Koutput=Kready&(~Kstore|Kconst);
Kstore=Kready;
if(Koutput!=0)/*如果有键按下,置标志准备获取键值*/
getkey=1;
}
《一种软件去除键抖动的方法(第2页)》
本文链接地址:http://www.oyaya.net/fanwen/view/178443.html
由图2获得了如下最简逻辑表达式,作为表达式(1)的扩展:
Kstore中是上一次的Kready,所以
Kstroe=Kready(4)
根据表2绘出的卡诺图如图2所示。
表达式(3)是1个包含了表达式(1)的通用逻辑表达式。它用于既有重复键输出也有非重复键输出的系统中。对于只有重复键输出的系统,Kconst全为1,则Koutput=Kready,所以只用表达式(1)就可以了。如果系统只要求非重复键输出,则Kconst全为0,表达式(3)简化为:
在实际应用中,1个比特表示1个键。C51中的字符变量可以处理8个键,如果系统需要更多的键,可选用整型变量、长整型变量或数组。如果系统的按键数量过多,则会占用较多单片机宝贵的内部寄存器,这是该方法的不足之处。
三.应用程序实例
为了进一步理解上述方法如何在编程中得以实现,在此提供了1个用C51单片机编程语言编制的8个按键的键处理程序,以供参考。该程序在KEILC51V6.02/uVsion2demo编译环境下编译通过。
#include<intrins.h>
#include<at89x51.h>
unsignedcharkey_value;
unsignedcharKinput;
unsignedcharKtemp;
unsignedcharKstore;
unsignedcharKready;
unsignedcharKoutput;
unsignedcharbdataflag;
codeunsignedcharKconst=0xaa;/*重复键和非重复键格式*/
sbitendebounce=flag^0;
sbitgetkey=iag^1;
sbitkprocess=flag^2;
sbitACC_7=ACC^7;
voidmain(void);
voiddebounce(void);
voidget_key_value(void);
voidmain(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();/*调用键处理函数*/
/*otherfunctions*/
}
}
voiddebounce(void)
{
if(endebounce)
{
/*以下是去除键抖动表达式*/
Kreqdy=Ktemp&Kinput|Kready&(Ktemp^Kinput);
Ktemp=Kinput;
/*以下表示式用于输出重复键和非重复键*/
Koutput=Kready&(~Kstore|Kconst);
Kstore=Kready;
if(Koutput!=0)/*如果有键按下,置标志准备获取键值*/
getkey=1;
}
《一种软件去除键抖动的方法(第2页)》