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