This website requires JavaScript.
優惠券 應用程式下載
寄往
部落格

Arduino LED 驅動器教學:使用 74HC595 與 MAX7219 控制更多 LED

最初發布於 Jun 30, 2026, 更新於 Jun 30, 2026

5 分鐘

目錄
  • 為什麼 Arduino 專案需要 LED 驅動 IC
  • Arduino LED 驅動 IC 比較
  • 如何搭配 Arduino 使用 74HC595 控制 LED 與 LED 矩陣
  • 如何搭配 Arduino 使用 MAX7219 LED 矩陣模組
  • Arduino LED 矩陣顯示器的電源需求
  • Arduino LED 驅動器故障排查
  • Arduino LED 驅動器專案
  • 結論
  • Arduino LED 驅動器常見問題

在較大型的 LED 專案中,Arduino GPIO 腳位很快就會不夠用。透過使用專用 LED 驅動器與擴充 IC,你可以大幅減少腳位使用量,消除占用處理器資源的多工掃描迴圈,並簡化顯示器接線。

在本指南中,你將了解 74HC595 移位暫存器與 MAX7219 LED 驅動器的運作架構、接線配置、級聯技巧與最佳化策略。

為什麼 Arduino 專案需要 LED 驅動 IC

Arduino GPIO 與電流限制

基於 ATmega328P 的 Arduino Uno 具有實體限制,使其不可能直接驅動大規模 LED:

  • 單一腳位最大電流:單一數位 I/O 腳位可安全連續供應或吸收的最大電流為 20 mA連續電流,絕對峰值限制為 40 mA。
  • 整體封裝限制:流經微控制器主要 VCC 與 GND 腳位的總電流不得超過 200 mA。
  • 實體腳位不足:Arduino Uno 只有 14 個數位 I/O 腳位與 6 個類比輸入腳位。

如果你嘗試同時驅動 16 顆標準 15 mA LED,就會要求微控制器封裝提供 240 mA 電流,這會違反安全工作範圍,並可能導致矽晶片瞬間熱損毀

LED 多工控制與 LED 驅動 IC 比較

在驅動標準陣列,例如 8x8 矩陣或七段顯示器時,你需要在直接由軟體驅動的多工控制與專用硬體驅動 IC 之間做選擇:

  • 直接 GPIO 多工控制:需要 Arduino CPU 執行高頻迴圈,持續掃描列與欄。如果主迴圈被感測器讀取、序列通訊或 delay() 呼叫阻塞,顯示器就會立刻凍結或閃爍。
  • 移位暫存器(74HC595):透過簡單的 3-pin 序列介面擴充數位輸出腳位。雖然它能以低成本解決實體腳位限制,但若要對矩陣進行多工掃描,微控制器仍必須在軟體中執行高速掃描迴圈。
  • 專用顯示驅動器(MAX7219):可將多工控制完全從 CPU 卸載。它內建靜態 RAM 以保存顯示資料,並具備硬體振盪器自動處理列/欄掃描,讓 Arduino CPU 完全釋放出來。

74HC595 與 MAX7219:該選哪一種 LED 驅動器?

  • 如果你需要極低元件成本的通用數位輸出擴充,例如控制一組繼電器、自訂長條圖或個別狀態指示燈,請選擇 74HC595。
  • 如果你的專案特別涉及 8x8 LED 矩陣、跑馬燈文字看板,或多位數七段顯示器,請選擇 MAX7219,因為它能在單一矽晶片上處理限流、掃描與調光。

Arduino LED 驅動 IC 比較

下表概述標準輸出擴充器與專用顯示控制器之間的核心差異。

功能 74HC595 移位暫存器 MAX7219 LED 驅動器
晶片角色 8-bit 序列轉並列擴充器 整合式共陰極驅動器
所需控制腳位 3 個腳位(Data、Clock、Latch) 3 個腳位(SPI:DIN、CS、CLK)
最大 LED 容量 每顆晶片 8 顆獨立 LED 64 顆矩陣 LED 或 8 位顯示數字
多工工作週期 由 CPU 以軟體管理 由硬體以 800Hz 自動掃描
板載顯示 RAM 無,只有鎖存輸出暫存器 8x8 雙埠靜態 RAM
限流 每顆晶片需要 8 顆外部電阻 使用單一外部電阻(R_iset)設定
亮度控制 在 Output Enable(OE)腳位上手動 PWM 內建 16 階數位暫存器控制
級聯能力 理論上不限,受訊號傳播限制 可穩定級聯 8 個以上模組,受 SPI 速度限制

