四合一點(diǎn)陣顯示模塊采用MAX7219作為控制,它是一種集成化的串行輸入/輸出共陰極顯示驅(qū)動(dòng)器,它連接微處理器與8位數(shù)字的7段數(shù)字LED顯示,也可以連接條線圖顯示器或者64個(gè)獨(dú)立的LED。其上包括一個(gè)片上的B型BCD編碼器、多路掃描回路,段字驅(qū)動(dòng)器,而且還有一個(gè)8*8的靜態(tài)RAM用來(lái)存儲(chǔ)每一個(gè)數(shù)據(jù)。只有一個(gè)外部寄存器用來(lái)設(shè)置各個(gè)LED的段電流。它可以連接所有通用的微處理器。每個(gè)數(shù)據(jù)可以尋址在更新時(shí)不需要改寫所有的顯示。MAX7219同樣允許用戶對(duì)每一個(gè)數(shù)據(jù)選擇編碼或者不編碼。
整個(gè)設(shè)備包含一個(gè)150μA的低功耗關(guān)閉模式,模擬和數(shù)字亮度控制,一個(gè)掃描限制寄存器允許用戶顯示1-8位數(shù)據(jù),還有一個(gè)讓所有LED發(fā)光的檢測(cè)模式。
只需要3個(gè)IO口即可驅(qū)動(dòng)1個(gè)點(diǎn)陣!點(diǎn)陣顯示時(shí)無(wú)閃爍!支持級(jí)聯(lián)!
一、二、 模塊來(lái)源?
采購(gòu)鏈接:
資料下載鏈接: https://pan.baidu.com/s/19WdOd8D2QlPi1Q_EWlb3fQ
資料提取碼:b822
產(chǎn)品實(shí)物展示
2、規(guī)格參數(shù)?
工作電壓:4-5.5V
工作電流:8-330MA
掃描速率:500-1300Hz
通信協(xié)議:串行通信
以上信息見廠家資料文件
三、移植過程?
我們的目標(biāo)是將例程移植至MSPM0G3507開發(fā)板上。首先要獲取資料,查看數(shù)據(jù)手冊(cè)應(yīng)如何實(shí)現(xiàn)讀取數(shù)據(jù),再移植至我們的工程。
3.1. 查看資料?
3.1.1. 時(shí)序講解?

無(wú)論數(shù)據(jù)輸入或輸出CS端必須為低電平。然后數(shù)據(jù)在CS端的上升沿被載入數(shù)據(jù)寄存器或控制寄存器。CS端在第 16個(gè)時(shí)鐘的上升沿之后,下個(gè)時(shí)鐘上升沿之前變?yōu)楦唠娖?,否則數(shù)據(jù)將會(huì)丟失。
對(duì) MAX7219 來(lái)說,串行數(shù)據(jù)在 DIN 輸入 16 位數(shù)據(jù)包,在CLK的上升沿?cái)?shù)據(jù)均移入到內(nèi)部 16 位移位寄存器。即DIN不能在CLK的上升沿時(shí)進(jìn)行數(shù)據(jù)變換。
3.1.2. 數(shù)據(jù)位講解?
DIN傳輸?shù)?6位數(shù)據(jù)包說明,見表格000。其中D8-D11 為寄存器地址位。D0-D7 為數(shù)據(jù)位。D12-D15 為無(wú)效位。

根據(jù)以上的時(shí)序說明和傳輸格式,實(shí)現(xiàn)的數(shù)據(jù)傳輸代碼。
//向MAX7219寫入字節(jié) //dat寫入的數(shù)據(jù) void Write_Max7219_byte(uint8_t dat) { uint8_t i; MAX7219_CS(0);//確認(rèn)CS拉低 for(i=8;i>=1;i--)//傳輸8位 { MAX7219_CLK(0);//拉低CLK //當(dāng)前數(shù)據(jù)位是否為1 if( dat&0x80 ) { MAX7219_DIN(1); } else { MAX7219_DIN(0); } dat=dat<1;//準(zhǔn)備下一位數(shù)據(jù) //CLK拉高將數(shù)據(jù)載入寄存器 MAX7219_CLK(1); } }
//向MAX7219寫入數(shù)據(jù) //address寫入地址 dat寫入數(shù)據(jù) void Write_Max7219(uint8_t address,uint8_t dat) { //CS拉低 MAX7219_CS(0); //傳輸高8位數(shù)據(jù)(寄存器地址) Write_Max7219_byte(address); //傳輸?shù)?位數(shù)據(jù)(數(shù)據(jù)) Write_Max7219_byte(dat); //CS拉高 MAX7219_CS(1); }
3.1.3. 關(guān)鍵寄存器講解?
相關(guān)寄存器地址,見下表。這里先講解0X09譯碼方式寄存器。

