标题: 单片机状态机的学习与分享 [打印本页]

作者: bbxyliyang    时间: 2019-10-8 16:15
标题: 单片机状态机的学习与分享
有限状态机由有限的状态和相互之间的转移构成,在任何时候只
能处于给定数目的状态中的一个。当接收到一个输入事件时,状态机产生一个输出,同时也可能伴随着状态的转移。
#define key_input    PIND.7      // 按键输入口
#define key_state_0  0
#define key_state_1  1
#define key_state_2  2
char read_key(void)
{
static char key_state = 0;
char key_press, key_return = 0;
key_press = key_input;        // 读按键 I/O (状态机的输入)
switch (key_state)
{
case key_state_0:        // 按键初始态
        if (!key_press) key_state = key_state_1;  // 键被按下,状态转换到键确认态 , 确定下一次按键的状态值
break;
case key_state_1:        // 按键确认态
if (!key_press)
{
            key_return = 1;      // 按键仍按下,按键确认输出为“1”
            key_state = key_state_2;  // 状态转换到键释放态
}
else
            key_state = key_state_0;  // 按键已抬起,转换到 按键初始态
       break;
case key_state_2:
            if (key_press) key_state = key_state_0;  //按键已释放,转换到按键初始态
       break;
}  
      return key_return;
}
该简单按键接口函数 read_key()在整个系统程序中应每隔10ms
调用执行一次,每次执行时将先读取与按键连接的 I/O 的电平到变量 key_press 中,然后进入用 switch 结构构成的状态机。switch 结构中的 case 语句分别实现了 3 个不同状态的处理判别过程,在每个状态中将根据状态的不同,以及 key_press 的值(状态机的输入)确定输出值(key_return),和确定下一次按键的状态值(key_state) 。 函数 read_key()的返回参数提供上层程序使用。返回值为 0 时,表示按键无动作;而返回 1 表示有一次按键闭合动作,需要进入按键处理程序做相应的键处理。在函数 read_key()中定义了 3 个局部变量,其中 key_press和key_return为一般普通的局部变量,每次函数执行时,key_press 中保存着刚检测的按键值。key_return 为函数的返回值,总是先初始化为 0,只有在状态 1 中重新置 1,作为表示按键确认的标志返回。变量 key_state 非常重要,它保存着按键的状态值,该变量的值在函数调用结束后不能消失,
必须保留原值,因此在程序中定义为“局部静态变量” ,用static 声明。如果使用的语言环境不支持 static 类型的局部变量,应将 key_state 定义为全局变量(关于局部静态变量的特点请参考相关介绍 C 语言程序设计的书籍) 。
作者: 晨晨晨晨晨晨    时间: 2019-10-10 22:28
如果程序的用Tab键排版那就更好了,读起来不会很乱
作者: tieq1952    时间: 2019-10-11 07:30
谢谢分享!!!
作者: bbxyliyang    时间: 2019-10-13 17:29
tieq1952 发表于 2019-10-11 07:30
谢谢分享!!!

技术在于交流,我看了您写请工程化,定制化你的单片机代码帖子,很不错,技术在于交流,我现在在学PIC单片机,我也会分享自己学习的点点滴滴,希望能帮助需要帮助的人。
作者: bbxyliyang    时间: 2019-10-13 17:30
晨晨晨晨晨晨 发表于 2019-10-10 22:28
如果程序的用Tab键排版那就更好了,读起来不会很乱

好的,谢谢好的建议。




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1