如何搭配 Arduino 使用 74HC595 控制 LED 與 LED 矩陣

74HC595 移位暫存器是一款非常具成本效益的輸出腳位擴充晶片。

74HC595 腳位說明

74HC595 內含一個 8-bit 移位暫存器與一個 8-bit D 型儲存暫存器。主要腳位包括:

  • DS(Pin 14):序列資料輸入。
  • SH_CP(Pin 11):移位暫存器時脈。於上升緣觸發。
  • ST_CP(Pin 12):儲存暫存器時脈,也就是 Latch,用於更新並列輸出腳位。
  • OE(Pin 13):輸出啟用。低電位有效。
  • MR(Pin 10):主重置。低電位有效。
  • Q0 - Q7(Pins 15, 1-7):並列輸出。
  • Q7'(Pin 9):序列輸出,用於菊鏈連接。

74HC595 8-bit 移位暫存器 IC 腳位圖

圖:DIP-16 封裝中 74HC595 8-bit 移位暫存器 IC 的腳位圖。

74HC595 Arduino 8x8 LED 矩陣接線圖

若要為 8x8 LED 矩陣接上雙移位暫存器配置,請將兩顆暫存器的 clock 與 latch 腳位並聯到 Arduino,並將其序列資料線以菊鏈方式連接。

Arduino Uno 控制 74HC595 移位暫存器

圖:詳細接線示意圖,顯示 Arduino Uno 控制兩顆菊鏈連接的 74HC595 移位暫存器。第一顆暫存器控制列陽極;第二顆暫存器透過串聯電阻控制欄陰極,並共用 latch 與 clock 訊號。

使用 shiftOut() 的 Arduino 74HC595 LED 矩陣程式碼

此程式碼示範如何使用雙暫存器菊鏈,在 8x8 LED 矩陣上掃描 3D-buffered 影像,例如愛心圖案。透過連續移出兩個位元組,每一條掃描線都會更新欄與列。

程式碼重點:

  • 級聯移位操作:在連續移出兩個 8-bit 數值時,保持 latch 為 LOW。第一個位元組會溢出到暫存器 2(Columns),第二個位元組則填入暫存器 1(Rows)。
  • 欄與列極性對應:反轉欄值(~pattern)以將陰極拉低,並透過位元位移將個別列腳位設為 HIGH。
  • 穩定刷新交錯:使用低延遲迴圈依序掃描每一條掃描線,提供穩定且無閃爍的視覺影像。
C/C++
const int latchPin = 10;
const int clockPin = 9;
const int dataPin = 11;

// 8x8 愛心圖案表示法(1 = 啟用 LED,0 = 關閉 LED)
byte heartPattern[8] = {
  B00000000,
  B01100110,
  B11111111,
  B11111111,
  B11111111,
  B01111110,
  B00111100,
  B00000000
};

C/C++
// 設定
void setup() {
  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
}
C/C++
// 主迴圈
void loop() {
  // 依序掃描全部 8 列
  for (int row = 0; row < 8; row++) {
    // 欄(低電位有效):反轉圖案,讓 1 被拉低以吸收電流
    byte colData = ~heartPattern[row];
    
    // 列(高電位有效):只開啟目前列,例如 Row 0 -> B00000001,Row 1 -> B00000010
    byte rowData = (1 << row);
    
    // 將 latch 腳位接地,並在傳輸資料期間保持 LOW
    digitalWrite(latchPin, LOW);
    
    // 1. 先移出欄資料,這個位元組會溢出到暫存器 2,用於控制 Columns
    shiftOut(dataPin, clockPin, MSBFIRST, colData);
    
    // 2. 接著移出列資料,這個位元組會留在暫存器 1,用於控制 Rows
    shiftOut(dataPin, clockPin, MSBFIRST, rowData);
    
    // 將 latch 腳位拉回 HIGH,同時輸出更新後的狀態
    digitalWrite(latchPin, HIGH);
    
    // 每條掃描線的延遲間隔,1.25 ms/列可達到約 100 Hz 畫面刷新率
    delayMicroseconds(1250);
  }
}