我們發(fā)送的數(shù)據(jù)位是16位,而進(jìn)入譯碼方式寄存器只使用到了D15-D8數(shù)據(jù)位(0x09),還有D7到D0沒有設(shè)置。而根據(jù)數(shù)據(jù)手冊(cè)的說明,關(guān)于譯碼方式寄存器的D7-D0的設(shè)置在數(shù)據(jù)手冊(cè)的表格4.

按照?qǐng)D中所示,如果要設(shè)置譯碼方式為全部數(shù)碼管都進(jìn)行譯碼,那么要發(fā)送:
//高8位=0x09(寄存器地址), 低8位=0x00(數(shù)據(jù)) Write_Max7219(0x09,0x00);
點(diǎn)陣是通過一個(gè)個(gè)像素點(diǎn)顯示,要在8x8點(diǎn)陣上顯示個(gè)字符,需要以下兩步:
占據(jù)屏幕上的一塊地方,大小由字體大小說了算;
在占據(jù)的地方上依次控制每個(gè)像素點(diǎn)是否顯示。
比如一個(gè)8x8字體大小的字符,表示水平方向需要8個(gè)像素點(diǎn),垂直方向需要8個(gè)像素點(diǎn)。在這塊8x8的地盤上,每個(gè)像素點(diǎn)是否顯示由字模說了算,字模中的每1位數(shù)據(jù)表示一個(gè)像素點(diǎn),如果該位為0則表示此處像素點(diǎn)不顯示、為1則表示顯示(陰碼規(guī)則)。 以下為 逐行式,順向(高位在前),陰碼格式輸出的字模數(shù)據(jù)。在程序中逐位讀取字模,如果該位為0則該點(diǎn)點(diǎn)亮,如果該位為1則滅。

字模例子
0x7C,第一行顯示 0111 1100 0x42,第二行顯示 0100 0010 0x02,第三行顯示 0000 0010 0x04,第四行顯示 0000 0100 0x08,第五行顯示 0000 1000 0x30,第六行顯示 0011 0000 0x42,第七行顯示 0100 0010 0x7E 第八行顯示 0111 1110 (一共8行)
如果想要第0行顯示一條直線,應(yīng)如何操作?

先在數(shù)據(jù)手冊(cè)中找到關(guān)于第0個(gè)行的寄存器地址。根據(jù)右圖顯示得知,第0個(gè)數(shù)碼管的地址是0X01知道地址后,根據(jù)數(shù)據(jù)手冊(cè)提示找到數(shù)據(jù)位設(shè)置表,因?yàn)槿繘]有進(jìn)行譯碼,那么只需要發(fā)送:
//高8位=0x01(寄存器地址), 低8位=0xff(數(shù)據(jù)) Write_Max7219(0x01,0xff);//第0行顯示一條直線

3.2. 引腳選擇?
該模塊有10個(gè)引腳,其中有5個(gè)是接入下一個(gè)級(jí)聯(lián)的點(diǎn)陣。如果不接入下一個(gè)級(jí)聯(lián)的點(diǎn)陣,則只要接5個(gè)引腳,具體引腳連接見下表。
| 數(shù)碼管模塊 | 開發(fā)板 |
|---|---|
| VCC | 5V |
| GND | GND |
| DIN | PB10 |
| CS | PB13 |
| CLK | PB15 |
3.3. 移植至工程?
我們新建兩個(gè)文件分別是 bsp_DotMatrix.c 和 bsp_DotMatrix.h ,然后將C文件添加至工程中,將h文件路徑添加到工程中。

