前面練習過了用LED矩陣顯示靜態和動態圖像,這次要做的是捲動字元,
也是一種動態圖像的呈現。利用 fonts.h 程式檔,可以快速取得電腦中
ASCII編碼中的127個字元圖像定義。
要讓字元產生向左捲動的效果,就是讓後一行的LED資料複製給前一行,
第1行←第2行,第2行←第3行,……第7行←第8行,那第8行的資料呢?
就要去抓下一個字元的第1行資料複製到第8行來。跑完一輪後,就能發現
字元圖像向左移動了1行,如此不斷地循環,便能產生捲動效果。但第2輪
的第8行是去抓下一個字元的第2行喔!
實際的程式碼是利用陣列、迴圈和自定函數來完成字元捲動效果。這裡就
不詳細說明程式碼的內容,可上網查閱資料或看相關書籍便能更清楚瞭解。
fonts.h 沒有內建,因此要將它複製到程式庫中,編譯時才不會出現錯誤。
程式碼:
#include <SPI.h>
#include <fonts.h>
byte buf[8] = {0, 0, 0, 0, 0, 0, 0, 0};
char msg[] = { 'L', 'Y', 'C', 'D', 'I', 'Y', '!', ' ' }; //想要顯示的字元
int msgSize = sizeof(msg); //計算字串陣列的元素數量
const byte NOOP = 0x0; //定義暫存器常數
const byte DECODEMODE = 0x9;
const byte INTENSITY = 0xA;
const byte SCANLIMIT = 0xB;
const byte SHUTDOWN = 0xC;
const byte DISPLAYTEST = 0xF;
void max7219(byte reg, byte data) { //傳輸資料自定函數
digitalWrite(SS, LOW);
SPI.transfer(reg);
SPI.transfer(data);
digitalWrite(SS, HIGH);
}
void scroll(byte chr) { //捲動字元自定函數
for (byte j = 0; j < 8; j++) {
for (byte i = 0; i < 7; i++) {
buf[i] = buf[i+1];
max7219 (i + 1, buf[i]);
}
buf[7] = fonts[chr][j];
max7219 (8, buf[7]);
delay(300);
}
}
void setup() {
pinMode(SS, OUTPUT);
digitalWrite(SS, HIGH);
SPI.begin();
max7219 (SCANLIMIT, 7);
max7219 (DECODEMODE, 0);
max7219 (INTENSITY, 8);
max7219 (DISPLAYTEST, 0);
max7219 (SHUTDOWN, 1);
for (byte i = 0; i < 8; i++) {
max7219 (i + 1, 0);
}
}
void loop() {
byte chr;
for (int i = 0; i < msgSize; i++) {
chr = msg[i];
scroll(chr);
}
}
完成影片:
作者已經移除這則留言。
回覆刪除