4631|10

7219

帖子

192

TA的资源

五彩晶圆(高级)

楼主
 

【launchpad心得】launchpad课后练习十八之状态机入门 [复制链接]

       launchpad课后练习十八之状态机入门

      1.状态机的概念(来源网络)

状态机是软件编程中的一个重要概念。比这个概念更重要的是对它的灵活应用。在一个思路清晰而且高效的程序中,必然有状态机的身影浮现。


比如说一个按键命令解析程序,就可以被看做状态机:本来在A状态下,触发一个按键后切换到了B状态;再触发另一个键后切换到C状态,或者返回到A状态。这就是最简单的按键状态机例子。实际的按键解析程序会比这更复杂些,但这不影响我们对状态机的认识。


进一步看,击键动作本身也可以看做一个状态机。一个细小的击键动作包含了:释放、抖动、闭合、抖动和重新释放等状态。


同样,一个串行通信的时序(不管它是遵循何种协议,标准串口也好、I2C也好;也不管它是有线的、还是红外的、无线的)也都可以看做由一系列有限的状态构成。

显示扫描程序也是状态机;通信命令解析程序也是状态机;甚至连继电器的吸合/释放控制、发光管(LED)的亮/灭控制又何尝不是个状态机。

当我们打开思路,把状态机作为一种思想导入到程序中去时,就会找到解决问题的一条有效的捷径。有时候用状态机的思维去思考程序该干什么,比用控制流程的思维去思考,可能会更有效。这样一来状态机便有了更实际的功用。

程序其实就是状态机。

也许你还不理解上面这句话。请想想看,计算机的大厦不就是建立在“0”“1”两个基本状态的地基之上么?
状态机的要素
状态机可归纳为4个要素,即现态、条件、动作、次态。这样的归纳,主要是出于对状态机的内在因果关系的考虑。现态条件是因,动作次态是果。详解如下:

①现态:是指当前所处的状态。

②条件:又称为事件。当一个条件被满足,将会触发一个动作,或者执行一次状态的迁移。

③动作:条件满足后执行的动作。动作执行完毕后,可以迁移到新的状态,也可以仍旧保持原状态。动作不是必需的,当条件满足后,也可以不执行任何动作,直接迁移到新状态。

④次态:条件满足后要迁往的新状态。次态是相对于现态而言的,次态一旦被激活,就转变成新的现态了。

如果我们进一步归纳,把现态次态统一起来,而把动作忽略(降格处理),则只剩下两个最关键的要素,即:状态、迁移条件。

状态机的表示方法有许多种,我们可以用文字、图形或表格的形式来表示一个状态机。

 

2.应用——状态机入门

(本人也是菜鸟而已,菜鸟飞过,高手绕道~~~~,此例子并不是一个完善的状态机,只是为了新手,知道什么是状态机,怎么来完成最基本的状态机而已,高手拍砖轻一点啊)

 

本文也把按键看成4个状态,一个按键的判断就必须通过这4个状态来检测,在消抖完成后,会进入下一个确认状态,确认之后进入下一个释放状态。

#define key_a 1         // 初始

#define key_b 2         // 消抖

#define key_c 3         // 确认

#define key_d 4         // 释放

程序中没有加入长按、短按等等,在以后的章节中会加入,这里只做简单的按下,程序中注释较多,方便入门者阅读。

 

  课后练习十八之状态机入门.pdf (131.84 KB, 下载次数: 249)

最新回复

谢谢楼主分享  详情 回复 发表于 2014-11-3 23:43
 
点赞 关注(3)

回复
举报

7219

帖子

192

TA的资源

五彩晶圆(高级)

沙发
 

 