在文件bsp_DotMatrix.c中,編寫如下代碼。
/* * Change Logs: * Date Author Notes * 2024-06-18 LCKFB-LP first version */ #include "bsp_DotMatrix.h" #include "stdio.h" /****************************************************************** * 函 數(shù) 名 稱:MAX7219_GPIO_Init * 函 數(shù) 說 明:初始化MAX7219引腳 * 函 數(shù) 形 參:無(wú) * 函 數(shù) 返 回:無(wú) * 作 者:LC * 備 注:無(wú) ******************************************************************/ void MAX7219_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStruct; // GPIO初始化結(jié)構(gòu)體 RCC_MAX7219_ENABLE(); // 使能GPIO時(shí)鐘 GPIO_InitStruct.Pins = GPIO_MAX7219_CLK| // GPIO引腳 GPIO_MAX7219_DIN| GPIO_MAX7219_CS; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; // 推挽輸出 GPIO_InitStruct.Speed = GPIO_SPEED_HIGH; // 輸出速度高 GPIO_Init(PORT_MAX7219, &GPIO_InitStruct); // 初始化 } /****************************************************************** * 函 數(shù) 名 稱:Write_Max7219_byte * 函 數(shù) 說 明:向MAX7219寫入字節(jié) * 函 數(shù) 形 參:dat寫入的數(shù)據(jù) * 函 數(shù) 返 回:無(wú) * 作 者:LC * 備 注:無(wú) ******************************************************************/ void Write_Max7219_byte(uint8_t dat) { uint8_t i; MAX7219_CS(0); for(i=8;i>=1;i--) { MAX7219_CLK(0); if( dat&0x80 ) { MAX7219_DIN(1); } else { MAX7219_DIN(0); } dat=dat<1; MAX7219_CLK(1); } } /****************************************************************** * 函 數(shù) 名 稱:Write_Max7219 * 函 數(shù) 說 明:向MAX7219寫入數(shù)據(jù) * 函 數(shù) 形 參:address寫入地址 dat寫入數(shù)據(jù) * 函 數(shù) 返 回:無(wú) * 作 者:LC * 備 注:無(wú) ******************************************************************/ void Write_Max7219(uint8_t address,uint8_t dat) { Write_Max7219_byte(address); //寫入地址,即點(diǎn)陣行號(hào)1-8 Write_Max7219_byte(dat); //寫入數(shù)據(jù),即該行顯示內(nèi)容 } /****************************************************************** * 函 數(shù) 名 稱:Max7219_Lock * 函 數(shù) 說 明:將更新的數(shù)據(jù)寫入芯片 * 函 數(shù) 形 參:無(wú) * 函 數(shù) 返 回:無(wú) * 作 者:LC * 備 注:無(wú) ******************************************************************/ void Max7219_Lock(void) { MAX7219_CS(1); MAX7219_CS(0); } /****************************************************************** * 函 數(shù) 名 稱:Max7219_display * 函 數(shù) 說 明:4個(gè)點(diǎn)陣顯示 * 函 數(shù) 形 參:show1第一個(gè)點(diǎn)陣顯示內(nèi)容 show2第二個(gè) show3第三個(gè) show4第四個(gè) * 函 數(shù) 返 回:無(wú) * 作 者:LC * 備 注:無(wú) ******************************************************************/ void Max7219_display(uint8_t* show1, uint8_t* show2, uint8_t* show3, uint8_t* show4) { uint8_t i = 0; for(i = 1; i < 9; i++ )//1~8行 進(jìn)行更新 { Write_Max7219_byte(i); //寫入地址,即行編號(hào)1-8 Write_Max7219_byte(show1[i-1]); //第一個(gè)點(diǎn)陣 Write_Max7219_byte(i); //寫入地址,即行編號(hào)1-8 Write_Max7219_byte(show2[i-1]); //第二個(gè)點(diǎn)陣 Write_Max7219_byte(i); //寫入地址,即行編號(hào)1-8 Write_Max7219_byte(show3[i-1]); //第三個(gè)點(diǎn)陣 Write_Max7219_byte(i); //寫入地址,即行編號(hào)1-8 Write_Max7219_byte(show4[i-1]); //第四個(gè)點(diǎn)陣 Max7219_Lock();//鎖存顯示數(shù)據(jù) } } /****************************************************************** * 函 數(shù) 名 稱:Write_Max7219_AllOff * 函 數(shù) 說 明:控制第一片MAX7219的全部數(shù)碼管全滅 * 函 數(shù) 形 參:address寫入地址 dat寫入數(shù)據(jù) * 函 數(shù) 返 回:無(wú) * 作 者:LC * 備 注:無(wú) ******************************************************************/ void Write_Max7219_AllOff(void) { int i = 0; for( i = 1; i < 9; i++ )//1~8行 進(jìn)行更新 { Write_Max7219_byte(i); //寫入地址,即行編號(hào)1-8 Write_Max7219_byte(0x00); //全滅 Write_Max7219_byte(i); //寫入地址,即行編號(hào)1-8 Write_Max7219_byte(0x00); //全滅 Write_Max7219_byte(i); //寫入地址,即行編號(hào)1-8 Write_Max7219_byte(0x00); //全滅 Write_Max7219_byte(i); //寫入地址,即行編號(hào)1-8 Write_Max7219_byte(0x00); //全滅 Max7219_Lock();//更新內(nèi)容 } } /****************************************************************** * 函 數(shù) 名 稱:MAX7219_Init * 函 數(shù) 說 明:MAX7219初始化 * 函 數(shù) 形 參:無(wú) * 函 數(shù) 返 回:無(wú) * 作 者:LC * 備 注:無(wú) ******************************************************************/ void MAX7219_Init(void) { unsigned int i = 0; MAX7219_GPIO_Init();//引腳初始化 for( i = 0; i < 4; i++ )//設(shè)置4個(gè)點(diǎn)陣 { Write_Max7219(0x09, 0x00); //譯碼方式:不進(jìn)行譯碼 } Max7219_Lock();//更新設(shè)置 for( i = 0; i < 4; i++ )//設(shè)置4個(gè)點(diǎn)陣 { Write_Max7219(0x0a, 0x01); //亮度 } Max7219_Lock();//更新設(shè)置 for( i = 0; i < 4; i++ )//設(shè)置4個(gè)點(diǎn)陣 { Write_Max7219(0x0b, 0x07); //掃描界限;8個(gè)數(shù)碼管顯示 } Max7219_Lock();//更新設(shè)置 for( i = 0; i < 4; i++ )//設(shè)置4個(gè)點(diǎn)陣 { Write_Max7219(0x0c, 0x01); //掉電模式:0,普通模式:1 } Max7219_Lock();//更新設(shè)置 for( i = 0; i < 4; i++ )//設(shè)置4個(gè)點(diǎn)陣 { Write_Max7219(0x0f, 0x00); //顯示測(cè)試:1;測(cè)試結(jié)束,正常顯示:0 } Max7219_Lock();//更新設(shè)置 }
在文件bsp_DotMatrix.h中,編寫如下代碼。
/* * Change Logs: * Date Author Notes * 2024-06-18 LCKFB-LP first version */ #ifndef _BSP_DOTMATRIX_H_ #define _BSP_DOTMATRIX_H_ #include "board.h" #define RCC_MAX7219_ENABLE() __RCC_GPIOB_CLK_ENABLE() #define PORT_MAX7219 CW_GPIOB #define GPIO_MAX7219_CLK GPIO_PIN_15 #define GPIO_MAX7219_DIN GPIO_PIN_10 #define GPIO_MAX7219_CS GPIO_PIN_13 #define MAX7219_CLK(X) GPIO_WritePin(PORT_MAX7219, GPIO_MAX7219_CLK, X?GPIO_Pin_SET:GPIO_Pin_RESET) #define MAX7219_DIN(X) GPIO_WritePin(PORT_MAX7219, GPIO_MAX7219_DIN, X?GPIO_Pin_SET:GPIO_Pin_RESET) #define MAX7219_CS(X) GPIO_WritePin(PORT_MAX7219, GPIO_MAX7219_CS, X?GPIO_Pin_SET:GPIO_Pin_RESET) void Write_Max7219(uint8_t address,uint8_t dat); void Write_Max7219_2(unsigned char address,unsigned char dat); void Write_Max7219_AllOff(void); void MAX7219_Init(void); void Max7219_display(uint8_t* show1, uint8_t* show2, uint8_t* show3, uint8_t* show4); #endi
四、移植驗(yàn)證?
在自己工程中的main主函數(shù)中,編寫如下。
/* * Change Logs: * Date Author Notes * 2024-06-18 LCKFB-LP first version */ #include "board.h" #include "stdio.h" #include "bsp_uart.h" #include "bsp_DotMatrix.h" unsigned char disp1[12][8]={//一共12行 {0x3C,0x42,0x42,0x42,0x42,0x42,0x66,0x38},/*"0",0*/ {0x38,0x08,0x08,0x08,0x08,0x08,0x08,0x18},/*"1",1*/ {0x7C,0x42,0x02,0x04,0x08,0x30,0x42,0x7E},/*"2",2*/ {0x7C,0x46,0x04,0x18,0x06,0x02,0x42,0x3C},/*"3",3*/ {0x0C,0x14,0x14,0x24,0x44,0x3C,0x04,0x0C},/*"4",4*/ {0x3E,0x40,0x58,0x64,0x02,0x02,0x42,0x3C},/*"5",5*/ {0x3E,0x40,0x48,0x76,0x42,0x42,0x42,0x3C},/*"6",6*/ {0x7E,0x04,0x04,0x08,0x10,0x10,0x10,0x10},/*"7",7*/ {0x7C,0x42,0x62,0x3C,0x44,0x42,0x42,0x3C},/*"8",8*/ {0x7C,0x42,0x42,0x46,0x3A,0x02,0x44,0x38},/*"9",9*/ {0x3A,0x04,0x04,0x24,0x24,0x18,0x08,0x7E},/*"立",10*/ {0x52,0x4E,0x76,0xD6,0x56,0x76,0x4A,0x4E},/*"創(chuàng)",11*/ }; int main(void) { board_init(); uart1_init(115200); MAX7219_Init(); Write_Max7219_AllOff(); printf("MAX7219 demo startrn"); while(1) { //第一個(gè)點(diǎn)陣顯示disp1數(shù)組的第10行內(nèi)容 //第二個(gè)點(diǎn)陣顯示disp1數(shù)組的第11行內(nèi)容 //第三個(gè)點(diǎn)陣顯示disp1數(shù)組的第7行內(nèi)容 //第四個(gè)點(diǎn)陣顯示disp1數(shù)組的第6行內(nèi)容 Max7219_display(disp1[10],disp1[11], disp1[7], disp1[6]); delay_ms(1000); } }
上電效果:顯示“立創(chuàng)76”

