



免费预览已结束,剩余1页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
基于状态机的按键扫描的实现 一般的按键输入软件接口程序非常简单,在程序中一旦检测到按键输入口为低电平(有时可能为高),便采用软件延时的方法来进行消抖,然后再次检测按键输入,如果再次确认为低电平则表示有按键按下,转入执行按键处理程序。如果延时后检测的电平为高电平则放弃本次按键检测,重新开始一次按键检测过程。在简单的系统中这种方法比较可以用,但是在复杂的系统实时性要求较高的系统中这种方法的CPU利用率比较低,造成资源的浪费。另外,由于在不同的产品系统中对按键功能的定义和使用方式也会不同,而且是多变的,加上在测试和按键处理的同时,MCU还要同时处理其他的任务(如显示、计算、计时等),因此编写键盘和按键接口的处理程序需要掌握有效的分析方法,具备较高的软件设计能力和程序编写的技巧。而采用状态机的方法是一种比较好的方法。何为状态机 关于状态机的一个极度确切的描述是它是一个有向图形,由一组节点和一组相应的转移函数组成,状态机通过响应一系列事件而“运行”。每个事件都在属于“当前”节点的转移函数的控制范围内,其中函数的范围是节点的一个子集。函数返回“下一个”(也许是同一个)节点。这些节点中至少有一个必须是终态。当到达终态,状态机停止。状态机是一种概念性机器,它能采取某种操作来响应一个外部事件。具体采取的操作不仅能取决于接收到的事件,还能取决于各个事件的相对发生顺序。之所以能做到这一点,是因为机器能跟踪一个内部状态,它会在收到事件后进行更新。为一个事件而响应的行动不仅取决于事件本身,还取决于机器的内部状态。另外,采取 的行动还会决定并更新机器的状态。这样一来,任何逻辑都可建模成一系列事件/状态组合。状态机是软件编程中的一个重要概念。比如在一个按键命令解析程序中,就可以看做状态机,其过程如下:本来在A状态下,触发一个按键后切换到B,再触发另一个键后就切换到C状态,或者返回A状态。这是最简单的例子。其他的很多的程序都可以当做状态机来处理。状态机可归纳为4个要素,即现态、条件、动作、次态。这样的归纳,主要是出于对状态机内在因果关系的考虑。“现态”和“条件”是因,“动作”和“次态”是果。详细如下:现态:是指当前所处的状态。条件:又称为“事件”。当一个条件满足,将会触发一个动作,或者执行一次状态的迁移。动作:条件满足后执行动作。动作执行完毕后,可以迁移到新的状态,也可以仍旧保持原状态。动作不是必需的,当条件满足后,也可以不执行任何动作,直接迁移到新状态。次态:条件满足后要迁往的新状态。“次态”是相对于“现态”而言的,“次态”一旦被激活,就转变为新的“现态”了。按键的状态机实现一个按键从键按下到松开的过程如下如所示。从图中可以看出,按键的按下和松开的过程都有抖动的干扰问题,因此要将它们消除。 可将将按键抽象为4个状态:(1) 未按下,假定为S0(2) 确认有键按下,假定为S1(3) 键稳定按下状态,假定为S2(4) 键释放状态,假定为S3。(有时也可以抽象为3个状态S0,S1,S3)。在一个系统中按键的操作是随机的,因此系统软件中要对按键进行循环查询。在按键检测过程中需要进行消抖处理,消抖的延时处理一般要10ms或20ms,因此取状态机的时间序列为10或20ms,这样不仅可以跳过按键消抖的影响,同事也远小于按键0.3-0.5S的稳定闭合其,不会将按键过程丢失。假定键按下时端口电平为0,未按下时为1(或者相反)。通过状态机实现按键检测的过程如下:首先,按键的初始态为S0,当检测到输入为1时,表示没有键按下,保持S0。当按键输入为0时,则有键按下,转入状态S1。在S1状态时,如果输入的信号为1,则表示刚才的按键操作为干扰,则状态跳转到S0;如果输入信号为0,则表示确实有键按下,此时可以读取键状态,产生相应的按键标志或者将该事件存入消息队列。同时状态机切换到S2状态。在S2状态,如果输入信号为1,则没有键按下,切换到S3;如果输入信号为0,则保持S2状态,并进行计数。如果计数值超过一定的门限值,则可以认为该按键为长按键事件或者键一直按下状态,如果未超过门限值,则认为是短按键事件,保持S2状态。在S3状态,如果输入信号为高电平,则切换到S0.上面就是采用状态机进行按键检测的过程。简单程序如下:#define Keystate1 S0#define Keystate2 S1#define Keystate3 S2#define Keystate4 S3unsigned char Keystate = Keystate1;unsigned char Keypress; /按键输入void Key() switch(Keystate) case Keystate1: if(Keypress = 0) Keystate = Keystate2;else Keystate = Keystate1;break;case Keystate2: if(Keypress = 0) Keystate = Keystate3; /相应的键操作处理程序else Keystate = Keystate1;break;case Keystate3: if(Keypress = 0) Keystate = Keystate3; /相应的计数操作,判断长短按键else Keystate = Keystate4;break;case Keystate4: if(!Keypress ) Keystate = Keystate1;break; default: Keystate = Keystate1; break; 在定时器中,定时10ms,定时到后在中断服务程序中调用上述函数,每次执行的间隔10ms,可以有效的消除消抖,提高CPU的利用率。同时可以将状态机应用于其他的程序中,一个串行通信的时序(
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 《社团贷款管理办法》
- 语音包业务管理办法
- 西宁机动车管理办法
- 仓储物流物资管理办法
- 心脏康复生活质量影响-洞察及研究
- 红薯储藏期管理办法
- 产品改进计划管理办法
- 产品对外报价管理办法
- 营口特殊资产管理办法
- 装修工程绿色管理办法
- 人教版(2019)必修三 Unit 3 Diverse Cultures Listening and Talking课件
- 四川省眉山市各县区乡镇行政村村庄村名居民村民委员会明细
- 幼小可爱卡通家长会通用
- 建筑结构试验知识点总结
- 中西医治疗高血压课件
- TOP100经典绘本课件-《大卫上学去》
- 日本川崎市武藏小杉格林木(GrandTree)创新型购物中心调研分析报告课件
- 部编人教版七年级语文上册《朝花夕拾》
- 菌种购入、使用、销毁记录表单
- 初中英语教研组团队建设PPT课件
- 六年级上学期综合实践课教案
评论
0/150
提交评论