将嵌套转换为switch

时间:2014-11-24 15:36:01

标签: if-statement nested switch-statement

我希望将这些嵌套的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运行的情况下它可能与另一个案例共享一些数据,除非我设置了一些课程限制,但这些很像不必要的长代码。

任何人都可以分享一种巧妙的方式吗?

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的缺乏轻量并发编程功能外,首先要建立一个状态机。