Arduino筆記(14):使用MAX7219 控制 8x8 LED Matrix

上次使用Raspberry Pi控制四位數七段顯示器時,腳位都接對了,但是一接上電源,四個數字的 LED全亮,找不出問題,懷疑是不是共陽或共陰極的關係,改天找時間再慢慢找問題。不過,利用這個機會,好好瞭解一下 MAX7219/MAX7221這個 24 Pin的 IC,先利用這個 IC 控制 8x8 的 LED矩陣,透過 Arduino 的 LedControl 函式庫撰寫程式。以下就來看看如何接線及函式庫內有哪些好用的函式。


[MAX 7219]

MAX7219/MAX7221是一種集成化的串列輸入/輸出共陰極顯示驅動器,它連線微處理器與 8位數位的7段數位LED顯示,也可以連線條線圖顯示器或者 64個獨立的LED。上面還包括一個片上的 B型 BCD編碼器、多路掃描回路,段字驅動器,而且還有一個 8*8的靜態RAM用來存儲每一個資料。

有一個外部暫存器用來設定各個LED的段電流。 MAX7221與SPI™、 QSPI™以及 MICROWIRE™相兼容,同時它有限製回轉電流的段驅動來減少EMI(電磁幹擾)。一個方便的四線串列接口可以聯接所有通用的微處理器。每個資料可以定址在更新時不需要改寫所有的顯示。

MAX7219/MAX7221同樣允許使用者對每一個資料選擇編碼或者不編碼。 整個設備包含一個150μA的低功耗關閉模式,模擬和數位亮度控製,一個掃描限製暫存器允許使用者顯示1-8位資料,還有一個讓所有LED發光的檢測模式。[華人百科]





接腳名稱功能
1DIN串列資料輸入連線埠。在CLK上升沿時,資料被載入內部的16位暫存器
2,3,5-8, 10,11DIG 0–DIG7八個資料驅動線路顯示器共陰極為低電位。MAX7219接腳輸出高電位時,會關閉DIG0-7
4,9GND接地線。4腳和9腳必須同時接地
12 LOAD載入資料。LOAD(MAX7219)當設定為高電位時,連續載入16位元的資料。CS(MAX7221),設定為低電位時,16位元的串列資料被載入移位暫存器。
13CLK時鐘序列輸入端。最大速率為 10MHz,在CLK高電位時,資料移入內部移位暫存器。低電位時,資料從DOUT端輸出。對MAX7221來說,當cs接腳為低電平時CLK輸入才有效。
14-17,20-23SEGA–SEG G,DP7段和小數點驅動。為顯示器提供電流。當一個段驅動關閉時,7219的此端呈低電位,7221呈現高阻抗。
18ISET通過一個電阻連線到VDD 來提高電流。
19V+正極電壓輸入+5V
20DOUT串列資料輸出連線埠。從DIN輸入的資料在16.5個時鍾周期後在此端有效。當使用多個MAX7219/MAX7221時用此端方便擴展。

[接線圖]


• 8x8 LED Matrix 連接線路
Arduino Uno8x8 LED Matrix模組
5VVCC
GNDGND
D10CS(Load)
D11CLK
D12DIN

[安裝程式庫Library]

本實作需要安裝以下程式庫:
直接到 Arduino IDE 功能表選單,選擇 [草稿碼 Sketch] → [匯入程式庫 Include Library] → [ 管理程式庫 Manage Libraries...],在出現的視窗搜尋處輸入 LedControl,如以下畫面,按下安裝即可。


程式庫(Library)安裝方法請參考另一篇文章:  Arduino筆記:安裝 Arduino IDE 程式庫(Library)


[LedControl 函式庫]

• 建立一個新的控制:LedControl(int dataPin, int clkPin, int csPin, int numDevices);
int dataPin : Arduino 資料輸出的 Pin
int clockPin : 時鐘 Clock Pin
int csPin : 當資料被送出時選擇的設備 device
int numDevices : 最多有多少個設備要被控制

• 設定進入省電模式:shutdown(int addr, bool b);
int addr : 控制顯示的位址
boolean b : 設定為 true,設備進入電力中斷模式,設定為 false 為正常模式

• 設定顯示亮度:setIntensity(int addr, int intensity);
int addr : 控制顯示的位址
int intensity : 顯示器的亮度,介於 0(最暗) 及15(最亮) 之間

• 將所有LED設定成不顯示:clearDisplay(int addr);
int addr : 控制顯示的位址

• 設定單一個LED 的亮或滅狀態:setLed(int addr, int row, int col, boolean state);
addr : 顯示的位址
row : Led的列數 (0..7)
col : Led的欄數 (0..7)
state : 設定為 true,Led為亮,設定為 false,則關閉 Led 顯示

• 使用8bits顯示指定列的8個LED 亮或滅狀態:setRow(int addr, int row, byte value);
addr : 顯示的位址
row : 列的編號 (0..7)
value : 8 bits 來顯示該列的LED是否為亮,1為亮,0為暗

• 使用8bits顯示指定欄的8個LED 亮或滅狀態:setColumn(int addr, int col, byte value);
addr : 顯示的位址
col : 欄的編號 (0..7)
value : 8 bits 來顯示該欄的LED是否為亮,1為亮,0為暗

• 在7段顯示器顯示一個十六進位數字: setDigit(int addr, int digit, byte value, boolean dp);
addr : 顯示的位址
digit : 顯示字元的位置 (0..7)
value : 顯示的數字 (0x00..0x0F)
dp : 設定小數點

• 在7段顯示器顯示一個字元: setChar(int addr, int digit, char value, boolean dp);
addr : 顯示的位址
digit : 顯示字元的位置 (0..7)
value : 顯示的字元,僅可顯示0,1,2,3,4,5,6,7,8,9,0,A,b,c,d,E,F,H,L,P,.,-,_,' '
dp : 設定小數點

[程式一]

#include <LedControl.h>
// Pin 12:Data in, Pin 11: Clock,  Pin 10: CS(Load)
LedControl lc=LedControl(12,11,10,1); 

void setup()
{
  lc.shutdown(0,false);  // 關閉省電模式
  lc.setIntensity(0,8);  // 設定亮度為 8 (介於0~15之間)
  lc.clearDisplay(0);    // 清除螢幕
}
void loop()
{
      int randNumber_col = random(8);
      int randNumber_row = random(8);
      lc.setLed(0,randNumber_col,randNumber_row,1); // 將Led的欄,列設定為亮
      delay(5);
      lc.setLed(0,randNumber_col,randNumber_row,0); // 將Led的欄,列設定為暗
}

[執行結果]



[參考資料]

 Arduino playground:LedControl

Post a Comment

較新的 較舊