# 排燈,用 bit/byte 的方式表示圖案
用 bit 的方式來表示每排燈(也恰好為8個)的亮滅
- 節省記憶體
- 需了解 bit/Byte 之間的觀念
- 需熟悉 bit 的運算及邏輯
## 教學參考
- [Bit Math Tutorial by CosineKitty](https://playground.arduino.cc/Code/BitMath/)
- [Working with Bytes](https://www.thethingsnetwork.org/docs/devices/bytes.html)
## 基礎程式
```Arduino=
#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 的值。
```Arduino=
#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);
}
```
## 應用:更多樣變化
```Arduino=
#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);
}
```