// ///////////////////////////////////////////////////////////////////////////////////////////
// /*
// 電子元件: LED Dot Matrix with MAX7219 Controller_SPI介面(序列周邊介面)
// 功能:控制1個LED矩陣顯示1個畫面
// */
// #include<SPI.h> // 引用 arduino內建 SPI 程式庫
// //// 接線
// // CS : GPIO5
// // CLK : GPIO18
// // DATA(MOSI) : GPIO23
// const byte CS = 5; // Chip Select晶片選擇線(SS周邊選擇線)
// //// 繪圖資料
// // 矩陣參數生成網站
// // https://www.riyas.org/2013/12/online-led-matrix-font-generator-with.html
// // 音符繪圖
// const byte symbol[8] = {0x18,0x1c,0x1e,0x13,0x70,0xf0,0xf0,0x60};
// //// bit reversal
// // 將資料位元翻轉成所需的順位(高位-低位? 低位- 高位?)
// byte reverse(byte b){
// b = (b & 0xF0) >> 4 | (b & 0x0F) << 4;
// b = (b & 0xCC) >> 2 | (b & 0x33) << 2;
// b = (b & 0xAA) >> 1 | (b & 0x55) << 1;
// return(b);
// };
// //// MAX7219暫存器位址(16進制)
// // 資料暫存器位址為 0x1~0x8
// const byte NOOP = 0x0; // 不運作
// const byte DECODEMODE = 0x9; // 解碼模式
// const byte INTENSITY = 0xA; // 顯示強度
// const byte SCANLIMIT = 0xB; // 掃描限制
// const byte SHUTDOWN = 0xC; // 停機
// const byte DISPLAYTEST = 0xF; // 顯示器檢測
// //// 設定 MAX7219 暫存器資料的自訂函數
// // MAX7219每次接收16位元的數據
// // reg 為暫存器的位址 ; data 為要傳送的資料
// void max7219(byte reg, byte data){
// digitalWrite(CS, LOW); // 傳送或接收資料前CS腳位需設為0
// SPI.transfer(reg); // 傳送暫存器的位址
// SPI.transfer(reverse(data)); // 傳送資料
// digitalWrite(CS, HIGH); // 傳送結束CS腳位需設為1
// }
// void setup() {
// pinMode(CS, OUTPUT); // 設定CS腳位為輸出模式
// digitalWrite(CS, HIGH); // CS腳位設為高電位表示尚不傳輸
// SPI.begin(); // 啟動SPI連線
// max7219(DECODEMODE, 0); // 解碼模式 // 設定為0表示不使用BCD解碼
// max7219(INTENSITY, 8); // 顯示強度 // 設定亮度0~15
// max7219(SCANLIMIT, 7); // 掃描限制 // 設定掃描顯示器的個數0~7,設定為7為顯示LED矩陣所有行數8行
// max7219(SHUTDOWN, 1); // 停機 // 關閉停機模式,亦即開機
// //max7219(DISPLAYTEST, 1); // 顯示器檢測 // 開啟顯示器檢測點亮所有LED
// //delay(1000);
// max7219(DISPLAYTEST, 0); // 顯示器檢測 // 關閉顯示器檢測
// // 清除顯示畫面(LED矩陣中的8行都設為0)
// for(byte i = 0; i < 8; i++){
// max7219(i + 1 , 0);
// }
// // 顯示自訂圖像
// for(byte i = 0; i < 8; i++){
// max7219(i + 1 , symbol[i]);
// }
// }
// void loop() {
// }
// ///////////////////////////////////////////////////////////////////////////////////////////
// // /////////////////////////////////////////////////////////////////////////////////////////////////
/*
電子元件: LED Dot Matrix with MAX7219 Controller_SPI介面(序列周邊介面)
功能:控制1個LED矩陣顯示動畫
*/
#include<SPI.h> // 引用arduino內建 SPI 程式庫
//// 接線
// CS : GPIO5
// CLK : GPIO18
// DATA(MOSI) : GPIO23
const byte CS = 5; // Chip Select晶片選擇線(SS周邊選擇線)
//// 繪圖資料
// 矩陣參數生成網站
// https://www.riyas.org/2013/12/online-led-matrix-font-generator-with.html
// 小綠人繪圖
byte person[9][8] = {
{0x60, 0x60, 0x30, 0x78, 0x18, 0x34, 0x22, 0x66},
{0x60, 0x60, 0x30, 0x7C, 0x5A, 0x34, 0x22, 0x42},
{0x60, 0x60, 0x30, 0x7C, 0xB2, 0x18, 0x66, 0x02},
{0xC0, 0xC0, 0x78, 0x64, 0xB0, 0x28, 0xC6, 0x02},
{0xC0, 0xC0, 0x60, 0x78, 0xB4, 0x3A, 0x26, 0xE2},
{0xC0, 0xC0, 0x60, 0x78, 0xB4, 0x32, 0x4C, 0xC4},
{0xC0, 0xC0, 0x60, 0x78, 0x74, 0x30, 0x58, 0x28},
{0x60, 0x60, 0x30, 0x38, 0x18, 0x14, 0x1C, 0x04},
{0x18, 0x18, 0x3C, 0x5A, 0x5A, 0x18, 0x24, 0x66}
};
//// bit reversal
// 將資料位元翻轉成所需的順位(高位-低位? 低位- 高位?)
byte reverse(byte b){
b = (b & 0xF0) >> 4 | (b & 0x0F) << 4;
b = (b & 0xCC) >> 2 | (b & 0x33) << 2;
b = (b & 0xAA) >> 1 | (b & 0x55) << 1;
return(b);
};
//// MAX7219暫存器位址(16進制)
// 資料暫存器位址為 0x1~0x8
const byte NOOP = 0x0; // 不運作
const byte DECODEMODE = 0x9; // 解碼模式
const byte INTENSITY = 0xA; // 顯示強度
const byte SCANLIMIT = 0xB; // 掃描限制
const byte SHUTDOWN = 0xC; // 停機
const byte DISPLAYTEST = 0xF; // 顯示器檢測
//// 設定 MAX7219 暫存器資料的自訂函數
// MAX7219每次接收16位元的數據
// reg 為暫存器的位址 ; data 為要傳送的資料
void max7219(byte reg, byte data){
digitalWrite(CS, LOW); // 傳送或接收資料前CS腳位需設為0
SPI.transfer(reg); // 傳送暫存器的位址
SPI.transfer(reverse(data)); // 傳送資料
digitalWrite(CS, HIGH); // 傳送結束CS腳位需設為1
}
void setup() {
pinMode(CS, OUTPUT); // 設定CS腳位為輸出模式
digitalWrite(CS, HIGH); // CS腳位設為高電位表示尚不傳輸
SPI.begin(); // 啟動SPI連線
max7219(DECODEMODE, 0); // 解碼模式 // 設定為0表示不使用BCD解碼
max7219(INTENSITY, 8); // 顯示強度 // 設定亮度0~15
max7219(SCANLIMIT, 7); // 掃描限制 // 設定掃描顯示器的個數0~7,設定為7為顯示LED矩陣所有行數8行
max7219(SHUTDOWN, 1); // 停機 // 關閉停機模式,亦即開機
//max7219(DISPLAYTEST, 1); // 顯示器檢測 // 開啟顯示器檢測點亮所有LED
//delay(1000);
max7219(DISPLAYTEST, 0); // 顯示器檢測 // 關閉顯示器檢測
// 清除顯示畫面(LED矩陣中的8行都設為0)
for(byte i = 0; i < 8; i++){
max7219(i + 1 , 0);
}
}
void loop() {
// 顯示自訂圖像
for(byte i = 0; i < 9; i++){
for(byte j = 0; j < 8; j++){
max7219(j + 1 , person[i][j]);
}
delay(200); //動畫圖片間格時間
}
delay(500); //動畫間格時間
}
// ///////////////////////////////////////////////////////////////////////////////////////////