- 1、本文档共6页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
状态转移的独立按键程序.
基于状态转移的独立按键程序设计本章所描述的按键程序要达到的目的:检测按键按下,短按,长按,释放。即通过按键的返回值我们可以获取到如下的信息:按键按下(短按),按键长按,按键连发,按键释放。不知道大家还记得小时候玩过的电子钟没有,就是外形类似于CALL 机(CALL )的那种,有一个小液晶屏,还有四个按键,功能是时钟,闹钟以及秒表。在调整时间的时候,短按+键每次调整值加一,长按的时候调整值连续增加。譬如,用一个智能充电器给你的手机电池充电,刚开始,它是处于快速充电状态,随着电量的增加,电压的升高,当达到规定的电压时候,它会转换到恒压充电。总而言之,细心观察,你会发现生活中的总总都可以归结为一个个的状态,而状态的变换或者转移总是由某些条件引起同时伴随着一些动作的发生。我们的按键亦遵循同样的规律,下面让我们来简单的描绘一下它的状态流程转移图。下面对上面的流程图进行简要的分析。首先按键程序进入初始状态S1,在这个状态下,检测按键是否按下,如果有按下,则进入按键消抖状态2,在下一次执行按键程序时候,直接由按键消抖状态进入按键按下状态3,在此状态下检测按键是否按下,如果没有按键按下,则返回初始状态S1,如果有则可以返回键值,同时进入长按状态S4,在长按状态下每次进入按键程序时候对按键时间计数,当计数值超过设定阈值时候,则表明长按事件发生,同时进入按键连发状态S5。如果按键键值为空键,则返回按键释放状态S6,否则继续停留在本状态。在按键连发状态下,如果按键键值为空键则返回按键释放状态S6,如果按键时间计数超过连发阈值,则返回连发按键值,清零时间计数后继续停留在本状态。看了这么多,也许你已经有一个模糊的概念了,下面让我们趁热打铁,一起来动手编写按键驱动程序吧。下面是我使用的硬件的连接图。
硬件连接很简单,四个独立按键分别接在P3^0------P3^3四个I/O上面。因为51单片机I/O口内部结构的限制,在读取外部引脚状态的时候,需要向端口写1.在51单片机复位后,不需要进行此操作也可以进行读取外部引脚的操作。因此,在按键的端口没有复用的情况下,可以省略此步骤。而对于其它一些真正双向I/O口的单片机来说,将引脚设置成输入状态,是必不可少的一个步骤。下面的程序代码初始化引脚为输入。void KeyInit(void){??? io_key_1 = 1 ;??? io_key_2 = 1 ;??? io_key_3 = 1 ;??? io_key_4 = 1 ;??????????? }
根据按键硬件连接定义按键键值#define KEY_VALUE_1????????????? 0x0e#define KEY_VALUE_2????????????? 0x0d#define KEY_VALUE_3??????????????? 0x0b#define KEY_VALUE_4??????????????? 0x07#define KEY_NULL??????????????????? 0x0f下面我们来编写按键的硬件驱动程序。根据第一章所描述的按键检测原理,我们可以很容易的得出如下的代码:static uint8 KeyScan(void){??? if(io_key_1 == 0)return KEY_VALUE_1 ;??? if(io_key_2 == 0)return KEY_VALUE_2 ;??? if(io_key_3 == 0)return KEY_VALUE_3 ;??? if(io_key_4 == 0)return KEY_VALUE_4 ;??? return KEY_NULL ;}其中io_key_1等是我们按键端口的定义,如下所示:sbit io_key_1 = P3^0 ;sbit io_key_2 = P3^1 ;sbit io_key_3 = P3^2 ;sbit io_key_4 = P3^3 ;
KeyScan()作为底层按键的驱动程序,为上层按键扫描提供一个接口,这样我们编写的上层按键扫描函数可以几乎不用修改就可以拿到我们的其它程序中去使用,使得程序复用性大大提高。同时,通过有意识的将与底层硬件连接紧密的程序和与硬件无关的代码分开写,使得程序结构层次清晰,可移植性也更好。对于单片机类的程序而言,能够做到函数级别的代码重用已经足够了。在编写我们的上层按键扫描函数之前,需要先完成一些宏定义。//定义长按键的TICK数,以及连发间隔的TICK数#define KEY_LONG_PERIOD??????? 100#define KEY_CONTINUE_PERIOD??? 25
//定义按键返回值状态(按下,长按,连发,释放)#define
文档评论(0)