2011年2月10日 星期四

點矩陣 LED 5x7

這篇文章是使用 Arduino Duemilanove 來控制 5x7 的點矩陣 LED,輪流顯示數字 0~9 及符號 *、#。



程式碼

#define MAX_NUM 12
#define ROWS 7
#define COLS 5

// Define 5x7 LED Row & Column Pin
const int row[ROWS] = {7, 6, 5, 4, 3, 2, 1};
const int col[COLS] = {12, 11, 10, 9, 8};

// Matrix LED
//  C4 C3 C2 C1 C0
//  O  O  O  O  O  R6
//  O  O  O  O  O  R5
//  O  O  O  O  O  R4
//  O  O  O  O  O  R3
//  O  O  O  O  O  R2
//  O  O  O  O  O  R1
//  O  O  O  O  O  R0
const char matrix[MAX_NUM][ROWS] = {
  {0x1F, 0x11, 0x11, 0x11, 0x11, 0x11, 0x1F}, // Number: 0
  {0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04}, // Number: 1
  {0x1F, 0x01, 0x01, 0x1F, 0x10, 0x10, 0x1F}, // Number: 2
  {0x1F, 0x01, 0x01, 0x1F, 0x01, 0x01, 0x1F}, // Number: 3
  {0x11, 0x11, 0x11, 0x1F, 0x01, 0x01, 0x01}, // Number: 4
  {0x1F, 0x10, 0x10, 0x1F, 0x01, 0x01, 0x1F}, // Number: 5
  {0x1F, 0x10, 0x10, 0x1F, 0x11, 0x11, 0x1F}, // Number: 6
  {0x1F, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01}, // Number: 7
  {0x1F, 0x11, 0x11, 0x1F, 0x11, 0x11, 0x1F}, // Number: 8
  {0x1F, 0x11, 0x11, 0x1F, 0x01, 0x01, 0x1F}, // Number: 9
  {0x00, 0x15, 0x0A, 0x1F, 0x0E, 0x15, 0x00}, // Number: *
  {0x00, 0x0A, 0x1F, 0x0A, 0x1F, 0x0A, 0x00}, // Number: #
};

int gNum;

void clearLEDs(void) {
  for (int r = 0; r < ROWS; r++) {
    digitalWrite(row[r], LOW);
  }
  
  for (int c = 0; c < COLS; c++) {
    digitalWrite(col[c], HIGH);
  }
}

void writeNum(int num) {
    gNum = num;
}

void refreshMatrix(void) {
  int r, c, onOff;
  char mask;

  for (r = 0; r < ROWS; r++) {
    digitalWrite(row[r], HIGH);
 mask = 0x10;

    for (c = 0; c < COLS; c++, mask >>= 1) {
      onOff = matrix[gNum][r] & mask;
      if (onOff)
        digitalWrite(col[c], LOW);
      
      delayMicroseconds(50);
      digitalWrite(col[c], HIGH);
    }

    digitalWrite(row[r], LOW);
  }
}

void setup() {
  for (int r = 0; r < ROWS; r++) {
    pinMode(row[r], OUTPUT);
  }
  
  for (int c = 0; c < COLS; c++) {
    pinMode(col[c], OUTPUT);
  }
  
  clearLEDs();
  writeNum(0);
}

void loop() {
  // Refresh 5x7 Matrix LEDs
  for (int i = 0; i < 1000; i++)
    refreshMatrix();
  
  // Display next number
  if (++gNum >= MAX_NUM) {
    gNum = 0;
  }
}


執行結果


參考資料

5 則留言:

  1. 標準 Fritzing 還沒有點矩陣 LED (Matrix LED) 的料件,可以到這邊搜尋一下(http://code.google.com/p/fritzing/issues/detail?id=875),這裏有很多使用者自建的(User Created) Fritzing 料件。

    我剛找到一個 5x7 LED Matrix:
    http://fritzing.googlecode.com/issues/attachment?aid=7098017370881413167&name=5x7+LED+matrix.fzpz&token=85e5c6bc3d4e899d623efc4fd7f89c8c

    雖然外觀還有待加強,不過應該可以用。

    回覆刪除
  2. 謝謝
    剛發現原來 Fritzing 軟體本身就可以編輯已經存在的元件,也可以自己定義新元件。

    回覆刪除
  3. Fritzing 怎麼定義新元件?寫一篇教一下吧。

    回覆刪除
  4. 說真得,Fritzing 還不是真得很熟,有嘗試做一個元件出來,但仍怪怪的,因我是使用 Word 畫好圖後,匯入擷圖發現 Pin 腳無法對到麵包板的孔,若有需要的話,在http://fritzing.org/learning/tutorials/creating-custom-parts/ 有介紹。等研究出來後,我再寫一篇分享心得(還談不上什麼教學,只是心得分享而已)

    回覆刪除
  5. 作者已經移除這則留言。

    回覆刪除