您的位置: turnitin查重官网> 工程 >> 电气工程 >> 船舶电气毕业 >基于单片机快速按键识别方法

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

收藏本文 2024-03-20 点赞:18119 浏览:81080 作者:网友投稿原创标记本站原创

摘要:在使用单片机实现的智能控制系统中,快速、可靠的按键识别控制非常关键,一定程度上决定了整个系统的高效运行。本文在分析传统的按键扫描或识别方法的基础上,对比各种方法的优缺点,重点讨论一种高效的按键识别方法,并给出该方法对应的程序设计思路,它可快速识别对按键的一次响应,解决多次冗余响应的缺陷。
关键词:单片机按键识别一次响应
1007-9416(2012)08-0175-02
1、引言
在以单片机为核心控制的应用系统中,键盘按键能实现向单片机输入数据、传送命令等功能,是单片机应用系统中人工干预单片机的主要手段。而单片机对按键闭合与否的判断,主要是通过其引脚上的电压高低进行的。本文以51单片机为例说明,所述键盘按键的硬件电路设计也非常简单——轻触开关的一端接地,另一端连接单片机引脚,该引脚同时接10K上拉电阻。很明显,单片机引脚呈现高电平表示按键开关断开;反之,引脚电压呈现低电平表示按键开关闭合。因此,对单片机的按键识别只要通过对其引脚电平的高低状态的检测,即可确认按键按下与否。
众所周知,按键为机械弹性开关,加之按键按下或抬起瞬间均会产生抖动现象,因此消除按键抖动也是整个系统的关键。为更突出本文的讨论重点,这里不再重点讨论按键去抖的方法。

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”表示按键被按下。以下为带标志位的按键识别的程序设计思路,这里检测定标志位为key_mark,初始值为0。
(1)初始化按键;
(2)if(按下按键 &&!key_mark){
延迟10ms去抖;
key_mark = 1;//将状态“1”赋予标志位。表示按键已按下
if(按键确实按下){事件处理,退出}
}elseif(未按按键){
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语言中的逻辑运算方法,同样快速有效地解决了按键识别的程序设计问题。该方法在初始化设置后,只需要使用一句异或运算语句,两句赋值语句,即可快速进行按键识别。
下面给出该快速按键识别方法的思路。先初始化三个标志位:key_now,key_old,key_change。其中,key_now表示当前读取到的按键电平;key_old表示之前一次读取到的按键电平;key_change表示按键被按下后出现的变化情况,即当key_change=0,表示按键处于断开状态,key_change=1,表示按键处于闭合状态。这三个标志位的初始化值均为“1”。现在给出该方法的程序设计思路。
(1)初始化按键
(2)key_now = P

1.0;//读取当前按键电平(检测定使用单片机P0引脚连接按键)

key_change = (key_now ^ key_old) ^ key_change;
key_old = key_now;
根据上述方法,当未按下按键时,与按键连接的引脚P1.0为高电平,则key_now也为高电平,key_change与(key_now ^ key_old)异或运算后结果为“0”,并重新赋值给key_change,标志着当前没有按键按下;当按键被按下,引脚P1.0为低电平,key_change与(key_now ^ key_old)异或运算后结果为“1”,同样赋值给key_change,标志着当前按键已按下;若此时按键保持低电平,即按键未抬起释放,则key_now仍为低电平,key_change的异或运算结果仍为“0”;只有当按键被抬起时,引脚P1.0恢复为高电平,对应的key_change异或为“1”。总之,只要有按键按下,key_change对应的位就为“1”,按键弹起后key_change对应的位为“0”,表示按键未被按下。这大大简化了按键的识别,不需要再去进行其他判断,程序设计也简洁明了。
4、结语
本文首先介绍了键盘按键识别的工作原理,并以51单片机为例探讨基于单片机的键盘按键识别方法,这些方法同样适用于R、PIC、凌阳单片机等应用的程序设计中。围绕如何进行快速有效的键盘按键识别,本文深入研究了传统的键盘识别方法、带标志位的键盘识别方法,以及一种通过异或运算得到的快速键盘按键识别方法。详细比较各种方法,并采用单片机开发板(外部12M晶振,编程软件为Keil uVision2)试验[4],结果表明上述三种键盘识别程序思路均可,

源于:论文的标准格式www.udooo.com

而后者只需要使用三句C语言语句,即可实现键盘按键识别,是一种可行有效的方法。
参考文献
林伸茂编著,管继斌,白雁钧改编.8051单片机彻底研究基础篇.人民邮电出版社,200

4.05:105-108.

张毅刚,彭喜元,姜守达,乔立岩编著.新编MCS-51单片机应用设计.哈尔滨工业大学出版社,200

3.07:157-164.

[3]王春武,李岩,孟祥英,尹冬梅,C51中对按键的处理方法.吉林师范大学学报,200

7.11:86-8

[4]孙鉴.KELL u ision2 环境下仿真单片机程序.计算机辅助工程.2006.02:74-77.

copyright 2003-2024 Copyright©2020 Powered by 网络信息技术有限公司 备案号: 粤2017400971号