雖然以軟體為基礎的 shiftOut() 簡單又方便,但它仰賴手動軟體切換 clock 與 data 腳位,因此會產生執行開銷。對於高度要求、高頻率顯示器,可以改用 Arduino 的硬體 SPI(Serial Peripheral Interface)匯流排。硬體 SPI 使用 ATmega328P 專用的內部移位暫存器電路,可釋放 CPU 時脈週期,並允許資料傳輸率最高達 8 MHz。

菊鏈連接多顆 74HC595 移位暫存器

若要控制超過 8 個輸出,你可以將多顆移位暫存器串接在一起,而不需要使用 Arduino 更多腳位。將第一顆暫存器的序列輸出 Q7'(Pin 9)連接到第二顆暫存器的序列資料輸入 DS(Pin 14)。將兩顆晶片的 clock(SH_CP)與 latch(ST_CP)腳位並聯到同一組 Arduino 控制線。

由於序列移位具有 FIFO(First-In, First-Out,先進先出)特性,送出 16 bits 資料時,最先移入的 8 bits 會從第一顆晶片溢出,並進入第二顆晶片。因此使用 MSBFIRST 傳輸時,預計送到鏈中第二顆移位暫存器的資料位元組,必須移出。

使用 OE 腳位進行 74HC595 PWM 亮度控制

若要實作全域亮度控制,請將 74HC595 的 OE(Output Enable)腳位連接到 Arduino 具 PWM 功能的腳位之一,例如 D3 或 D9,而不是直接接地。透過 analogWrite(OEPin, brightnessValue) 寫入類比值,其中 0 表示最亮,255 表示關閉,就能調變暫存器的輸出啟用時間。

如何搭配 Arduino 使用 MAX7219 LED 矩陣模組

雖然在麵包板上接裸 IC 對基礎學習很有幫助,但實際創客與產品開發者幾乎都會使用廣泛可取得的 MAX7219 8x8 LED 矩陣模組。這些便宜的現成 breakout 板已將表面黏著 MAX7219 IC、去耦電容與矩陣插座焊接在緊湊 PCB 上,讓硬體整合即插即用。

MAX7219 8x8 LED 矩陣工作原理

MAX7219 8x8 LED 矩陣模組會完全在板上處理多工刷新。此模組內含 8x8 雙埠靜態 RAM。

當 Arduino 透過高速 SPI 匯流排將像素資料傳送到電路板時,這些狀態會直接寫入板載記憶體。接著驅動器會以固定 800 Hz 的內部速率,自動且持續掃描整個矩陣。

由於模組會在硬體內部更新顯示,你的 Arduino 完全不需要執行耗費 CPU 的視覺暫留(Persistence of Vision,PoV)迴圈,可避免主迴圈執行較慢任務時造成螢幕閃爍。

MAX7219 8x8 LED 矩陣腳位與互連

標準 MAX7219 8x8 LED 矩陣模組通常會將所有必要 SPI 線路引出到 PCB 兩端簡單、易用的 5-pin 排針上,通常分別標示為「Input」與「Output」側。

MAX7219 8x8 LED 矩陣模組

圖:MAX7219 8x8 LED 矩陣模組,顯示標準 5-pin 輸入排針(左側),用於 Arduino 通訊;以及 5-pin 輸出排針(右側),用於菊鏈連接。

  • VCC:電源輸入,通常為 +5V DC。
  • GND:系統接地參考。
  • DIN(Data In):序列資料輸入,連接到微控制器的 MOSI 線。
  • CS(Chip Select / LOAD):傳輸開始時拉 LOW,傳入位元組鎖存時拉 HIGH。
  • CLK(Serial Clock):同步位元組傳輸,最高可達 10 MHz。
  • DOUT(Data Out):位於輸出排針,用於將多個模組串接在一起。

整合式 R_iset 電阻配置

在裸矽晶片上,峰值 LED segment 電流必須透過接到 ISET 腳位的外部電阻(R_iset)計算與調整。

