#define DIN 12
#define CS 10
#define CLK 11
// 標準 5x7 字型 (這裡只列 H,E,L,O)
const byte font[][5] = {
{0x7F,0x08,0x08,0x08,0x7F}, // H
{0x7F,0x49,0x49,0x49,0x41}, // E
{0x7F,0x40,0x40,0x40,0x40}, // L
{0x3E,0x41,0x41,0x41,0x3E} // O
};
const char text[] = "HELLO";
byte buffer[100];
int bufLen = 0;
void sendData(byte addr, byte data) {
digitalWrite(CS, LOW);
shiftOut(DIN, CLK, MSBFIRST, addr);
shiftOut(DIN, CLK, MSBFIRST, data);
digitalWrite(CS, HIGH);
}
void clearDisplay() {
for (byte i = 1; i <= 8; i++) {
sendData(i, 0x00);
}
}
void setup() {
pinMode(DIN, OUTPUT);
pinMode(CS, OUTPUT);
pinMode(CLK, OUTPUT);
// 初始化 MAX7219
sendData(0x0F, 0x00);
sendData(0x0C, 0x01);
sendData(0x0B, 0x07);
sendData(0x0A, 0x08);
sendData(0x09, 0x00);
clearDisplay();
// 將字串轉換成 buffer
for (int i = 0; text[i] != '\0'; i++) {
byte idx;
switch (text[i]) {
case 'H': idx = 0; break;
case 'E': idx = 1; break;
case 'L': idx = 2; break;
case 'O': idx = 3; break;
default: continue;
}
for (int col = 0; col < 5; col++) {
buffer[bufLen++] = font[idx][col];
}
buffer[bufLen++] = 0x00; // 字母間隔
}
}
void loop() {
for (int shift = 0; shift < bufLen; shift++) {
for (byte row = 1; row <= 8; row++) {
byte colData = 0;
for (int bit = 0; bit < 8; bit++) {
int pos = shift + bit;
if (pos < bufLen) {
if (buffer[pos] & (1 << (row-1))) {
colData |= (1 << (7-bit));
}
}
}
sendData(row, colData);
}
delay(200); // 跑馬燈速度
}
}
留言
張貼留言