一种软件去除键抖动的方法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
复键输出的系统,Kconst全为1,则Koutput=Kready,所以只用表达式(1)就可以了。如果系统只要求非重复键输出,则Kconst全为0,表达式(3)简化为:
在实际应用中,1个比特表示1个键。C51中的字符变量可以处理8个键,如果系统需要更多的键,可选用整型变量、长整型变量或数组。如果系统的按键数量过多,则会占用较多单片机宝贵的内部寄存器,这是该方法的不足之处。
三.应用程序实例
为了进一步理解上述方法如何在编程中得以实现,在此提供了1个用C51单片机编程语言编制的8个按键的键处理程序,以供参考。该程序在KEIL C51 V6.02/uVsion2 demo编译环境下编译通过。
#include
#include
unsigned char key_value;
unsigned char Kinput;
unsigned char Ktemp;
unsigned char Kstore;
unsigned char Kready;
unsigned char Koutput;
unsigned char bdata flag;
code unsigned char Kconst=0xaa; /*重复键和非重复键格式*/
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;/*置标志位准备去抖动*/
/*其它与定时器有关的语句*/
}