#include <LedControl.h>
// 初始化 LedControl 物件 (DIN, CLK, CS, 模組數量)
LedControl lc = LedControl(12, 10, 11, 4); // 設定為 1 個模組
// // 字母 "T" 的點陣數據
// byte letter_T[8] =
// {
// B00000000,
// B00001000,
// B00001000,
// B00001000,
// B00001000,
// B00001000,
// B00001000,
// B01111111
// };
// // 字母 "i" 的點陣數據
// byte letter_i[8] =
// {
// B00000000,
// B00001000,
// B00001000,
// B00001000,
// B00000000,
// B00001000,
// B00000000,
// B00000000
// };
// // 字母 "n" 的點陣數據
// byte letter_n[8] =
// {
// B00000000,
// B00100010,
// B00100010,
// B00100010,
// B00110010,
// B00101100,
// B00000000,
// B00000000
// };
// // 字母 "g" 的點陣數據
// byte letter_g[8] =
// {
// B00111100,
// B00100100,
// B00000100,
// B00111100,
// B00100100,
// B00111100,
// B00000000,
// B00000000
// };
byte fontData[][8]
{ //T--0
{ B00000000, B00001000, B00001000, B00001000, B00001000, B00001000, B00001000, B01111111},
//i--1
{ B00000000, B00001000, B00001000, B00001000, B00000000, B00001000, B00000000, B00000000},
//n--2
{ B00000000, B00100010, B00100010, B00100010, B00110010, B00101100, B00000000, B00000000},
//g--3
{ B00111100, B00100100, B00000100, B00111100, B00100100, B00111100, B00000000, B00000000},
//a--4
{ B00000000, B00111100, B01000100, B00111100, B00000100, B00111000, B00000000, B00000000},
//k--5
{ B00000000, B00100100, B00101000, B00110000, B00101000, B00100100, B00100000, B00100000},
//B--6
{ B00000000, B00111100, B00010010, B00010010, B00011100, B00010010, B00010010, B00111100},
//o--7
{ B00000000, B00111000, B01000100, B01000100, B01000100, B00111000, B00000000, B00000000},
//s--8
{ B00000000, B01111000, B00000100, B00111000, B01000000, B00111000, B00000000, B00000000},
//H--9
{ B00000000, B01000010, B01000010, B01000010, B01111110, B01000010, B01000010, B01000010},
//p--10
{ B00000000, B00100000, B00100000, B00111000, B00100100, B00111000, B00000000, B00000000},
//y--11
{ B00000000, B00011100, B00000010, B00011110, B00100010, B00100010, B00000000, B00000000},
//r--12
{ B00000000, B00100000, B00100000, B00100000, B00110010, B00101100, B00000000, B00000000},
//t--13
{ B00000000, B00001100, B00010010, B00010000, B01111100, B00010000, B00010000, B00000000},
//h--14
{ B00000000, B00100010, B00100010, B00110010, B00101100, B00100000, B00100000, B00000000},
//d--15
{ B00000000, B00011110, B00100010, B00100110, B00011010, B00000010, B00000010, B00000000},
// number1--16
{ B00000000, B01111110, B00010000, B00010000, B01010000, B00110000, B00010000, B00000000},
//number8--17
{ B00000000, B00111000, B01000100, B01000100, B00111000, B01000100, B01000100, B00111000},
//smile--18
{ B00010000, B00001000, B01000100, B00000100, B00000100, B01000100, B00001000, B00010000}
};
// int message[] = {0, 1, 2, 3, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14};
//
void setup()
{
// 初始化模組
lc.shutdown(0, false); // 打開顯示
lc.setIntensity(0, 8); // 設定亮度 (0-15)
lc.clearDisplay(0); // 清空顯示
// displayMessage();
}
void loop()
{
// displayLetter_T();
// delay(1000);
// displayLetter_i();
// delay(1000);
// displayLetter_n();
// delay(1000);
// displayLetter_g();
// delay(1000);
// outputMessage("Ting aka Boss");
scrollMessage();
}
// void scrollMessage() {
// int outputMessage[]={0, 1, 2, 3, 4, 5, 4, 6, 7, 8, 8, 9, 4, 10, 10, 11, 6, 1, 12, 13, 14, 15, 4, 11};
// int totalColumns = 32; // 顯示區域的總列數 (32列)
// int totalChars = sizeof(outputMessage) / sizeof(outputMessage[0]); // 假設最大字串長度為 6 個字符,這是可調整的
// int scrollDelay=50;
// // 計算需要顯示的列數:每個字母需要 8 列 (一個字母 8 x 8 點陣)
// int totalDisplayColumns = totalChars * 8; // 最大字串長度 * 每個字母的寬度(8列)
// // 從右向左捲動顯示,直至字串顯示完畢
// for (int col = 0; col < totalDisplayColumns + totalColumns; col++) {
// for (int module = 0; module < 4; module++) {
// for (int row = 0; row < 8; row++) {
// // 計算顯示哪個字母
// int charIndex = (col + module * 8) / 8; // 目前的列對應的字母索引
// // 計算該列在字母內部的列位置
// int charColumn = (col + module * 8) % 8;
// // 如果字母在字串範圍內,顯示它的對應列;否則顯示空白
// if (charIndex < totalChars)
// {
// lc.setRow(module, row, (fontData[outputMessage[charIndex]][row] << charColumn) & 0xFF);
// }
// else
// {
// break;
// }
// }
// }
// delay(scrollDelay); // 控制每次移動的間隔時間,決定捲動速度
// }
// }
void scrollMessage() {
// int outputMessage[] = {0, 1, 2, 3, 4, 5, 4, 6, 7, 8, 8, 9, 4, 10, 10, 11, 6, 1, 12, 13, 14, 15, 4, 11};
// {T, i, n, g, a, k, a, B, o, s, s, H, a, p , p , y , B, i, r , t , h , d , a, y }
int outputMessage[] = {16, 16, 16, 17, 6, 7, 8, 8, 0, 1, 2, 3, 9, 4, 10, 10, 11, 6, 1, 12, 13, 14, 15, 4, 11, 18};
// {B, o, s, s, T, i, n, g ,H, a, p , p , y , B, i, r , t , h , d , a, y }
int totalColumns = 32; // 顯示區域的總列數 (32列)
int totalChars = sizeof(outputMessage) / sizeof(outputMessage[0]); // 字串長度
int scrollDelay = 100;
int totalDisplayColumns = totalChars * 8; // 總顯示列數
// 從右向左逐列捲動,直到字串顯示完畢
for (int col = 0; col < totalDisplayColumns + totalColumns; col++) {
for (int module = 0; module < 4; module++) {
for (int row = 0; row < 8; row++) {
// 計算目前應顯示的字母索引和字母內部列
int charIndex = (col + module * 8) / 8;
int charColumn = (col + module * 8) % 8;
// 初始化要顯示的列
byte displayRow = 0;
// 如果字母在字串範圍內,逐列顯示該字母
if (charIndex < totalChars) {
displayRow = (fontData[outputMessage[charIndex]][row] << charColumn) & 0xFF;
// 如果下個字母也在範圍內,混合顯示,讓字母逐列銜接
if (charColumn > 0 && charIndex + 1 < totalChars) {
displayRow |= fontData[outputMessage[charIndex + 1]][row] >> (8 - charColumn);
}
}
// 在模組顯示行資料
lc.setRow(module, row, displayRow);
}
}
delay(scrollDelay); // 控制捲動速度
}
}
// // 顯示字母 "T"
// void displayLetter_T()
// {
// for (int row = 0; row < 8; row++)
// {
// lc.setRow(0, row, letter_T[row]);
// }
// }
// // 顯示字母 "i"
// void displayLetter_i()
// {
// for (int row = 0; row < 8; row++)
// {
// lc.setRow(1, row, letter_i[row]);
// }
// }
// // 顯示字母 "n"
// void displayLetter_n()
// {
// for (int row = 0; row < 8; row++)
// {
// lc.setRow(3, row, letter_n[row]);
// }
// }
// // 顯示字母 "g"
// void displayLetter_g()
// {
// for (int row = 0; row < 8; row++)
// {
// lc.setRow(4, row, letter_g[row]);
// }
// }