打印

谁能给我们讲解下状态机的应用阿~

[复制链接]
楼主: Swd21ic
手机看帖
扫描二维码
随时随地手机跟帖
21
liuxp_008| | 2008-1-3 12:14 | 只看该作者 回帖奖励 |倒序浏览

休息一下再看

使用特权

评论回复
22
iammercy| | 2008-1-3 16:09 | 只看该作者

匯編都是一個道理,繼續

;-----------------------------------------------------------------------------------------
;KEY PAD
;-----------------------------------------------------------------------------------------
;output:            PA0    PA1    PA2
;------------------------------------------------------------------------------------------
;KeyValue:                        |    input:
;                8    4    0    |    PB3
;                9    5    1    |    PB2
;                10    6    2    |    PB1
;                11    7    3    |    PB0
;keyInfor:
;0    --    SW10    風量    
;1    --    SW8    取消    
;2    --    SW6    關    
;3    --    SW3    功能選擇
;4    --    N/A             
;5    --    N/A    
;6    --    SW5    運轉關/開
;7    --    SW2    溫度+    
;8    --    SW9    風向    
;9    --    SW7    設定    
;10    --    SW4    開    
;11    --    SW1    溫度-    

。。。。。。。。。。。。。。


Key_Fan_PressDown:        ;0
       //do something and then return
       rtni
Key_Cancel_PressDown:        ;1
       //do something and then return
       rtni
Key_OffTime_PressDown:        ;2
       //do something and then return
       rtni
Key_Mode_PressDown    :    ;3
       //do something and then return
       rtni
WrongKey_PressDown    :    ;4 & 5
       //do something and then return
       rtni
Key_Power_PressDown:        ;6
       //do something and then return
       rtni
Key_Plus_PressDown    :    ;7
       //do something and then return
       rtni
Key_Swing_PressDown:        ;8
       //do something and then return
       rtni
Key_SetTime_PressDown:        ;9
       //do something and then return
       rtni
Key_OnTime_PressDown:        ;10
       //do something and then return
       rtni
Key_Minus_PressDown:    
       //do something and then return
       rtni

。。。。。。。

KeyPress_Table:
        tjmp
        jmp    Key_Fan_PressDown        ;0
        jmp    Key_Cancel_PressDown        ;1
        jmp    Key_OffTime_PressDown        ;2
        jmp    Key_Mode_PressDown        ;3
        jmp    WrongKey_PressDown        ;4
        jmp    WrongKey_PressDown        ;5
        jmp    Key_Power_PressDown        ;6
        jmp    Key_Plus_PressDown        ;7
        jmp    Key_Swing_PressDown        ;8
        jmp    Key_SetTime_PressDown        ;9
        jmp    Key_OnTime_PressDown        ;10
        jmp    Key_Minus_PressDown        ;11
KeyPress_Table_ACC        EQU        (KeyPress_Table+1)&0fh
KeyPress_Table_TBR        EQU        ((KeyPress_Table+1)>>4)&0fh


。。。。。。

ldi    rzTBR        ,KeyPress_Table_TBR
ldi    zWk0        ,KeyPress_Table_ACC    
lda    zKeyValue    ,0            ;-L
addm    zWk0        ,0
ldi    zWk1        ,0x00            ;-H
adcm    rzTBR        ,0
lda    zWk0        ,0
call    KeyPress_Table    

。。。。。。

使用特权

评论回复
23
wnch| | 2008-1-3 17:29 | 只看该作者

留个记号

使用特权

评论回复
24
uc.c| | 2008-1-3 19:56 | 只看该作者

我也留个

使用特权

评论回复
25
Swd21ic|  楼主 | 2008-1-3 19:59 | 只看该作者

~~~~

呵呵..顶阿. 

switch case的很容易用,可在实际中是怎么去把一个问题考虑用这种方法解决呢?
 
实际的效率可以说是更进一步的细节了,只要不是太笨的方法,在现有MCU能力下还是没什么问题的吧

使用特权

评论回复
26
mohanwei| | 2008-1-3 21:24 | 只看该作者

“实际中”?……拿出一个例子分析吧

使用特权

评论回复
27
lshlin| | 2008-1-4 14:43 | 只看该作者

好贴,留个名

使用特权

评论回复
28
还我今生| | 2008-1-5 08:42 | 只看该作者

不错 顶一个

使用特权

评论回复
29
sharks| | 2008-1-5 13:43 | 只看该作者

我来给个实际的状态机编程思想例子

     看看小时候玩的5块钱那种最简单的电子表。只有2个按钮就能操作。
     暂且称为按钮A和按钮B
     现给出一个完整的功能文字描述:
     在显示时间时按A,屏幕显示变成日期
     在显示日期时按A,屏幕显示变成秒钟
     在显示秒钟时按A,屏幕显示变成时间
     在显示秒钟时按B,秒钟归0
     在显示时间时按B,屏幕 时间、日期交替显示。
     在时间、日期交替显示时按B,屏幕“时”闪烁
     在“时”闪烁时按B,屏幕“时”加1,超过23回0
     在“时”闪烁时按A,屏幕“分”闪烁
     在“分”闪烁时按B,屏幕“分”加1,超过59回0
     在“分”闪烁时按A,屏幕“月”闪烁
     在“月”闪烁时按B,屏幕“月”加1,超过12回0
     在“月”闪烁时按A,屏幕“日”闪烁
     在“日”闪烁时按B,屏幕“日”加1,超过31回0
     在“日”闪烁时按A,屏幕回到时间显示

    如果按照新手的思路,尝试去画流程图,很快就会陷入一头雾水:你会发现实现这个功能的程序根本就没有“确定的流程”。因为程序实际流程是根据人的操作而变化的。程序运行到什么地方,完全取决于两个键的次序,有无数种次序组合,根本不可能画出流程图来。
    但是我们会发现,这个电子表功能的“语言描述”在语法上似乎有某种规律,就是:
    当系统处于某状态(S1)时,如果发生了什么事情(E),就执行某功能(F),然后系统变成新状态(S2)
    只要能用上面这句话描述的系统,都可以用一种状态跳转机制很方便的实现
