PC机键盘防抖动技术在嵌入式系统中的移植应用

更新时间:2024-05-08 15:16:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

PC机键盘防抖动技术在嵌入式系统中的移植应用

李文炜

摘 要:文章介绍了机械键盘的结构和通常嵌入式系统所采用的二种软件消除抖动的方法;通过对

PC机键盘自动键功能的介绍和程序流程分析,举例说明了PC机键盘防抖动技术在嵌入式系统中的移植应

用。

关键词:软件;消除抖动;自动键;应用

1﹑引言

在嵌入式单片机应用系统中,键盘是人机接口,人机对话的输入设备,控制人员借助键盘可向系统设置参数,发出控制指令等。但是在单片机应用中的键盘不同于通用PC机的键盘,它通常是由设计人员自行设计的。在单片机设计中常用的输入设备——轻触按键键盘单元电路,结构图如图1.1a所示:是由二个电极和一个弹簧金属片构成。当金属弹簧片上的按键K按下时,两个电极A和B被连通。但是实际情况中并非如此的简单,单片机的运行速度(即便是采用低速晶振)相对于人的手动动作也是非常迅速的,因此如何保证嵌入式系统的可靠性和稳定性,设计人员就必须充分考虑按下按键的前后电压抖动毛刺[1]。图1.1a中的按键的A端接地,B端接上拉电阻,则平时按键的B端为高电平,当按键按下时为低电平,

图1.1 a 轻触按键键盘单元电路结构图 图1.1 b 按键抖动示意图

松开后又是高电平,这仅仅只是理论值;而实际B端的情况如图1.1b所示。如果将按键的 B端信号送到嵌入式系统的MCU,系统则会误认为有几个低电平信号送过来,认为按了几次按键。因为MCU认为低电平是按键按下,而抖动过程有很多低电平,同时抖动过程还有不短的时间,一般的机

械按键抖动过程在10ms左右。

2﹑通用按键消抖方法

机械按键的按下前后的电压抖动毛刺被称为连击现象,连击现象对于数字调整键是有利的,但是对其他功能键是有害的,嵌入式系统对于外部输入设备要求有很高的可靠性和稳定性,因此嵌入式系统是绝对不允许连击现象产生的[2]。单片机系统常用的清除抖动的方法有三种:使用R-S触发器构成消除抖动开关;使用电阻和电容构成积分器;使用软件延时消除抖动。前二种方法属于硬件消抖,嵌入式系统通常要

求硬件元器件尽可能的少,因此在实际嵌入式系统中通常采用“软件消除抖动”。

3﹑常用嵌入式系统按键输入软件消抖方法

在嵌入式系统程序设计中,通常采用以下二种方法实现软件消抖: ①利用延时函数消除抖动过程,如例3.1: 图3.1 四键盘输入接口示意图

void Delay(unsigned int time)

