我希望将这些嵌套的if语句转换为开关, 我在这些(开关案例)中使用有限状态机,每个案例都有自己的时间。 (从事与avr相关的项目。
原始开关
for(i=1;i<17;i++)
{
Print_On_LCD_Pos(i,2," Humidity: 67%"); // just example
Print_On_LCD_Pos((i-1),2," ");
_delay_ms(600);
if(i==16)
{
for(j=16;j>0;j--)
{
Print_On_LCD_Pos(j,2,"Humidity:67%");
Print_On_LCD_Pos((j+13),2," ");
_delay_ms(200);
if(j==1)
{
Print_On_LCD_Pos(10,2," ");
_delay_ms(400);
Print_On_LCD_Pos(10,2,"67%");
_delay_ms(400);
Print_On_LCD_Pos(10,2," ");
_delay_ms(400);
Print_On_LCD_Pos(10,2,"67%");
_delay_ms(400);
}
}
}
}
结果是如何在没有案例共享数据的情况下跟踪增量/减量变量的结果有点混乱。这里的困境是,正如你所知道的有限状态机它们按顺序运行所以在情况1运行的情况下它可能与另一个案例共享一些数据,除非我设置了一些课程限制,但这些很像不必要的长代码。
任何人都可以分享一种巧妙的方式吗?
答案 0 :(得分:0)
这样的事情怎么样:
static uint16_t state = 0;
state++;
if ( state < 17 ) {
const uint16_t i = state;
Print_On_LCD_Pos(i,2," Humidity: 67%"); // just example
Print_On_LCD_Pos((i-1),2," ");
_delay_ms(600);
} else
if ( state < 32 ) {
const uint16_t j = 16 - (32 - state);
Print_On_LCD_Pos(j,2,"Humidity:67%");
Print_On_LCD_Pos((j+13),2," ");
_delay_ms(200);
} else
if ( state == 32 ) {
Print_On_LCD_Pos(10,2," ");
_delay_ms(400);
Print_On_LCD_Pos(10,2,"67%");
_delay_ms(400);
Print_On_LCD_Pos(10,2," ");
_delay_ms(400);
Print_On_LCD_Pos(10,2,"67%");
_delay_ms(400);
} else {
state = 0;
}
扩展,也许你可以/应该用更多的状态转换替换_delay_ms(...)
调用。由于所有延迟都是200ms的倍数,你可以每200ms执行一次状态机,减少一些等待状态计数器,如果它不是0则立即返回。这释放了大量的CPU资源,实际上是最常见的原因除了C的缺乏轻量并发编程功能外,首先要建立一个状态机。