3.例程

  1. /***********************************************
    **** LAUNCH PAD 学习之状态机入门 ***
    **** MCU: MSP430 ***
    **** 作者: 常见泽 ***
    **** ***
    **** ***
    **** 2012.06.04.16:34 ***
    **** 实验现象:按键按下LED1亮 ***
    **** ***
    **** ***
    **** ***
    ***********************************************/

    #include <msp430g2452.h>

    #define keyinput (P1IN&BIT3)

    #define uchar unsigned char
    #define uint unsigned int

    #define key_a 1 // 初始
    #define key_b 2 // 消抖
    #define key_c 3 // 确认
    #define key_d 4 // 释放
    uchar Key_state=1;


    void keyscan() //按键扫描
    {
    static uint time1=0;

    switch(Key_state)
    {
    case key_a:
    if(keyinput==0) //判断是否右键按下
    {
    Key_state=key_b; //有键按下则跳到 key_b(消抖)
    }
    else
    Key_state=key_a; //没有键按下则返回key_a(初始化)
    break;

    case key_b: //消抖
    if(++time1>300)
    {
    time1=0;
    if(keyinput==0) //如果按键处于按下状态则LED1亮
    P1OUT |= BIT0;
    Key_state = key_c; //如果按键按下则跳转到key_c (确认)
    }
    else
    Key_state=key_a; //否则返回key_a继续判断

    break;

    case key_c: //确认按键处于释放状态还是按下状态
    if(keyinput) //按键被释放
    {
    Key_state = key_d; //跳转到key_d,即释放状态

    }
    else //如果按键没有释放
    {
    ; //这里可以加入功能
    }

    break;

    case key_d: //按键被释放
    time1=0; //清零
    Key_state = key_a; //返回key_a初始化
    break;

    default:
    break;

    }


    }
    void main(void)
    {
    WDTCTL = WDTPW + WDTHOLD; //停止看门狗,不使用内部看门狗定时器
    //P1DIR &= 0xf7; //设置P1.3口方向为输入
    //更进一步 可以不加这一句 因为430初始化后,IO为输入模式
    P1DIR |= 0x01; //P1.0为输出
    P1DIR |= BIT6;
    P1SEL = 0x00; //选择为普通IO口
    P1OUT = 0X00;

    while(1)
    {
    keyscan();
    }
    }

复制代码

 
 

回复

327

帖子

0

TA的资源

纯净的硅(高级)

板凳
 
受益匪浅,受教了

点评

多谢支持 谢谢 :victory:  详情 回复 发表于 2012-6-19 14:35
 
个人签名Python全文搜索引擎:<url>http://code.google.com/p/ming-search/</url>
 
 

回复

2453

帖子

19

TA的资源

五彩晶圆(中级)

4
 
很好
 
 
 

回复

7219

帖子

192

TA的资源

五彩晶圆(高级)

5
 

回复 板凳 elulis 的帖子

多谢支持 谢谢
 
 
 

回复

13

帖子

0

TA的资源

一粒金砂(中级)

6
 
受益匪浅
 
 
 

回复

19

帖子

0

TA的资源

一粒金砂(中级)

7
 
不错,学习下。
 
 
 

回复

13

帖子

0

TA的资源

一粒金砂(中级)

8
 

敢不敢给个正确的程序

敢不敢给个正确的程序

点评

1. 本程序只是先一次按键按下 灯亮 之后复位之后 重新按键的简单功能。 2.如果开机之后灯一直亮,请焊接上R34电阻,我是第一期获得者 开始的时候R34 C24都是焊接上的 在后续的板子中TI公司没焊接R34 C24  详情 回复 发表于 2012-8-14 20:07
 
 
 

回复

7219

帖子

192

TA的资源

五彩晶圆(高级)

9
 

回复 8楼 taotao319 的帖子

1. 本程序只是先一次按键按下 灯亮 之后复位之后 重新按键的简单功能。
2.如果开机之后灯一直亮,请焊接上R34电阻,我是第一期获得者 开始的时候R34 C24都是焊接上的  在后续的板子中TI公司没焊接R34 C24
 
 
 

回复

9

帖子

0

TA的资源

一粒金砂(初级)

10
 
看看。。。
 
 
 

回复

12

帖子

0

TA的资源

一粒金砂(初级)

11
 
谢谢楼主分享
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表