无延时按键程序.doc

无延时按键程序.doc

ID:59355300

大小:103.50 KB

页数:12页

时间:2020-09-04

无延时按键程序.doc_第1页
无延时按键程序.doc_第2页
无延时按键程序.doc_第3页
无延时按键程序.doc_第4页
无延时按键程序.doc_第5页
资源描述:

《无延时按键程序.doc》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、在使用单片机搭建有人机交互的系统时需要用到键盘,因为单片机工作时间都是纳秒与毫秒级别,但是我们人体的反应时间最少要0.2秒,之间差距很大,现实过程中也会不小心碰到按键,正常的按下按键应该是持续数十秒的稳定。一、按键电路常用的非编码键盘,每个在使用单片机搭建有人机交互的系统时需要用到键盘,因为单片机工作时间都是纳秒与毫秒级别,但是我们人体的反应时间最少要0.2秒,之间差距很大,现实过程中也会不小心碰到按键,正常的按下按键应该是持续数十秒的稳定。一、按键电路    常用的非编码键盘,每个键都是一个常

2、开开关电路。   计数器输入脉冲最好不要直接接普通的按键开关,因为记数器的记数速度非常快,按键、触点等接触时会有多次接通和断开的现象。我们感觉不到,可是记数器却都记录了下来。例如,虽然只按了1下,记数器可能记了3下。因此,使用按键的记数电路都会增加单稳态电路避免记数错误。二、按键消抖   通常的按键所用开关为机械弹性开关,当机械触点断开、闭合时,电压信号小型如下图。由于机械触点的弹性作用,一个按键开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开。因而在闭合及断开的瞬间均伴随有一连串的抖动

3、,如下图。抖动时间的长短由按键的机械特性决定,一般为5ms~10ms。这是一个很重要的时间参数,在很多场合都要用到。   按键稳定闭合时间的长短则是由操作人员的按键动作决定的,一般为零点几秒至数秒。键抖动会引起一次按键被误读多次。为确保CPU对键的一次闭合仅作一次处理,必须去除键抖动。在键闭合稳定时读取键的状态,并且必须判别到键释放稳定后再作处理。按键的抖动,可用硬件或软件两种方法。三、硬件消抖   在键数较少时可用硬件方法消除键抖动。下图所示的RS触发器为常用的硬件去抖。消抖电路如下   图中

4、两个“与非”门构成一个RS触发器。当按键未按下时,输出为1;当键按下时,输出为0。此时即使用按键的机械性能,使按键因弹性抖动而产生瞬时断开(抖动跳开B),中要按键不返回原始状态A,双稳态电路的状态不改变,输出保持为0,不会产生抖动的波形。也就是说,即使B点的电压波形是抖动的,但经双稳态电路之后,其输出为正规的矩形波。这一点通过分析RS触发器的工作过程很容易得到验证。   利用电容的放电延时,采用并联电容法,也可以实现硬件消抖:消抖电路如下四、软件延时消抖   如果按键较多,常用软件方法去抖,即检

5、测出键闭合后执行一个延时程序,产生5ms~10ms的延时,让前沿抖动消失后再一次检测键的状态,如果仍保持闭合状态电平,则确认为真正有键按下。当检测到按键释放后,也要给5ms~10ms的延时,待后沿抖动消失后才能转入该键的处理程序。    五、无延时的软件消抖/*********************************************名称:键盘扫描子函数功能:在按键稳定期内判断键值,并返回键值*********************************************

6、*/ucharkeyscan(void){staticcharkey_state=0;   staticcharkey_value=0;ucharkey_press,key_return=0;key_press=turn_left&turn_right;    //读按键I/O电平            switch(key_state){  case0:    //按键初始态   if(key_press==0)key_state=1;//键被按下,但需要确认是否是干扰   break;  c

7、ase1:    //按键确认态   if(key_press==0)//如有键按下则不是干扰,判断键值   {                                 if(turn_left==0)              //判断是哪一个按键被按下                key_value=1;      //按键较多时可采用switch选择结构            elseif(turn_right==0)                key_value=2;   

8、         else                key_value=0;       key_state=2;//状态转换到键释放态   }   else    key_state=0;//按键已抬起,属于干扰,转换到按键初始态   break;  case2:   if(key_press==1)   {      key_return=key_value;//按键释放后再输出键值,如果按下键就输出则可省略key_value      key_value=0;      key_st

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。