关于状态机,下面两种写法哪种正确?

[复制链接]
1561|5
 楼主| discussant 发表于 2018-7-13 22:19 | 显示全部楼层 |阅读模式
本帖最后由 discussant 于 2018-7-15 17:33 编辑

写法一:
void StateProcess()
{
    if(State==C_OFF_STATE)
    {
        f_heat=0;//只要在关的状态,一直不加热
        if(KeyEvent==C_KEY_EVENT_ON)//状态转换条件
        {
            State=C_ON_STATE;//状态转换
        }
    }
    else if(State==C_ON_STATE)
    {
        f_heat=1;//只要在开的状态,一直加热
        if(KeyEvent==C_KEY_EVENT_OFF)//状态转换条件
        {
            State=C_OFF_STATE;//状态转换
        }
    }
    if(f_heat)
    GPIO_HEAT=1;
    else
    GPIO_HEAT=0;
}

写法二:
void StateProcess()
{
    if(State==C_OFF_STATE)
    {
        if(KeyEvent==C_KEY_EVENT_ON)//条件
        {
            State=C_ON_STATE;//状态转换
            f_heat=1;//动作
        }
    }
    else if(State==C_ON_STATE)
    {
  
        if(KeyEvent==C_KEY_EVENT_OFF)//条件
        {
            State=C_OFF_STATE;//状态转换
            f_heat=0;//动作
        }
    }
    if(f_heat)
    GPIO_HEAT=1;
    else
    GPIO_HEAT=0;
}

 楼主| discussant 发表于 2018-7-13 22:27 | 显示全部楼层
再举一个单片机例子。写显示程序,有的人喜欢在每个循环先把显示缓冲区全部清0,然后把每个状态的该置为1的缓冲区的位置为1.但是后的人只有在状态变化的时刻才改变这个显示缓冲区。
 楼主| discussant 发表于 2018-7-13 22:33 | 显示全部楼层
我在首帖的第一个例子的加热程序,每个循环都会f_heat=1;或f_heat=0;这样即使程序因某个原因导致f_heat异常也会很快恢复原值。但是有的人写的程序就是在状态变化的那个时刻才改变f_heat,如果这个值由于某个原因变了呢?
 楼主| discussant 发表于 2018-7-15 17:34 | 显示全部楼层
单片机程序
 楼主| discussant 发表于 2020-2-25 13:30 | 显示全部楼层
谢谢!
lhj200304 发表于 2020-7-9 09:49 | 显示全部楼层
discussant 发表于 2018-7-13 22:27
再举一个单片机例子。写显示程序,有的人喜欢在每个循环先把显示缓冲区全部清0,然后把每个状态的该置为1的 ...

多次刷写可以容错抗干扰
您需要登录后才可以回帖 登录 | 注册

本版积分规则

68

主题

250

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部