MAX7219驅(qū)動數(shù)碼管(Proteus仿真)
掃描二維碼
隨時隨地手機看文章
最近很多網(wǎng)友后臺詢問Proteus仿真的內(nèi)容,借此機會我做了一個例子,跟大家分享一下,感興趣的可以后臺留言“MAX7219”可以得到完整的仿真工程,包括:
- Proteus原理圖,主芯片為STM32F103R6
- Keil 5代碼工程,使用的是庫函數(shù)的方式編程。
仿真實現(xiàn)的功能點:
-
MAX7219芯片驅(qū)動8個數(shù)碼管;
-
STM32和DS1302結(jié)合,獲得實時時鐘,并顯示在數(shù)碼管上;
-
兩個LED指示系統(tǒng)的當前的工作模式
注意:鬧鐘的具體功能未實現(xiàn),可自行設計添加。
- 全滅為默認模式0,實時獲取時間并顯示;
- 左亮右滅為模式1,為設置時間模式,按前三個按鍵可以修改對應的時分秒;
- 左滅右亮為模式2,為設置鬧鐘模式;
-
系統(tǒng)中共有四個按鍵,按鍵4為模式修改鍵。
本文重點介紹一下MAX7219芯片的使用方法,使用MAX7219芯片驅(qū)動數(shù)碼管,電路很簡單,程序也不難,是理想的驅(qū)動數(shù)碼管的芯片,DS1302實時時鐘芯片的驅(qū)動留著以后再介紹。
MAX7219簡介
MAX7219是MAXIM公司生產(chǎn)的串行輸入/輸出共陰極數(shù)碼管顯示驅(qū)動芯片,一片MAX7219可驅(qū)動8個7段(包括小數(shù)點共8段)數(shù)字LED、LED條線圖形顯示器、或64個分立的LED發(fā)光二級管。
該芯片具有10MHz傳輸率的三線串行接口可與任何微處理器相連,只需一個外接電阻即可設置所有LED的段電流。
它的操作很簡單,MCU只需通過模擬SPI三線接口就可以將相關(guān)的指令寫入MAX7219的內(nèi)部指令和數(shù)據(jù)寄存器,同時它還允許用戶選擇多種譯碼方式和譯碼位。
此外它還支持多片7219串聯(lián)方式,這樣MCU就可以通過3根線(即串行數(shù)據(jù)線、串行時鐘線和芯片選通線)控制更多的數(shù)碼管顯示。

各引腳的功能為:
DIN : 串行數(shù)據(jù)輸入端
DOUT : 串行數(shù)據(jù)輸出端,用于級連擴展
LOAD : 裝載數(shù)據(jù)輸入
CLK: 串行時鐘輸入
DIG0~DIG7: 8位LED位選線,從共陰極LED中吸入電流
SEG A~SEG G DP: 7段驅(qū)動和小數(shù)點驅(qū)動
ISET:通過一個10K電阻和Vcc相連,設置段電流
時序圖分析

時序圖中我們要注意的地方:
- 發(fā)送數(shù)據(jù)期間Max7219_pinCS引腳要拉低;
- 發(fā)送數(shù)據(jù),首先發(fā)送高位,即先發(fā)送兩個字節(jié)數(shù)據(jù)的D15位,最后發(fā)送D0位;
- 在Max7219_pinCLK引腳上升沿的時候,送出數(shù)據(jù)。
由上面的分析,我們得到向MAX7219寫入一個字節(jié)函數(shù)的具體實現(xiàn)如下:
//功能:向MAX7219寫入字節(jié) //入口參數(shù):DATA //出口參數(shù):無 //說明: void Write_Max7219_byte(u8 DATA) { u8 i; Max7219_pinCS=0; for(i=8;i>=1;i--) { Max7219_pinCLK=0; if(DATA&0x80) { Max7219_pinDIN = 1; } else { Max7219_pinDIN = 0; } DATA=DATA<<1; Max7219_pinCLK=1; } }
由于串行發(fā)送數(shù)據(jù),每次發(fā)送兩個字節(jié),即16位,串行數(shù)據(jù)格式如下:

所以我們封裝了一個完整的向MAX7219寫入數(shù)據(jù)的函數(shù),具體實現(xiàn)如下:
//功能:向MAX7219寫入數(shù)據(jù) //入口參數(shù):address、dat //出口參數(shù):無 //說明: void Write_Max7219(u8 address,u8 dat) { Max7219_pinCS=0; Write_Max7219_byte(address); Write_Max7219_byte(dat); Max7219_pinCS=1; }
寄存器地址映射
MAX7219內(nèi)部的寄存器如下圖所示,主要有:譯碼控制寄存器、亮度控制寄存器、掃描界限寄存器、關(guān)斷模式寄存器、測試控制寄存器。
編程時只有正確操作這些寄存器,MAX7219才可正常工作。

- 譯碼控制寄存器【Decode Mode】(X9H)
MAX7219有兩種譯碼方式:B譯碼方式和不譯碼方式。
當選擇不譯碼時,8個數(shù)據(jù)位分別一一對應7個段和小數(shù)點位;
B譯碼方式是BCD譯碼,直接送數(shù)據(jù)就可以顯示。
實際應用中可以按位設置選擇B譯碼或是不譯碼方式。
MAX7219的譯碼控制寄存器

Code B Font


由上面兩個表對比我們可知,不譯碼方式下數(shù)字0應該發(fā)送如下數(shù)據(jù):

下面的仿真實例中,咱們使用的是B譯碼的方式,直接發(fā)送對應的數(shù)據(jù)即可。
Write_Max7219(DECODE_MODE,0xff); //選用全譯碼模式

由上分析,我們可知,如果我們想要讓第一個數(shù)碼管顯示數(shù)字2,則只需執(zhí)行如下語句即可實現(xiàn):
Write_Max7219(0x01, 0x02);
- 亮度控制寄存器【Intensity Register Format】(XAH)
共有16級可選擇,用于設置LED的顯示亮度,從0xX0~0xXF,0xXF最亮。
咱們仿真中使用的初始亮度如下:
Write_Max7219(INTENSITY,0x04);
- 掃描界限寄存器【Scan-Limit Register Format】(XBH)
此寄存器用于設置顯示的LED的個數(shù)(1~8),比如當設置為0xX4時,LED 0~5顯示。因為仿真中咱們用了8個數(shù)碼管,所以掃描界限寄存器設置如下:
Write_Max7219(SCAN_LIMIT,0x07); //8只LED全用
原理圖

仿真使用的原理圖如下:

仿真結(jié)果
仿真過程中注意事項
- 芯片的VCC、GND引腳不連,一般不影響仿真效果,可以看到STM32主芯片上的晶振、電源,DS1302芯片的電源和地引腳都未連對應網(wǎng)絡,但是不影響仿真效果;
- 代碼中的延時跟仿真中的延時不匹配,導致在真正硬件中使用的按鍵掃描代碼,在仿真過程中,點擊按鈕響應的準確度不高;
- 主芯片的晶振頻率不能設置過高,否則數(shù)碼管顯示將嚴重閃爍。

說實話,真心不喜歡Proteus,本文撰寫過程中,遇到各種bug,幾度想放棄本文,后來總算是相對滿意的完成了仿真工作。