在標準 MAX7219 8x8 LED 矩陣模組上,這顆電流設定電阻已經整合在電路板上,通常是一顆表面黏著 10k ohms 電阻。這個預設電阻會將標準紅光 LED 的峰值 segment 電流安全設定為 40 mA,完全省去你自行計算、麵包板接線或焊接離散電阻的需求。

Arduino Uno 與 MAX7219 8x8 LED 矩陣接線連接

圖:示意圖顯示 Arduino Uno 與 MAX7219 8x8 LED 矩陣模組之間的接線連接。

MAX7219 控制暫存器

在低階層級,與模組通訊是透過傳輸 16-bit 封包完成,封包由 8-bit Address Register 接著 8-bit Data Byte 組成:

Command Byte = [Address (D15-D8)] + [Data Byte (D7-D0)]

板上內部對應的主要控制暫存器如下:

暫存器位址(Hex) 暫存器名稱 用途/常見設定
0x09 Decode Mode 8x8 矩陣原始欄對應使用 0x00;七段顯示器使用 0x0F/0xFF。
0x0A Intensity 內部數位調光,從 0x00(最低)到 0x0F(最高,15/16 工作週期)。
0x0B Scan Limit 設為 0x07,告知驅動器掃描全部 8 列/欄。
0x0C Shutdown 0x00 為低功耗待機;0x01 為啟用運作模式。
0x0F Display Test 0x00 為正常運作;0x01 則強制點亮全部 LED。
0x01 to 0x08 Digit 0 to 7 直接對應到你的 8x8 LED 矩陣模組上的 Columns 1 到 8。

專用 Arduino 函式庫與低階控制比較

雖然使用硬體 SPI.h 函式庫傳送原始暫存器代碼,對理解底層暫存器非常有教育意義,但從零開始撰寫複雜圖形或捲動文字會非常繁瑣。

在實際專案中,開發者會使用專用且高度最佳化的開源函式庫,讓控制 MAX7219 LED 矩陣模組變得極為簡單:

  1. LedControl輕量、適合初學者的函式庫,可讓你定址個別模組或小型串接鏈,透過座標切換單顆 LED(setLed()),或顯示字元。
  2. MD_MAX72XXMD_Parola商業與興趣專案的黃金標準。它能處理硬體配置差異,例如 FC-16 模組佈局、多位數捲動文字緩衝、字型、文字進出動畫效果,以及多行分區佈局,且所需程式碼開銷很低。

範例:概念性低階 SPI 控制

以下程式碼示範專用函式庫如何在底層透過 Arduino 原生硬體 SPI.h 匯流排,與 MAX7219 的內部暫存器互動。

C/C++
// 腳位定義
// Include 與定義
#include <SPI.h>
const int csPin = 10;

// MAX7219 暫存器位址
const byte REG_NOOP         = 0x00;
const byte REG_DIGIT0       = 0x01;
const byte REG_DECODE_MODE  = 0x09;
const byte REG_INTENSITY    = 0x0A;
const byte REG_SCAN_LIMIT   = 0x0B;
const byte REG_SHUTDOWN     = 0x0C;
const byte REG_DISPLAY_TEST = 0x0F;


// 顯示圖案緩衝區
byte heartPattern[8] = {
  B00000000,
  B01100110,
  B11111111,
  B11111111,
  B11111111,
  B01111110,
  B00111100,
  B00000000
};
C/C++
// 寫入暫存器的輔助函式
void writeRegister(byte address, byte data) {
  digitalWrite(csPin, LOW);
  SPI.transfer(address);
  SPI.transfer(data);
  digitalWrite(csPin, HIGH);
}
C/C++
// 設定函式
void setup() {
  pinMode(csPin, OUTPUT);
  digitalWrite(csPin, HIGH);
  SPI.begin();
  SPI.beginTransaction(SPISettings(8000000, MSBFIRST, SPI_MODE0));
  writeRegister(REG_DISPLAY_TEST, 0x00);
  writeRegister(REG_DECODE_MODE, 0x00);
  writeRegister(REG_INTENSITY, 0x03);
  writeRegister(REG_SCAN_LIMIT, 0x07);
  writeRegister(REG_SHUTDOWN, 0x01);
  for (int i = 1; i <= 8; i++) {
    writeRegister(i, 0x00);
  }
}
C/C++
// 主迴圈
void loop() {
  for (int col = 0; col < 8; col++) {
    writeRegister(REG_DIGIT0 + col, heartPattern[col]);
  }
  delay(1000);
}

