woaidongmao

文章均收录自他人博客,但不喜标题前加-[转贴],因其丑陋,见谅!~
随笔 - 1469, 文章 - 0, 评论 - 661, 引用 - 0
数据加载中……

状态机的应用实例----电子表

  看看小时候玩的5块钱那种最简单的电子表。只有2个按钮就能操作(暂且称为按钮A和按钮B)。
 
现给出一个完整的功能文字描述:
    
在显示时间时按A,屏幕显示变成日期
    
在显示日期时按A,屏幕显示变成秒钟
    
在显示秒钟时按A,屏幕显示变成时间
    
在显示秒钟时按B,秒钟归0
    
在显示时间时按B,屏幕 时间、日期交替显示。
    
在时间、日期交替显示时按B,屏幕闪烁
    
闪烁时按B,屏幕1,超过230
    
闪烁时按A,屏幕闪烁
    
闪烁时按B,屏幕1,超过590
    
闪烁时按A,屏幕闪烁
    
闪烁时按B,屏幕1,超过120
    
闪烁时按A,屏幕闪烁
    
闪烁时按B,屏幕1,超过310
    
闪烁时按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的是状态变化的时刻,而不是过程中大量的等待,这样大量的并发过程都可以并行处理。

posted on 2008-12-14 19:33 肥仔 阅读(1743) 评论(1)  编辑 收藏 引用 所属分类: 状态机 & 自动机 & 形式语言

评论

# re: 状态机的应用实例----电子表  回复  更多评论   

太棒了
2009-11-25 11:37 | 过客

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理