原标题: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语言状态机编程思想相关推荐

  1. Java编程思想+Effective Java+Java核心技术+Java核心技术 卷II+Java语言程序设计(中文+英文+源码)

    Java四大名著(中文+英文+源码 ) 传说中的java四大名著,分享出来方便大家学习! 书名如下: Java编程思想 Effective Java(第2版) Java核心技术 卷I(第8版) Jav ...

  2. C语言状态机编程思想

    关注.星标公众号,直达精彩内容 文章来源:头条-嵌入式在左C语言在右 链接:https://www.toutiao.com/i6843028812112855564/ 有限状态机概念 有限状态机是一种 ...

  3. 状态机----C语言实现

    #什么是状态机? 定义: 状态机是 ""有限状态自动机的简称"" . 先来解释什么是"状态"( State ): 现实事物是有不同状态的,例 ...

  4. 基于STM32F103移植华为LiteOS_任务挂起与恢复_面向对象编程思想之按键状态机

    华为LiteOS_任务挂起与恢复_面向对象编程思想之按键状态机 因为在做华为LiteOS任务挂起和恢复需要使用到按键去触发任务挂起和恢复动作,因为我就萌发出使用状态机这种架构做一个按键检测触发.回想已 ...

  5. c语言设计模式代码完整实现-状态机模式

    模式介绍 状态(state)模式是C语言实现相当常用的模式,也是能够在C语言***现出来的最显性的模式之一.在面向对象里,状态模式允许一个对象在内部状态改变的时候改变其行为. 状态用法很多,最常见的是 ...

  6. c++ 哈希表_C语言精华知识:表驱动法编程实践

    问:怎么每天看到这种文章? 答:只需搜索公众号"51单片机学习网"免费关注 排版:嵌入式云IOT技术圈 数据压倒一切.如果选择了正确的数据结构并把一切组织的井井有条,正确的算法就不 ...

  7. 按键处理技巧(状态机)

    转载原文:https://blog.csdn.net/guohengsheng3882/article/details/78506314 按键是单片机最常用的输入设备了.按下接通,松开分断,本来是 很 ...

  8. STM32按键消抖——入门状态机思维

    在嵌入式软件开发中,状态机编程是一个十分重要的编程思想,它也是嵌入式开发中一个常用的编程框架.掌握了状态机编程思想,可以更加逻辑清晰的实现复杂的业务逻辑功能. 1 状态机思想 状态机,或称有限状态机F ...

  9. 学单片机需要多少C语言基础,C语言单片机编程教程

    很多学员和朋友经常找我给他们推荐C语言的书,他们可能想和我当年一样,闷头大干一场,学个几个月的C语言,把C语言吃透,再开始单片机程序开发! 别!别!别! 大家千万别这么干,我当年自学了3个月的C语言, ...

最新文章

  1. Graph Attention Networks
  2. 黑马程序程序员基础测试(二)
  3. 为什么不建议你使用实数作为 HashMap 的key?
  4. zookeeper 事务日志
  5. Ubuntu U盘启动出现“Failed to load ldlinux.c32”解决
  6. 计算机考试关于计算量,2020年税务师考试计算器要求、考试教材变化及题型题量...
  7. 华为命令 hybird实验
  8. keytool基本使用
  9. windows最好用的mp3格式转换软件推荐
  10. 淘宝的npaliedit在mb下会崩溃的问题解决了
  11. 如何访问一个互联网上的xap文件
  12. addClass(““).delay().removeClass(““);没有效果的解决方式
  13. 批处理文件(bat)装逼 之全彩滚动我爱你 绘制五彩爱心 绘制3D球体
  14. python画圆角矩形_js绘制圆角矩形
  15. 成人python线上培训机构_哪些成年人正通过在线教育平台学习?看这个大数据报告就知道...
  16. windows进程详解
  17. 2年200店!Tims咖啡强势扩张的底气在哪里?
  18. SEO常用的数据名词解释
  19. 基于Redis的BloomFilter实现
  20. Hive经典例题解析

热门文章

  1. Minimal Square
  2. 2021世界区块链大会·杭州
  3. 不知如何选股?不知哪种指标策略可靠?量化分析比较ASI、VR、ARBR、DPO、TRIX指标策略收益情况
  4. RN拆包实践的一些经验教训
  5. c语言编程思维训练方法,编程思维训练题.pdf
  6. 【程序计数器】概念、作用、特点、线程私有、本地方法的概述_JVM02
  7. Python学习之爬虫基础
  8. 一级造价工程师(安装)- 计量笔记 - 第一章第二节安装工程常用材料
  9. 闫令琪图形学入门笔记(矩阵变换篇)
  10. QQ登录界面功能测试条例