基于单片机快速按键识别方法.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
基于单片机快速按键识别方法

基于单片机快速按键识别方法摘要:在使用单片机实现的智能控制系统中,快速、可靠的按键识别控制非常关键,一定程度上决定了整个系统的高效运行。本文在分析传统的按键扫描或识别方法的基础上,对比各种方法的优缺点,重点讨论一种高效的按键识别方法,并给出该方法对应的程序设计思路,它可快速识别对按键的一次响应,解决多次冗余响应的缺陷。 关键词:单片机 按键识别 一次响应 中图分类号:TP368.12 文献标识码:A 文章编号:1007-9416(2012)08-0175-02 1、引言 在以单片机为核心控制的应用系统中,键盘按键能实现向单片机输入数据、传送命令等功能,是单片机应用系统中人工干预单片机的主要手段。而单片机对按键闭合与否的判断,主要是通过其引脚上的电压高低进行的。本文以51单片机为例说明,所述键盘按键的硬件电路设计也非常简单——轻触开关的一端接地,另一端连接单片机引脚,该引脚同时接10K上拉电阻[1]。很明显,单片机引脚呈现高电平表示按键开关断开;反之,引脚电压呈现低电平表示按键开关闭合。因此,对单片机的按键识别只要通过对其引脚电平的高低状态的检测,即可确认按键按下与否[2]。 众所周知,按键为机械弹性开关,加之按键按下或抬起瞬间均会产生抖动现象,因此消除按键抖动也是整个系统的关键。为更突出本文的讨论重点,这里不再重点讨论按键去抖的方法。 2、传统按键识别方法 2.1 简单的按键识别 该按键识别方法虽然简单,但当按下按键的瞬间,却可能让系统多次循环处理同一按键事件,造成CPU资源的浪费。以下为该方法的程序设计思路,下述中的“按键确实按下”表示延迟10ms后,按键仍处于按下状态。 (1)初始化按键; (2)if(按下按键){ 延迟10ms去抖; if(按键确实按下){事件处理,退出} }else {未按按键,退出} 单片机程序可能是一个循环执行的过程,当按键按下闭合,程序进入按键事件,执行完该事件,若按键仍未被抬起,则程序循环又再一次进入同样的按键事件执行。事实上,如果采用12MHZ外部晶振,单片机处理器执行一个指令通常只要2个机器周期的时间,也即4us。如此短暂的时间,当我们松开按键时,程序可能早已经循环执行很多次按键事件。因此该按键识别的程序思路并不合适。为了不重复执行同一个按键事件,可改进为如下所述的按键识别的方法: (1)初始化按键; (2)if(按下按键){ 延迟10ms去抖; if(按键确实按下){事件处理,等待按键释放,退出} }else {未按按键,退出} 此方法虽然可识别按键释放,即实现每一次按键,系统只会调用一次按键处理事件。但若按键一直不释放,则程序只可在此原地踏步等待,浪费系统执行时间,CPU每个时钟周期均做无用功。解决方法是,在识别到第一次按键,并执行完按键事件后,将忽略后续的按键状态,从而实现对按键的一次响应,解决多次冗余响应的缺陷。 2.2 带标志的按键识别 为了解决多次冗余响应的缺陷,可设置按键按下与释放两种状态的标志,在程序执行过程中,检测标志位内容,识别按键的状态。根据该思路,可在初始化按键时,设置按键按下与否的标志位,并赋予“0”与“1”两种状态。标志状态为“0”表示按键无效,为“1”表示按键被按下。以下为带标志位的按键识别的程序设计思路[2],这里假定标志位为key_mark,初始值为0。 (1)初始化按键; (2)if(按下按键 !key_mark){ 延迟10ms去抖; key_mark = 1; //将状态“1”赋予标志位。表示按键已按下 if(按键确实按下){事件处理,退出} }else if(未按按键){ key_mark = 0,退出} 该方法可行有效,其中标志位key_mark起了至关重要的作用。只有当按键按下,key_mark=0,且延迟10ms去抖后,程序才会确认是否真的有按键被按下。此时马上对key_mark=1,使得下一次查询key_mark标志时,得知按键正处于按下状态。如此,不仅使得按键被按下时可被准确检测到,还可以在按键还没被抬起释放时,不重复响应同一个按键事件。由于此时标志位key_mark的值被赋值为“1”,因此if(按下按键 !key_mark)将不再成立,直到按键抬起,才重新赋值key_mark为“0”,实现了每一次按键,系统只会调用一次按键处理事件。 3、快速按键识别方法 对于程序员来说,实现同样功能的程序,简洁、高效对设计非常关键。本文讨论的快速按键识别方法,尝试使用单片机C语言中的逻辑运算方法,同样快速有效地解决了按键识别的程序设计问题。该方法在初始化设置后,只需要使用一句异或运算语句,两句赋值语句,即可快速进行按键识别。

文档评论(0)

docman126 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

版权声明书
用户编号:7042123103000003

1亿VIP精品文档

相关文档