While迴圈練習

使用for迴圈控制8個LED燈同時亮滅閃爍的程式如下:

int LED[8]={15,16,17,18,19,21,22,23}; // LED接腳陣列

void setup() {
  for(int i=0; i<=7; i++)
  {
    pinMode(LED[i],OUTPUT);     // LED[0]~LED[7]為輸出腳
    digitalWrite(LED[i], HIGH); // LED[0]~LED[7]全滅
  }
}

void loop() {
  for(int i=0; i<=7 ; i++)
  {
    digitalWrite(LED[i], LOW);  // LED[0]~LED[7]全亮
  }

  delay(500);

  for(int i=0; i<=7 ; i++)
  {
    digitalWrite(LED[i], HIGH); // LED[0]~LED[7]全滅
  }

  delay(500);
}

若使用while迴圈改寫,常見的方法有下列幾種:

第1種方法:while()

int LED[8]={15,16,17,18,19,21,22,23}; // LED接腳陣列

void setup() {
  // 方法1
  int i = 0;     // 初始值
  while (i <= 7) // 只要滿足while()的條件,則做{.....}內的程式
  {
    pinMode(LED[i], OUTPUT);    // LED[0]~LED[7]為輸出腳
    digitalWrite(LED[i], HIGH); // LED[0]~LED[7]全滅
    i++;                        // 做完一次加1
  }

}

void loop() {
  // 方法1
  int i = 0;     // 初始值
  while (i <= 7) // 只要滿足while()的條件,則做{.....}內的程式
  {
    digitalWrite(LED[i], LOW);  // LED[0]~LED[7]全亮
    i++;                        // 做完一次加1
  }
  
  delay(500);

  i = 0;         // 初始值
  while (i <= 7) // 只要滿足while()的條件,則做{.....}內的程式
  {
    digitalWrite(LED[i], HIGH); // LED[0]~LED[7]全滅
    i++;                        // 做完一次加1
  }

  delay(500);
}

第2種方法:無窮迴圈 + 條件判斷 while(1)…break

int LED[8]={15,16,17,18,19,21,22,23}; // LED接腳陣列

void setup() {
  // 方法2
  int i = 0;  // 初始值
  while (1)   // 永遠執行{.....}內的程式
  {
    pinMode(LED[i], OUTPUT);    // LED[0]~LED[7]為輸出腳
    digitalWrite(LED[i], HIGH); // LED[0]~LED[7]全滅
    i++;                        // 做完一次加1
    if(i > 7) break;            // 只要i>7,離開while(1)無窮迴圈
  }

}

void loop() {
  // 方法2
  int i = 0;  // 初始值
  while (1)   // 永遠執行{.....}內的程式
  {
    digitalWrite(LED[i], LOW);  // LED[0]~LED[7]全亮
    i++;                        // 做完一次加1
    if(i > 7) break;            // 只要i>7,離開while(1)無窮迴圈
  }
  
  delay(500);

  i = 0;      // 初始值
  while (1)   // 永遠執行{.....}內的程式
  {
    digitalWrite(LED[i], HIGH); // LED[0]~LED[7]全滅
    i++;                        // 做完一次加1
    if(i > 7) break;            // 只要i>7,離開while(1)無窮迴圈
  }

  delay(500);
}

第3種方法:do...while迴圈

do...while 迴圈會先執行迴圈內的程式碼,然後再檢查條件。即使條件一開始就不成立,迴圈內的程式碼也會至少執行一次。

int LED[8]={15,16,17,18,19,21,22,23}; // LED接腳陣列

void setup() {
  // 方法3
  int i = 0;  // 初始值
  do          // 先做一次{.....}的程式,再判斷while()條件是否成立
  {
    pinMode(LED[i], OUTPUT);    // LED[0]~LED[7]為輸出腳
    digitalWrite(LED[i], HIGH); // LED[0]~LED[7]全滅
    i++;                        // 做完一次加1
  } while(i <= 7);              // 若while()條件成立,則繼續執行{.....}的程式,否則就離開
}

void loop() {
  // 方法3
  int i = 0;  // 初始值
  do          // 先做一次{.....}的程式,再判斷while()條件是否成立
  {
    digitalWrite(LED[i], LOW);  // LED[0]~LED[7]全亮
    i++;                        // 做完一次加1
  } while(i <= 7);              // 若while()條件成立,則繼續執行{.....}的程式,否則就離開
  
  delay(500);

  i = 0;  // 初始值
  do      // 先做一次{.....}的程式,再判斷while()條件是否成立
  {
    digitalWrite(LED[i], HIGH); // LED[0]~LED[7]全滅
    i++;                        // 做完一次加1
  } while(i <= 7);              // 若while()條件成立,則繼續執行{.....}的程式,否則就離開

  delay(500);
}

作業練習:參考2025-09-25作業,使用while、while(1)…break、do…while()這三種語法改寫原for迴圈。

  1. 開機後,全亮全滅快閃2次。(方法1)
  2. 循環顯示下列狀態:
    • 單個LED,左去,右回。(方法2)
    • 單個LED,右去,左回。(方法2)
    • 全亮全滅快閃3次。(方法1)
    • 2個LED連在一起,左去,右回。(方法3)
    • 2個LED連在一起,右去,左回。(方法3)
    • 全滅。(方法1)
  3. 在Wokwi網站上進行模擬,並完成實體接線。