2017-06-04 117 views
0

我在問這是因爲下面的代碼是我用來使2個兩個LED完全交替閃爍。但它爲什麼這個工作並沒有意義。這個帶有2個xor的環路有2個狀態,一個是pin1(紅色點亮),另一個是引腳6和pin1都處於活動狀態(紅色和綠色點亮)。但是燈光閃爍,就像它們在彼此之間完美地交替開關一樣。從for循環結束回到msp430的開始需要多少時間?

#include <msp430g2553.h> 

// counter as a global variable 
unsigned int i = 0; 

void main(void) 
{ 
    // stop the watchdog timer 
    WDTCTL = WDTPW + WDTHOLD; 

    // set the direction register for LED1 and LED2 
    P1DIR |= 0x41; 

    // initialize LED1 and LED2 to off 
    P1OUT &= 0xBE; 

    //empty for loop is an infinite loop 
    for (;;) 
    { 
     P1OUT ^= 0x01; 

     // create a delay between toggles 
     for(i=0; i< 20000; i++) 
     {  
      // empty statement, do nothing 
     } 

     P1OUT ^= 0x40; 
    } 
} 

主循環的延遲是否有可能導致這種錯覺?

+0

不能從您提供什麼來決定。 –

+0

爲了更好地理解發生了什麼,在無限循環結束之前添加延遲循環的副本。 –

+0

如果您希望他人閱讀您的代碼,如果格式化爲可讀性,則可能更有禮貌,更吸引觀衆。空格和縮進也有助於你理解。爲您重新格式化。 – Clifford

回答

4

答案是,回到循環的開始非常快。

這段代碼看起來像應該替代我的LED。你的評論看起來好像很糟糕。

它的主要部分是在你的循環中。你首先關閉兩個LED。那麼做到這一點(我已經改變了意見,我認爲他們這樣做):

for (;;) {     // infinite loop 
    P1OUT ^= 0x01;   // toggle state of LED1 
    for(i=0; i< 20000; i++) // create a delay 
     ; 
    P1OUT ^= 0x40;   // toggle state of LED2 
} 

這樣做什麼的,不上不下的循環是:

     LED1   LED2 
         off   off 

start into loop 

Toggle LED1   on   off 
wait 
wait 
wait 
Toggle LED2   on   on { go back to start of loop - quickly } 
Toggle LED1   off   on 
wait 
wait 
wait 
Toggle LED2   off   off 
Toggle LED1   on   off 
wait 
... 
+0

是的,我很抱歉評論它是我編輯的教科書代碼,但我沒有修改評論。感謝你的例子確實幫助我想象它。 – Destreation