HELLO 跑馬燈

 #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); // 跑馬燈速度

  }

}


留言