c语言按键状态机,C语言状态机编程思想
原标题:C语言状态机编程思想
有限状态机概念
有限状态机是一种概念思想,把复杂的控制逻辑分解成有限个稳定状态,组成闭环系统,通过事件触发,让状态机按设定的顺序处理事务。单片机C语言的状态机编程,是利用条件选择语句(switch、case或者if、else)切换状态,通过改变状态机状态,让程序按设定的顺序执行。
有限状态机由有限的状态和相互之间的转移构成,在任何时候只能处于给定数目的状态中的一个。当接收到一个输入事件时,状态机产生一个输出,同时也可能伴随着状态的转移。状态机的原理如下:在当前状态下,发生某个事件后转移到下一个状态,然后决定执行的功能动作。可参考如下示意图:
应用举例
要想使用状态机思想进行编程,需要将任务分解成有限个稳定状态。
这里以常见的按键动作进行举例说明:
上图为按键典型的动作图,可以分解为四个状态,分别为:
状态1 = 按键弹起、
状态2 = 前沿抖动、
状态3 = 按键按下、
状态4 = 后沿抖动。
有限状态机的C代码实现如下:
if(定时器 >= 10ms) //10ms是典型消抖时间
{
switch(按键状态)
{
case按键弹起状态:
if(IO读取为低电平) 按键状态=前沿抖动;
break;
case前沿抖动状态:
if(IO读取为低电平) 按键状态=按键按下;
break;
case按键按下状态:
if(IO读取为高电平) 按键状态=后沿抖动;
break;
case后沿抖动状态:
if(IO读取为高电平) 按键状态=按键弹起;
break;
default:按键状态=按键弹起;
}
}
状态机编程建议
巧妙的使用结构体和枚举一方面可以便于扩展和维护状态机的状态和事件,另一方面可提高程序的可读性。假设有3种状态(状态数可以随意增加),状态枚举如下:
typedefenum{
state_1= 1,
state_2,
state_3
}State;
假设有5个事件(也可以随意增加),事件枚举如下:
typedefenum{
event_1= 1,
event_2,
event_3,
event_4,
event_5
}Event;
定义一个结构体描述如下:
typedefstruct{
State curState; //当前状态
Event eventId; //事件
State nextState; //下一个状态
Action action; //动作功能
}StateEvent;
根据具体的应用场景调整State和Event,并赋予相应的动作功能,整体的基本流程如下:当前状态->有事件触发->跳到下一个状态->具体的动作功能
总结
状态机应用很广泛,也可以锻炼逻辑思维,LoRa消息推送也常采用状态机的思想, 实际上状态机涉及的知识点很多,本篇文章只是简要的介绍了下单片机C语言的状态机编程思想,在日后的开发设计中,需要不断的总结经验并灵活应用。
来源:头条-嵌入式在左C语言在右
版权归原作者所有,如有侵权,请联系删除。返回搜狐,查看更多
责任编辑:
c语言按键状态机,C语言状态机编程思想相关推荐
- Java编程思想+Effective Java+Java核心技术+Java核心技术 卷II+Java语言程序设计(中文+英文+源码)
Java四大名著(中文+英文+源码 ) 传说中的java四大名著,分享出来方便大家学习! 书名如下: Java编程思想 Effective Java(第2版) Java核心技术 卷I(第8版) Jav ...
- C语言状态机编程思想
关注.星标公众号,直达精彩内容 文章来源:头条-嵌入式在左C语言在右 链接:https://www.toutiao.com/i6843028812112855564/ 有限状态机概念 有限状态机是一种 ...
- 状态机----C语言实现
#什么是状态机? 定义: 状态机是 ""有限状态自动机的简称"" . 先来解释什么是"状态"( State ): 现实事物是有不同状态的,例 ...
- 基于STM32F103移植华为LiteOS_任务挂起与恢复_面向对象编程思想之按键状态机
华为LiteOS_任务挂起与恢复_面向对象编程思想之按键状态机 因为在做华为LiteOS任务挂起和恢复需要使用到按键去触发任务挂起和恢复动作,因为我就萌发出使用状态机这种架构做一个按键检测触发.回想已 ...
- c语言设计模式代码完整实现-状态机模式
模式介绍 状态(state)模式是C语言实现相当常用的模式,也是能够在C语言***现出来的最显性的模式之一.在面向对象里,状态模式允许一个对象在内部状态改变的时候改变其行为. 状态用法很多,最常见的是 ...
- c++ 哈希表_C语言精华知识:表驱动法编程实践
问:怎么每天看到这种文章? 答:只需搜索公众号"51单片机学习网"免费关注 排版:嵌入式云IOT技术圈 数据压倒一切.如果选择了正确的数据结构并把一切组织的井井有条,正确的算法就不 ...
- 按键处理技巧(状态机)
转载原文:https://blog.csdn.net/guohengsheng3882/article/details/78506314 按键是单片机最常用的输入设备了.按下接通,松开分断,本来是 很 ...
- STM32按键消抖——入门状态机思维
在嵌入式软件开发中,状态机编程是一个十分重要的编程思想,它也是嵌入式开发中一个常用的编程框架.掌握了状态机编程思想,可以更加逻辑清晰的实现复杂的业务逻辑功能. 1 状态机思想 状态机,或称有限状态机F ...
- 学单片机需要多少C语言基础,C语言单片机编程教程
很多学员和朋友经常找我给他们推荐C语言的书,他们可能想和我当年一样,闷头大干一场,学个几个月的C语言,把C语言吃透,再开始单片机程序开发! 别!别!别! 大家千万别这么干,我当年自学了3个月的C语言, ...
最新文章
- C++ 11 中的POD
- 实现auto_ptr的两种方法
- CG CTF WEB AAencode
- wxWidgets:wxTreebook类用法
- windows环境wampserver3 切换 php7
- ExtJS 2.0官方实例目录
- BZOJ3028食物——生成函数+泰勒展开
- 前端学习(2993):vue+element今日头条管理--加入git管理
- 送货只服京东“特快送”:航空快件可送达近300个城市
- [转]如何使用 DirectX 診斷工具判斷 DirectX 的版本
- VB 去除文本框粘贴功能
- 【JDBC】JDBC的使用(数据库的增删改查询)
- 安装pgadmin3
- 计算机联锁控制台操作演示,车站计算机联锁控制台的设计.doc
- 「成人学习」掘金者,从教育走向生活方式
- win10计算机系统优化设置,这些简单优化能让你的Win10流畅很多
- 全世界公认最美的经典爱情句子
- ssm实现记住账号密码(cookie)
- SVN:将分支合并到主干
- Launcher进程启动流程
热门文章
- matlab xlabel位置设置
- Java学习笔记-----comparable和comparator使用方法
- shell脚本案例-登录系统的时候自动显示服务器资源信息脚本
- matlab悬置非线性位移计算公式,一种基于Excel的电动车动力总成悬置工况力数据处理方法与流程...
- Vmware安装openfiler
- 股票多因子模型的回检
- 【网络】https协议
- ERP提取平均波幅到excel中
- P1640 [SCOI2010]连续攻击游戏:(二分图)
- mac php7安装redis,mac 下安装php7.1 redis