一种软件去除键抖动的方法

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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;/*置标志位准备去抖动*/

/*其它与定时器有关的语句*/

}

相关文档
最新文档