2014-11-24 72 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的輕量級併發編程功能之外,它還是一臺機器。