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