菊鏈連接 MAX7219 8x8 LED 矩陣模組

將多個 MAX7219 8x8 LED 矩陣模組級聯,打造寬幅看板顯示器,其實相當直接。

你只需要將模組並排安裝。將共用線路 VCC、GND、CLK 與 CS 並聯到所有電路板上,通常可以很容易使用標準母對母杜邦線完成。

對於序列資料路徑,將第一個模組右側輸出排針上的 DOUT(Data Out)腳位,直接接到相鄰模組左側輸入排針上的 DIN(Data In)腳位。

使用 MD_Parola 這類高階函式庫時,你只要在設定中宣告連接的模組總數,例如 #define MAX_DEVICES 4。函式庫會自動協調將序列文字緩衝資料移入串接電路板中,建立無縫且同步的多模組文字捲動效果。

Arduino LED 矩陣顯示器的電源需求

雖然單一模組可以安全地由 Arduino 板載 5V 穩壓器供電,但較大的級聯陣列很快就會超出 USB 電源預算:

  • USB 2.0 供電限制:標準電腦 USB 連接埠的供應電流上限為 500mA。
  • 級聯電流消耗:8x32,也就是 4 模組顯示器,在全亮度與高像素密度下,可能輕易拉到 600 mA 至 1A。
  • 解決方法:將額定至少 2A 的外部穩壓 5V 電源供應器,直接連接到 LED 模組的 VCC 與 GND 電源軌。最重要的是,務必將外部電源供應器的 GND 線連接到 Arduino 的 GND 腳位,以維持共同接地參考。

Arduino LED 驅動器故障排查

#1 74HC595 輸出未更新

如果 LED 狀態沒有改變,請檢查 Latch(ST_CP)線。如果這條線斷開或短接到 GND,移位暫存器仍會接收到資料,但永遠不會將數值載入到實體輸出腳位。

#2 級聯後 LED 順序錯誤

如果 LED 以相反順序亮起,或資料被移入錯誤的暫存器,代表你遇到 FIFO 對應錯誤。請記住,最先移出的資料位元組會被推入鏈中的第二顆晶片。可嘗試在程式碼中交換 shiftOut() 呼叫順序。

#3 MAX7219 矩陣不顯示文字

如果級聯矩陣完全空白,最常見原因是缺少喚醒序列。MAX7219 啟動時預設處於低功耗 Shutdown 狀態。

你的 setup 程式碼必須明確將 0x01 寫入 Shutdown 暫存器(0x0C),並將 Scan Limit 暫存器(0x0B)設定為 0x07,以啟用全部 8 列。

#4 LED 矩陣偏暗或亮度不均

如果 LED 看起來偏暗,或沿著級聯鏈越往後越暗,請檢查你的電源分配。細杜邦線的走線電阻會造成電壓降。

務必使用較粗線徑的導線,從 5V 電源供應器直接接到每個模組的電源輸入腳位,而不是將細 VCC 線從一塊板菊鏈到另一塊板。

#5 LED 顯示器閃爍

閃爍幾乎總是由缺少接地參考造成。如果你的模組由外部變壓器供電,但忘記在變壓器負端與 Arduino GND 腳位之間接線,高速 SPI 訊號就會相對於浮動參考劇烈波動。

#6 啟動狀態問題

上電期間,移位暫存器輸出可能浮動或隨機初始化,導致所有連接的 LED 出現短暫且非預期的閃爍。

為避免此情況,請在 OE 腳位到 VCC 之間放置 10k Ohm 上拉電阻。這會強制輸出在啟動時進入高阻抗,也就是停用狀態。當 Arduino 開機序列完成後,你的 setup 程式碼即可將 OE 腳位寫為 LOW,以啟用乾淨的輸出狀態。

Arduino LED 驅動器專案

8x32 MAX7219 捲動文字顯示器

透過級聯四個標準 8x8 模組並使用 MD_Parola 函式庫,你可以打造大型跑馬燈看板顯示器,具備流暢的文字進入與退出動畫。

四個 8x8 LED 矩陣

