2016年8月28日 星期日

Arduino專案_LED矩陣顯示器3

前面練習過了用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);
  }
}




完成影片:


1 則留言: