排燈,用 bit/byte 的方式表示圖案

用 bit 的方式來表示每排燈(也恰好為8個)的亮滅

  • 節省記憶體
  • 需了解 bit/Byte 之間的觀念
  • 需熟悉 bit 的運算及邏輯

教學參考

基礎程式

#define PIN_TOTAL 8 int PIN_ARRAY[8] = {4, 5, 6, 7, 8, 9, 10, 11}; void setup() { for(int i=0; i<PIN_TOTAL; i++) { pinMode(PIN_ARRAY[i], OUTPUT); } } void led_bar(byte data) { for(int b=0; b<8; b++) { digitalWrite(PIN_ARRAY[b], data & (B10000000>>b)); } } void loop() { led_bar(B10101010); delay(500); led_bar(B01010101); delay(500); }

解說 bit 運算概念

參考下列範例,可檢查 serial monitor 的值。

#define PIN_TOTAL 8 int PIN_ARRAY[8] = {4, 5, 6, 7, 8, 9, 10, 11}; void setup() { for(int i=0; i<PIN_TOTAL; i++) { pinMode(PIN_ARRAY[i], OUTPUT); } Serial.begin(9600); } void led_bar(byte data) { Serial.println(""); Serial.print(data); Serial.print("-->"); Serial.print(data, BIN); Serial.print(": "); // 逐一取得各個位元 digitalWrite(PIN_ARRAY[0], data & B10000000); digitalWrite(PIN_ARRAY[1], data & B01000000); digitalWrite(PIN_ARRAY[2], data & B00100000); digitalWrite(PIN_ARRAY[3], data & B00010000); digitalWrite(PIN_ARRAY[4], data & B00001000); digitalWrite(PIN_ARRAY[5], data & B00000100); digitalWrite(PIN_ARRAY[6], data & B00000010); digitalWrite(PIN_ARRAY[7], data & B00000001); // 由低位元往高位元 /* for(int b=0; b<8; b++) { // digitalWrite(PIN_ARRAY[b], data & (B10000000>>b)); if(data & (B10000000>>b)) { Serial.print('1'); digitalWrite(PIN_ARRAY[b], HIGH); } else { Serial.print('0'); digitalWrite(PIN_ARRAY[b], LOW); } } */ } void loop() { int u= 200; led_bar(B10000000); delay(u); led_bar(B01000000); delay(u); led_bar(B00100000); delay(u); led_bar(B00010000); delay(u); led_bar(B00001000); delay(u); led_bar(B00000100); delay(u); led_bar(B00000010); delay(u); led_bar(B00000001); delay(u); }

應用:更多樣變化

#define PIN_TOTAL 8 int PIN_ARRAY[8] = {4, 5, 6, 7, 8, 9, 10, 11}; int u = 100; void setup() { for(int i=0; i<PIN_TOTAL; i++) { pinMode(PIN_ARRAY[i], OUTPUT); } } void led_bar(byte data) { for(int b=0; b<8; b++) { digitalWrite(PIN_ARRAY[b], data & (B10000000>>b)); } } void loop() { for(int i=0; i<10; i++) { type1(); } for(int i=0; i<3 ; i++) { type2(); } for(int i=0; i<5 ; i++) { type3(); } for(int i=0; i<5 ; i++) { type4(); } for(int i=0; i<8 ; i++) { type5(); } for(int i=0; i<5 ; i++) { type6(); } for(int i=0; i<10; i++) { type7(); } for(int i=0; i<10; i++) { type8(); } for(int i=0; i<10; i++) { type9(); } } void type1() { led_bar(B10101010); delay(u); led_bar(B01010101); delay(u); } void type2() { led_bar(B10000000); delay(u); led_bar(B01000000); delay(u); led_bar(B00100000); delay(u); led_bar(B00010000); delay(u); led_bar(B00001000); delay(u); led_bar(B00000100); delay(u); led_bar(B00000010); delay(u); led_bar(B00000001); delay(u); led_bar(B00000010); delay(u); led_bar(B00000100); delay(u); led_bar(B00001000); delay(u); led_bar(B00010000); delay(u); led_bar(B00100000); delay(u); led_bar(B01000000); delay(u); led_bar(B10000000); delay(u); } void type3() { led_bar(B11111111); delay(u); led_bar(B00000000); delay(u); } void type4() { led_bar(B11100000); delay(u); led_bar(B01110000); delay(u); led_bar(B00111000); delay(u); led_bar(B00011100); delay(u); led_bar(B00001110); delay(u); led_bar(B00000111); delay(u); led_bar(B10000011); delay(u); led_bar(B11000001); delay(u); } void type5() { led_bar(B10000001); delay(u); led_bar(B01000010); delay(u); led_bar(B00100100); delay(u); led_bar(B00011000); delay(u); led_bar(B00100100); delay(u); led_bar(B01000010); delay(u); } void type6() { led_bar(B00000000); delay(u); led_bar(B10000001); delay(u); led_bar(B11000011); delay(u); led_bar(B11100111); delay(u); led_bar(B11111111); delay(u); led_bar(B01111110); delay(u); led_bar(B00111100); delay(u); led_bar(B00011000); delay(u); } void type7() { led_bar(B00000000); delay(u); led_bar(B11111111); delay(u); } void type8() { led_bar(B11001100); delay(u); led_bar(B00110011); delay(u); } void type9() { led_bar(B11110000); delay(u); led_bar(B00001111); delay(u); }
Select a repo