上次使用Raspberry Pi控制四位數七段顯示器時,腳位都接對了,但是一接上電源,四個數字的 LED全亮,找不出問題,懷疑是不是共陽或共陰極的關係,改天找時間再慢慢找問題。不過,利用這個機會,好好瞭解一下 MAX7219/MAX7221這個 24 Pin的 IC,先利用這個 IC 控制 8x8 的 LED矩陣,透過 Arduino 的 LedControl 函式庫撰寫程式。以下就來看看如何接線及函式庫內有哪些好用的函式。
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發光的檢測模式。[華人百科]
有一個外部暫存器用來設定各個LED的段電流。 MAX7221與SPI™、 QSPI™以及 MICROWIRE™相兼容,同時它有限製回轉電流的段驅動來減少EMI(電磁幹擾)。一個方便的四線串列接口可以聯接所有通用的微處理器。每個資料可以定址在更新時不需要改寫所有的顯示。
MAX7219/MAX7221同樣允許使用者對每一個資料選擇編碼或者不編碼。 整個設備包含一個150μA的低功耗關閉模式,模擬和數位亮度控製,一個掃描限製暫存器允許使用者顯示1-8位資料,還有一個讓所有LED發光的檢測模式。[華人百科]
接腳 | 名稱 | 功能 |
---|---|---|
1 | DIN | 串列資料輸入連線埠。在CLK上升沿時,資料被載入內部的16位暫存器 |
2,3,5-8, 10,11 | DIG 0–DIG7 | 八個資料驅動線路顯示器共陰極為低電位。MAX7219接腳輸出高電位時,會關閉DIG0-7 |
4,9 | GND | 接地線。4腳和9腳必須同時接地 |
12 | LOAD | 載入資料。LOAD(MAX7219)當設定為高電位時,連續載入16位元的資料。CS(MAX7221),設定為低電位時,16位元的串列資料被載入移位暫存器。 |
13 | CLK | 時鐘序列輸入端。最大速率為 10MHz,在CLK高電位時,資料移入內部移位暫存器。低電位時,資料從DOUT端輸出。對MAX7221來說,當cs接腳為低電平時CLK輸入才有效。 |
14-17,20-23 | SEGA–SEG G,DP | 7段和小數點驅動。為顯示器提供電流。當一個段驅動關閉時,7219的此端呈低電位,7221呈現高阻抗。 |
18 | ISET | 通過一個電阻連線到VDD 來提高電流。 |
19 | V+ | 正極電壓輸入+5V |
20 | DOUT | 串列資料輸出連線埠。從DIN輸入的資料在16.5個時鍾周期後在此端有效。當使用多個MAX7219/MAX7221時用此端方便擴展。 |
[接線圖]
• 8x8 LED Matrix 連接線路
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 : 設定小數點
Arduino Uno | 8x8 LED Matrix模組 |
---|---|
5V | VCC |
GND | GND |
D10 | CS(Load) |
D11 | CLK |
D12 | DIN |
[安裝程式庫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
張貼留言