状态机编程
伪代码实例:洗衣机
功能需求
由功能转变状态图
梳理状态之间的转换的关系
梳理状态之间的转换的关系(添加切换条件)
代码编程
#include "stdio.h"
#include "string.h"
#include "stdlib.h"
#define SELF_CHECK_STATUS (1)//上电自检
#define IDEL_STATUS (2)//空闲
#define COUNT_DOWN_STATUS (3)//倒计时
#define WATER_IN_STATUS (4)//加水
#define DO_WASH_STATUS (5)//洗衣
#define WATER_OUT_STATUS (6)//放水
#define DO_DRY_STATUS (7)//甩干
#define FINISHED_STATUS (8)//洗衣结束
#define ARARM_STATUS (18)//报警
#define PAUSE_STATUS (28)//暂停
int init(void)
{
return 0;
}
void global_check(void)
{
return ;
}
int auto_check(void)
{
return 0;
}
int alarm(void)
{
return 0;
}
int wait_for_user(void)
{
return 0;
}
int start_countdown(void)
{
return 0;
}
int let_water_in(void)
{
return 0;
}
int do_wash(void)
{
return 0;
}
int let_water_out(void)
{
return 0;
}
int do_dry(void)
{
return 0;
}
int finished(void)
{
return 0;
}
int main(void)
{
static int step = SELF_CHECK_STATUS;//状态切换标志
init();//开机进行一系列初始化(主要是驱动外设)
while(1)
{
//一些全局的事件检测,用于设置全局标志
global_check();
// 状态机
switch (step)
{
case SELF_CHECK_STATUS://自检
{
auto_check();
if (按下停止) step = FINISHED_STATUS;
if (自检pass) step = IDEL_STATUS;
else
step = ARARM_STATUS;
}break;
case IDEL_STATUS://空闲
{
wait_for_user();
if (按下停止) step = FINISHED_STATUS;
if (按下开始) step = COUNT_DOWN_STATUS;
}break;
case COUNT_DOWN_STATUS://倒计时
{
start_countdown();
if (按下停止) step = FINISHED_STATUS;
if (倒计时结束) step = WATER_IN_STATUS;
}break;
case WATER_IN_STATUS://加水
{
let_water_in();
if (按下停止) step = FINISHED_STATUS;
if (水加满了) step = DO_WASH_STATUS;
}break;
case DO_WASH_STATUS://洗衣
{
do_wash();
if (按下停止) step = FINISHED_STATUS;
if (清洗时间结束) step = WATER_OUT_STATUS;
}break;
case WATER_OUT_STATUS://放水
{
let_water_out();
if (按下停止) step = FINISHED_STATUS;
if (水放完 && 只洗了一遍) step = WATER_IN_STATUS;
else if (水放完 && 洗了两遍) step = 甩干;
}break;
case DO_DRY_STATUS://甩干
{
do_dry();
if (按下停止) step = FINISHED_STATUS;
if (甩干时间结束) step = FINISHED_STATUS;
}break;
case FINISHED_STATUS://洗衣结束
{
finished();
if (按下停止) step = FINISHED_STATUS;
step = IDEL_STATUS;
}break;
case ARARM_STATUS://报警
{
while(1)
{
alarm();//死循环,不再响应用户操作,并报警
}
}break;
case PAUSE_STATUS://暂停
{
//功能待完成。。。。。。。
//在任何状态按下暂停键会跳转到暂停态,
//再按一次暂停按键会回到之前的状态
}break;
default:
{
}break;
}
}
}