圖:四個 8x8 LED 矩陣模組透過菊鏈連接,用於 Arduino 文字顯示專案。

使用 74HC595 製作大型 LED 長條圖

透過串接三顆 74HC595 移位暫存器,你可以驅動高度靈敏的 24-segment 音訊電平指示器或電池電量表,並具備出色亮度與零額外腳位負擔。

Arduino 七段顯示器多工控制

對於需要數字讀出的專案,Arduino 七段顯示器多工控制是一種經典實作。典型多位數七段顯示器使用標準排列,由標示為 a、b、c、d、e、f、g 的七個獨立 segment LED 組成,並可選配第八個小數點 segment(dp)。

在 4 位數封裝中,這會轉換為總共 12 個實體介面腳位:8 個腳位並聯連接,用來對應所有數字的 segment;以及 4 個共陰極或共陽極腳位,用來選擇目前啟用的位數。

許多 Arduino 七段顯示器多工專案會使用 74HC595 移位暫存器或 MAX7219 驅動器,以減少 GPIO 使用量並簡化刷新時序。不論你使用共陽極或共陰極配置,這種做法都非常靈活。

與直接使用 32 個腳位驅動四位數不同,多工控制會依序掃描四個 common 腳位,同時移入對應的 segment 資料。快速掃描時,各個數字會融合成連續的多位數顯示,且沒有可見閃爍。

JLCPCB PCB 組裝服務 Banner 1
從麵包板原型走向客製化 LED 顯示 PCB
取得免費報價
  • 如果你正從麵包板原型轉向客製化 LED 顯示 PCB,請及早規劃電流路徑、連接器位置、去耦電容與驅動 IC footprint。
  • JLCPCB PCB 製造與組裝服務可協助將 Arduino LED 驅動器原型轉化為緊湊、可投入生產的電路板。

結論

Arduino LED 驅動器讓小型微控制器能透過謹慎的掃描時序與共用接線架構,控制出乎意料的大型顯示器。矩陣掃描、74HC595 移位暫存器、Charlieplexing 與 MAX7219 驅動器,會依據 GPIO 限制、亮度需求、CPU 負載與電路複雜度,分別解決不同的擴展問題。

Arduino LED 驅動器常見問題

Q:一顆 74HC595 可以控制多少顆 LED?

單顆 74HC595 移位暫存器具有 8 個並列輸出,因此最多可直接控制 8 顆獨立 LED。不過,你可以將多顆暫存器以串聯方式菊鏈連接,近乎無限制地擴充輸出數量。

Q:可以級聯多少個 MAX7219 模組?

在標準硬體 SPI 匯流排上,你可以穩定地串接最多約 8 個 MAX7219 模組;再往後資料線上的訊號傳播延遲可能會開始造成延遲問題。

Q:MAX7219 需要多工控制程式碼嗎?

不需要。MAX7219 內建硬體多工控制電路,會在內部持續刷新連接的矩陣欄位,因此 Arduino 不需要任何多工控制程式碼。

Q:為什麼我的 74HC595 啟動時輸出是隨機的?

上電時,內部移位暫存器會以隨機狀態啟動。你可以在 Output Enable(OE)腳位放置一顆 10k Ohm 上拉電阻,使輸出在 Arduino setup 程式碼完成前保持停用。

Q:74HC595 可以驅動高功率 LED 嗎?

不可以。74HC595 的單一並列腳位最大輸出電流額定值只有 35 mA。若要驅動高功率 LED,請將移位暫存器輸出連接到電晶體驅動板或 Darlington 陣列。

Q:74HC595 與 MAX7219 哪一個更好?

74HC595 更適合低預算的通用數位輸出擴充。對於複雜的共陰極七段顯示器或 8x8 LED 矩陣,MAX7219 則明顯更出色。

Q:為什麼我的 LED 矩陣會閃爍?

閃爍通常是因為使用外部電源供應器時,沒有將其接地線連接到 Arduino 的 GND 腳位;或是軟體驅動的 SPI 迴圈被程式中的慢速操作阻塞。

Q:MAX7219 模組需要外部電阻嗎?

不需要。標準 MAX7219 8x8 LED 矩陣模組已在板上整合並預先焊接電流設定電阻,完全不需要在欄位上額外使用外部串聯電阻。

持續學習