If statement 将嵌套if转换为开关

If statement 将嵌套if转换为开关,if-statement,nested,switch-statement,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&

我想把这些嵌套的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);
              }
           }
      }
    } 
(i=1;i0;j--)的

{
在液晶显示器上打印位置(j,2,“湿度:67%”);
在液晶显示器上打印位置((j+13),2“”;
_延时μms(200);
如果(j==1)
{
在LCD位置(10,2“”)上打印;
_延迟时间(400);
在液晶显示器上打印位置(10,2,“67%”);
_延迟时间(400);
在LCD位置(10,2“”)上打印;
_延迟时间(400);
在液晶显示器上打印位置(10,2,“67%”);
_延迟时间(400);
}
}
}
} 
我有点困惑,因为如何在没有案例共享数据的情况下跟踪递增/递减变量。这里的困境是,正如你们所知,对于有限状态机,它们是按顺序运行的,所以在案例1运行时,它可能会与另一个案例共享一些数据,除非我提出一些限制,但这些是going很像不必要的长代码


有人想分享一种简洁的方法吗?

这样的方法怎么样:

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;

}
static uint16\u t state=0;
状态++;
如果(状态<17){
const uint16_t i=状态;
在LCD上打印位置(i,2,“湿度:67%”;//仅举一个例子
在液晶显示器上打印位置((i-1),2“”;
_延迟时间(600);
}否则
如果(状态<32){
常数16_t j=16-(32-状态);
在液晶显示器上打印位置(j,2,“湿度:67%”);
在液晶显示器上打印位置((j+13),2“”;
_延时μms(200);
}否则
如果(状态==32){
在LCD位置(10,2“”)上打印;
_延迟时间(400);
在液晶显示器上打印位置(10,2,“67%”);
_延迟时间(400);
在LCD位置(10,2“”)上打印;
_延迟时间(400);
在液晶显示器上打印位置(10,2,“67%”);
_延迟时间(400);
}否则{
状态=0;
}

在此基础上,也许您可以/应该替换
\u delay\u ms(…)
具有更多状态转换的调用。由于所有延迟都是200毫秒的倍数,您可以每200毫秒执行一次状态机,减少一些等待状态计数器,如果不是0,则立即返回。这释放了大量CPU资源,实际上是除C的缺席外,首先构建状态机的最常见原因轻量级并发编程的功能。

这是什么语言?嗨,伙计,它是c,“在LCD上打印(uint16\u t x,uint16\u t y,字符*字符串)”是我用来在2x16十六进制LCD上显示数据的LCD函数。