{

unsigned int i;

for(i=0; i

}

② 使用定时器中断查键盘,利用定时器的定时时间取代延时消除抖动细节。图3.1所示为以TI

公司的16位超低功耗单片机MSP430F149位微处理器的四键盘输入接口示意图,例3.2则是利用定时器

的定时时间消除抖动的示例:

void main(void)

{ WDTCTL=WDTPW+WDTHOLD; //关闭看门狗定时器 BCSCTL2 =0x88; //采用外接8MHZ作为主频

do { IFG1&=~OFIFG; } while(OFIFG&IFG1);

TACTL = TASSEL1 + TACLR +ID1 +ID0 ; //TIMER-A的设置时钟来自1/8MCLK

CCTL2 = CCIE; CCR2 = 10000; // 10ms

TACTL |= MC1;

_EINT(); //开全局中断

for(;;) { ………… if(key_cycle==0)

{ key_cycle=10; //控制键盘防抖动延时时间 keyvalue==keydetect(); //检测是否有键按下,并返回键值

}

keyprocess(keyvalue); //按键处理 keyvalue=0; //随时清除案件标志位

}

}

interrupt[TIMERA1_VECTOR] void Timer_A1 (void)//中断函数

{ switch( TAIV )

{ case 4: CCR2+=10000; //产生10mS定时中断

if(key_cycle > 0)

key_cycle --; //定时循环

break; default: break; }

} int keydetect(void)

{ keyvalue=((~(P1IN))&0x0F); //直接将端口取得的值付给keyvalue

return(keyvalue);} void keyprocess(uint keyvalue)

{ switch(keyvalue)

{

case 0x01: key_1_do(); break; //1号键功能 case 0x02: key_2_do(); break; //2号键功能 case 0x04: key_3_do(); break; //3号键功能 case 0x08: key_4_do(); break; //4号键功能

default: break;

} }

4﹑PC机键盘防抖动技术在嵌入式系统中的移植应用

4.1 现象描述﹑程序流程分析

作为个人计算机PC机的输入设备——标准101键盘,也是由键盘内部自带的键盘控制微处理器不断扫描键盘,读出键盘按下值,由键盘向系统发出扫描码,键盘BIOS程序决定发到操作系统的字符。PC机内部的键盘接口是一个专门的I/O端口,是一个内置于集成芯片的带有自己专用微处理器的完整的子

系统[3]。

用户会发现这样一个现象:无论用户在使用何种软件时,在使用键盘作为输入设备进行指令或者是字符输入的时候,按下一个按键并保持按住该按键一段时间,比如说按下“W”键,稍过一会儿,屏幕显示才会出现第一个字符“W”;按住W按键不动,仍要稍过一会儿大约为半秒钟,屏幕显示才会出现第二个“W”字符;仍然按住W按键不动,屏幕就会飞快的连续显示第三个,第四个,第五个,……“W”字符,直到松

开W键为止,才停止显示。 图 4.1 程序流程结构示意图

这种现象在PC机中称为键的重复性能,即称为自动键(typematic)[3]。该功能中的键盘防抖动技术可以很好的移植到嵌入式系统中来。如图4.1所示,通常的程序都是按照主函数(main函数)的顺序不断的循环执行,即先从main函数的第一行执行起,一步一步的执行下去完成过程1,再如过程2所示返回到主函数的起始行再次执行,如此反复循环。PC机的自动键功能实现关键是采用了“在函数中设立标志位一和标志位二”,将过程1一分为三,采用设立标志位的办法,利用函数自身运行的时间取代了通常嵌入式系统中的消除抖动延时时间。具体过程如下:从函数的起始行起执行过程3;设置标志位一,函数运行到此标志位时,检测到有按键按下,由于标志位的设置,强制执行过程4,不理会外部输入信号;执行完主函数由过程5返回再从函数的起始行起执行过程6,再次执行到标志位一处仍然检测到有外部输入信号则运行过程7至标志位二;从标志位二开始的过程8就是读键盘输入值的过程;最终再由过程9返回起始行;如果再次执行到标志位一处检测发现没有外部输入信号则说明刚才的输入信号是干扰信号,则由过程4,

过程5返回主函数起始行。

自动键功能在WINDOWS用户中可以由用户人为设置,自动键的速度以每秒字符数来衡量,这一设置通常在缺省值时是每秒15个字符,“自动键额定延时”在缺省值情况下是半秒(500毫秒)。

4.2 在嵌入式系统中的移植应用

PC机键盘防抖动技术在嵌入式系统中的移植应用,关键是在嵌入式系统中的主函数中的按键处理子函数中设立标志位一和标志位二,利用标志位一强制程序不理会第一次接收到的外部输入信号,令程序走完过程4,过程5以后,再次循环时才根据标志位一是否检测到有外部输入判断是否运行至标志位二的外部按键输入相应处理子程序。也就是利用不带按键处理子程序的主函数部分运行的时间取代通常消除抖动

的延时函数和定时器的定时时间。

PC机键盘防抖动技术在嵌入式系统中的移植应用实例,如下例所示:

5﹑综述

PC机键盘防抖动技术在嵌入式系统中的移植应用,是一种很有效的消除机械按键抖动的方法,在嵌入式系统中修改参数时比通常的采用延时函数和定时器的定时消抖都要节约很多时间。

参考文献

[1]魏小龙.《MSP430系列单片机接口技术及系统设计实例》[M] 北京航空航天大学出版社 2002年

11月

[2]周航慈.《单片机应用程序设计技术》 [M] 北京航空航天大学出版社 1991年8月

[3]Winn L.Rosch 《HARDWARE BIBLE(第四版)微机硬件使用与维护宝典》 [M] 西蒙与舒斯特国际

出版公司&北京希望电子出版社 1999年6月

本文来源:https://www.bwwdw.com/article/6awg.html

Top