使用 MAX7219 驅動七段顯示器

在前一篇教學裡,介紹了如何利用 74HC595 shift register 驅動七段顯示器的基本概念。在接下來的文章中,將會說明如何使用另一顆 LED 驅動 IC:MAX7219,來驅動七段顯示器 (最高支援八個七段顯示器;換句話說,相當於同時驅動 64 顆 LED)。藉由修改 74HC595 教學範例的程式,使 LinkIt 7697 得以使用八位數七段顯示器模組 (內建 MAX7219),並透過這個過程讓開發者了解 MAX7219 的主要功能及運作機制。

目錄

  • 目錄

  • 指令格式

  • 硬體接線

  • 暫存器定義

    • Decode Mode (0x09)

    • Digit 0 ~ Digit 7 data (0x01 ~ 0x08)

    • Intensity (0x0A)

    • Scan Limit (0x0B)

    • Shutdown (0x0C)

    • Display Test (0x0F)

  • 範例:顯示遞增數值

  • 結論

指令格式

在深入解析 MAX7219 前,第一步要先了解如何與 MAX7219 溝通。執行任何一項 MAX7219 的功能時,都需要對它發出指令,待 MAX7219 收到指令後,它會依指令更新其內部暫存器的值、進而觸發動作。指令格式為固定 16-bit 長度的「暫存器位址 / 資料數值」組合,各個位元的定義如下 (X 表示可為任意值):

發送指令的方式為:拉低 LOAD 訊號、在 CLK 訊號打 16 個時脈的過程中,透過 DIN 腳位依序把 16-bit 的指令送進 MAX7219,送完後拉高 LOAD 訊號即完成一筆指令的傳輸。對應的時序圖示意為:

透過使用 shiftOut() API 產生時脈訊號及傳送資料,在 Arduino 裡的實作如下:

硬體接線

LinkIt 7697 透過下列腳位與八位數顯示器模組相連:

  • 5V

  • GND

  • P15

  • P16

  • P17

該五隻腳位分別接到顯示模組上的:

  • VCC

  • GND

  • CLK

  • CS (即 MAX7219 的 LOAD 腳位)

  • DIN

接線示意圖為:

暫存器定義

要順利驅動 MAX7219,需正確設定對應的暫存器。在此範例中,開發者需要設定下列六類型的暫存器:

暫存器名稱
位址
說明

Decode Mode

0x09

開啟 / 關閉 decode 模式

Intensity

0x0A

調整顯示器亮度

Scan Limit

0x0B

設定欲啟動的顯示器數目

Shutdown

0x0C

開啟 / 關閉顯示模組

Display Test

0x0F

開啟 / 關閉測試模式 (顯示器的所有筆畫皆會亮起)

Digit 0 ~ Digit 7 data

0x01 ~ 0x08

控制位數 0 到位數 7 的顯示資料

在 Arduino 範例程式裡將它們定義為:

針對各個暫存器,對應的操作說明及範例如下:

Decode Mode (0x09)

MAX7219 針對每個顯示器,皆分別支援兩種資料顯示模式:1) 原始資料模式 2) BCD 碼模式。例如:

此例中,位元 1、3、4 被設為 1,因此表示位數 1、位數 3、位數 4 被設定為 BCD 碼 decode 模式。而剩下的位數 0 / 2 / 5 / 6 / 7 則為原始資料模式

Digit 0 ~ Digit 7 data (0x01 ~ 0x08)

原始資料模式中,開發者需自行指定七段顯示器中每個筆畫的明滅資訊,就如同 74HC595 教學中提及的一樣。

舉例來說,若開發者想在位數 3 顯示數字 "7",表示七段顯示器的筆畫 "A"、"B"、"C" (參考上圖) 需要被開啟;對應到暫存器的值,即 Digit 3 暫存器的第 4、5、6 個位元 (上圖表格) 需設定為 1:

雖然在原始資料模式中指定筆畫的方式較為複雜,但它提供了開發者顯示各種圖形組合的彈性:

除了原始資料模式外,MAX7219 還提供了另一種叫做 BCD 碼 decode 模式的操作方法。在 decode 模式下,每個字的筆畫構成已被事先定義、並依照 BCD 碼 B 區 (見下表) 的規範儲存在 MAX7219 當中。因此要顯示這些字時,僅需提供每個字所對應的索引編號即可。

*不論在原始資料模式或是 decode 模式中,若要顯示小數點,都需自行將 Digit 暫存器的第 7 位元 (D7) 設成 1。

也就是說,若開發者要顯示數字 "0" 到 "9"、"-"、"E"、"H"、"L"、"P" 及 " " (空格) 這十六種字元,在 decode 模式下,不需自行傳送筆畫定義資訊給 MAX7219、直接給 MAX7219 字元的索引值即可。例如,要使用 decode 模式在位數 5 顯示子母 "E",則需把 Decode Mode 暫存器的 D5 設成 1,接著把 Digit 5 data 暫存器設為 11 (也就是二進位的 B1011,見上表定義),就可以讓顯示器顯示出字母 "E"。對應的程式碼如下:

Intensity (0x0A)

調整 LED 顯示器的亮度。值域範圍為 0x0 (最暗) 到 0xF (最亮)。

Scan Limit (0x0B)

設定模組上要開啟的顯示器個數 (即顯示位數)。下面分別為開啟一個位數、五個位數、以及八位數全開的範例:

Shutdown (0x0C)

開啟 / 關閉顯示器模組。

Display Test (0x0F)

開啟 / 關閉測試模式。開啟此模式時,顯示器的所有筆畫都會亮起。

範例:顯示遞增數值

結合上述的暫存器說明並修改之前的 74HC595 範例,下列的 Arduino sketch 展示了如何在八位數七段顯示器模組上顯示遞增數值 (及小數點移動) 的效果。

此範例的基本配置如下:

  • 以十六進位遞增數值。

  • 使用原始資料模式定義字元筆畫,

  • 使用中等顯示亮度。

可透過一些修改進行顯示效果的改變。例如,要從原本的 16 進位數值變為 10 進位 / 8 進位 / 2 進位模式時,可修改第 52 行digit_base 將之設定為 10、8 或是 2。下面的程式碼為修改成 10 進位的範例:

若要將資料解讀模式從原始資料模式改為 BCD 碼 decode 模式,則需要修改兩個地方。首先在第 74 行將八個顯示器都設定為 decode 模式:

接著在第 111 行,將送進 MAX7219 的資料從筆畫資訊改為索引索引值:

結論

透過本教學的內容,開發者可了解 MAX7219 的使用方法。雖然 MAX7219 的主要功能為驅動七段顯示器,但它也可用於其他的 LED 驅動場景。例如 8x8 矩陣式顯示器就是另一種常見的 MAX7219 應用:利用原始資料模式的設定方法來控制矩陣式顯示器。詳細的原理及做法,將會在下一篇教學裡進行詳細介紹。

Last updated