2014-11-24 65 views
0

我很想将这些嵌套的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

这是什么语言? – Kevin 2014-11-24 15:58:04

+0

嗨伙计,它是c,“Print_On_LCD_Pos(uint16_t x,uint16_t y,char * string_of_line)”是一个LCD函数,我用它在2x16十六进制LCD上显示数据。 – 2014-11-25 04:40:19

回答

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的轻量级并发编程功能之外,它还是一台机器。