星期二, 3月 14, 2017

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

[2017/03/14]
上次使用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發光的檢測模式。[華人百科]





接腳
名稱
功能
1
DIN
串列資料輸入連線埠。在CLK上升沿時,資料被載入內部的16位暫存器
2,3,5-8, 10,11
DIG 0DIG7
八個資料驅動線路顯示器共陰極為低電平。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
24
DOUT
串列資料輸出連線埠。從DIN輸入的資料在16.5個時鍾周期後在此端有效。當使用多個MAX7219/MAX7221時用此端方便擴展。

[接線圖]


• 8x8 LED Matrix 連接線路
8x8 LED Matrix模組
Arduino UNO
VCC
5V
GND
GND
DIN
PIN 12
CS (Load)
PIN 10
CLK
PIN 11

[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
Share:

0 意見:

張貼留言