移植成功案例代碼:
鏈接:https://pan.baidu.com/s/1xXCdgOcDR8lY7poyH9vayA?pwd=LCKF 提取碼:LCKF
審核編輯 黃宇
-
寄存器
+關(guān)注
關(guān)注
31文章
5590瀏覽量
129089 -
CW32
+關(guān)注
關(guān)注
1文章
281瀏覽量
1679
發(fā)布評(píng)論請(qǐng)先 登錄
CW32單片機(jī)在智能馬桶的應(yīng)用
CW32 MCU溫度監(jiān)測(cè)應(yīng)用
基于芯源CW32 MCU智能家居照明控制系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)
使用芯源CW32的CW32L012開發(fā)評(píng)估板做了spi屏幕驅(qū)動(dòng)
CW32 MCU用什么IDE開發(fā)?
CW32 MCU有哪些系列?
錦浪科技四合一混合儲(chǔ)能逆變器助力迎峰度夏
用Wi-Fi藍(lán)牙模組Ai-M62-CBS做一個(gè)電子沙漏
CW32模塊使用 0.91寸彩屏
5050 RGBW 四合一全彩 LED 燈珠
CW32模塊使用 WS2812彩燈
CW32模塊使用 紅外接收模塊
CW32模塊使用 紅外解碼編碼模塊

CW32模塊使用 MAX7219四合一點(diǎn)陣模塊
評(píng)論