,并且一句话其实就是一个if(...),无论有多少多复杂的功能,只要能用上面这句话描述,都可以通过状态机编程实现。   
   
我们将它们抽象。整个系统中有2个事件分别是:A按下,B按下

    A按下(可以是中断)时执行:
{
     if(Status==TIME)  //当显示时间时按下A键
     {
        Status=DATE    //变成显示日期
     }
     if(Status==DATE)  //当显示日期时按下A键
     {
        Status=SEC     //变成显示秒钟
     }
     if(Status==SEC)  //当显示秒钟时按下A键
     {
        Status=TIME     //变成显示时间
     }
     if(Status==SET_HOUR)  //当设置“小时”时按下A键
     {
        Status=SET_MINUT        //变成设置“分钟”
     }
     if(Status==SET_MINUT)  //当设置“分钟”时按下A键
     {
        Status=SET_MONTH        //变成设置“月”
     }
     .....
     .....
}
  

    B按下(可以是中断)时执行:
{
      if(Status==SEC)  //当显示秒钟时按下B键
     {
        Secound=0     //秒归0
     }
     if(Status==TIME)  //当显示时间时按下B键
     {
        Status=TIMEDATE    //变成时间日期交替显示
     } 
     if(Status==TIMEDATE)  //当日期交替显示时按下B键
     {
        Status=SET_HOUR    //变成设置“时”(时闪烁)
     }
     if(Status==SET_HOUR)  //当设置“时”时按下B键
     {
        Status=Hour++      //时加1
        if(Hour>23) Hour=0;      
     }

     .....
     .....        
}

     和语言描述完全一致,很快就能写完程序。这就是最简单的状态机思想。
     当然,上述一大堆if可以用switch case来实现
     实际中,大量的并发过程都可以表述为状态跳转关系,从而将CPU从过程中解放出来,只需处理状态关系,因为真正需要CPU的是状态变化的时刻,而不是过程中大量的等待,这样大量的并发过程都可以并行处理。

使用特权

评论回复
30
hanker510| | 2008-1-5 14:22 | 只看该作者

LS

使用特权

评论回复
31
hanker510| | 2008-1-5 14:26 | 只看该作者

有点儿菜单的意味

  如果是这样的话,要是菜单级联多了,用状态机作容易实现吗?
 搬搬凳 学习

使用特权

评论回复
32
lb6035| | 2008-1-5 16:22 | 只看该作者

好帖,顶下!

使用特权

评论回复
33
jack.king| | 2008-1-5 16:39 | 只看该作者

原来这个就是状态机的思想啊!

哈哈!
原来这个就是状态机的思想.看来我也无意识的用了很多啊!

使用特权

评论回复
34
忘情天书| | 2008-1-5 20:35 | 只看该作者

fpga的编程一定要掌握状态机的思想

会很清晰的反映逻辑

使用特权

评论回复
35
decoder8| | 2008-1-5 23:50 | 只看该作者

慢慢看

使用特权

评论回复
36
zealane| | 2008-1-6 21:13 | 只看该作者

不错。。。

使用特权

评论回复
37
x_s_f| | 2008-1-7 00:23 | 只看该作者

呵呵, state machine

状态机在各种协议栈里面应用得很广的, 如从建立连接到接受连接, 到数据通信, 到连接释放等等收发双方都处在不同的状态.

状态机一个最典型的例子就是电话机软件, 有若干个并行运行的状态, 平时是standby状态, 一有来电就转到响铃状态, 拿线后叫offhook状态, 挂线到standby的阶段叫onhook状态等等诸如此类, 如果在通话时还要进行录音等动作的话就属于并行的状态了,同时在通话时也要响应standby时的大部分动作.

如果你看看UML建模方面的知识,就会知道UML九图里面就有一个非常重要的状态图, 状态图也是象rhapsody这样的以模型驱动开发的工具产生代码的主要依据.

现在有许多这样的状态图设计工具, 如visual state, statemate, 虽然各有长处, 也还不完善, 但对于设计一些关系比较复杂的嵌入式软件是很直观的哦, 生成的代码质量也还不错,当然也是跟你的设计质量相关的.



使用特权

评论回复
38
x_s_f| | 2008-1-7 00:30 | 只看该作者

呵呵, state machine

状态机一个主要的缺点就是对于各个对象之间的联系次序表现得不清晰,也不善于表现时间方面的信息, 这个自然就需要序列图或叫顺序图的来帮忙了, 建议大家多看看嵌入式系统建模方面的知识,对你养成对系统的整体认识和以后搞系统分析和设计是大有益处的

使用特权

评论回复
39
flandy| | 2008-1-9 10:16 | 只看该作者

受益匪浅..

好贴留名...

使用特权

评论回复
40
Swd21ic|  楼主 | 2008-1-9 13:12 | 只看该作者

~~~顶阿

x_s_f讲的很精彩

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则