#include <SPI.h> // 包含 SPI 函式庫
unsigned char reverse(unsigned char b) {
// 將一個字節的位元反轉
b = (b & 0xF0) >> 4 | (b & 0x0F) << 4; // 交換半字節
b = (b & 0xCC) >> 2 | (b & 0x33) << 2; // 交換內兩個位元
b = (b & 0xAA) >> 1 | (b & 0x55) << 1; // 交換相鄰位元
return b;
}
void max7219(byte reg, byte data) {
// 傳送資料到 MAX7219 LED 矩陣
digitalWrite(SS, LOW); // 啟用從屬選擇引腳
SPI.transfer(reg); // 傳送寄存器地址
SPI.transfer(reverse(data)); // 傳送反轉的資料
digitalWrite(SS, HIGH); // 停用從屬選擇引腳
}
byte ledMatrix[8] = {0, 0, 0, 0, 0, 0, 0, 0}; // 全域陣列,儲存 LED 矩陣資料
void setLED(int x, int y, bool state) {
// 設定矩陣中 LED 的狀態
if (state) {
ledMatrix[y] |= (1 << x); // 設定 LED 矩陣陣列中相應的位元
} else {
ledMatrix[y] &= ~(1 << x); // 清除 LED 矩陣陣列中相應的位元
}
max7219(y + 1, ledMatrix[y]); // 傳送更新的資料到相應的 MAX7219 晶片
}
void setup() {
// 初始化 SPI 通訊和 MAX7219 晶片
pinMode(SS, OUTPUT); // 設定從屬選擇引腳為輸出
digitalWrite(SS, HIGH); // 初始化時將從屬選擇引腳設定為 HIGH
SPI.begin(); // 初始化 SPI 通訊
for (byte i = 0; i < 8; i++) {
max7219(i + 1, 0); // 清除每個 MAX7219 晶片上的所有 LED
}
}
void loop() {
// 在矩陣中開啟和關閉 LED
setLED(5, 2, true); // 開啟位置 (3, 3) 的 LED
delay(500); // 等待 500 毫秒
setLED(5, 2, false);
delay(500);
setLED(4, 2, true);
delay(500);
setLED(4, 2, false);
delay(500);
setLED(4, 3, true);
delay(500);
setLED(4, 3, false);
delay(500);
setLED(5, 3, true);
delay(500);
setLED(5, 3, false); // 關閉位置 (3, 3) 的 LED
delay(500); // 等待 500 毫秒
}