四合一點陣顯示模塊采用MAX7219作為控制,它是一種集成化的串行輸入/輸出共陰極顯示驅動器,它連接微處理器與8位數字的7段數字LED顯示,也可以連接條線圖顯示器或者64個獨立的LED。其上包括一個片上的B型BCD編碼器、多路掃描回路,段字驅動器,而且還有一個8*8的靜態RAM用來存儲每一個數據。只有一個外部寄存器用來設置各個LED的段電流。它可以連接所有通用的微處理器。每個數據可以尋址在更新時不需要改寫所有的顯示。MAX7219同樣允許用戶對每一個數據選擇編碼或者不編碼。
整個設備包含一個150μA的低功耗關閉模式,模擬和數字亮度控制,一個掃描限制寄存器允許用戶顯示1-8位數據,還有一個讓所有LED發光的檢測模式。
只需要3個IO口即可驅動1個點陣!點陣顯示時無閃爍!支持級聯!
一、二、 模塊來源?
采購鏈接:
資料下載鏈接: https://pan.baidu.com/s/19WdOd8D2QlPi1Q_EWlb3fQ
資料提取碼:b822
產品實物展示
2、規格參數?
工作電壓:4-5.5V
工作電流:8-330MA
掃描速率:500-1300Hz
通信協議:串行通信
以上信息見廠家資料文件
三、移植過程?
我們的目標是將例程移植至MSPM0G3507開發板上。首先要獲取資料,查看數據手冊應如何實現讀取數據,再移植至我們的工程。
3.1. 查看資料?
3.1.1. 時序講解?
無論數據輸入或輸出CS端必須為低電平。然后數據在CS端的上升沿被載入數據寄存器或控制寄存器。CS端在第 16個時鐘的上升沿之后,下個時鐘上升沿之前變為高電平,否則數據將會丟失。
對 MAX7219 來說,串行數據在 DIN 輸入 16 位數據包,在CLK的上升沿數據均移入到內部 16 位移位寄存器。即DIN不能在CLK的上升沿時進行數據變換。
3.1.2. 數據位講解?
DIN傳輸的16位數據包說明,見表格000。其中D8-D11 為寄存器地址位。D0-D7 為數據位。D12-D15 為無效位。
根據以上的時序說明和傳輸格式,實現的數據傳輸代碼。
//向MAX7219寫入字節 //dat寫入的數據 void Write_Max7219_byte(uint8_t dat) { uint8_t i; MAX7219_CS(0);//確認CS拉低 for(i=8;i>=1;i--)//傳輸8位 { MAX7219_CLK(0);//拉低CLK //當前數據位是否為1 if( dat&0x80 ) { MAX7219_DIN(1); } else { MAX7219_DIN(0); } dat=dat<1;//準備下一位數據 //CLK拉高將數據載入寄存器 MAX7219_CLK(1); } }
//向MAX7219寫入數據 //address寫入地址 dat寫入數據 void Write_Max7219(uint8_t address,uint8_t dat) { //CS拉低 MAX7219_CS(0); //傳輸高8位數據(寄存器地址) Write_Max7219_byte(address); //傳輸低8位數據(數據) Write_Max7219_byte(dat); //CS拉高 MAX7219_CS(1); }
3.1.3. 關鍵寄存器講解?
相關寄存器地址,見下表。這里先講解0X09譯碼方式寄存器。
我們發送的數據位是16位,而進入譯碼方式寄存器只使用到了D15-D8數據位(0x09),還有D7到D0沒有設置。而根據數據手冊的說明,關于譯碼方式寄存器的D7-D0的設置在數據手冊的表格4.
按照圖中所示,如果要設置譯碼方式為全部數碼管都進行譯碼,那么要發送:
//高8位=0x09(寄存器地址), 低8位=0x00(數據) Write_Max7219(0x09,0x00);
點陣是通過一個個像素點顯示,要在8x8點陣上顯示個字符,需要以下兩步:
占據屏幕上的一塊地方,大小由字體大小說了算;
在占據的地方上依次控制每個像素點是否顯示。
比如一個8x8字體大小的字符,表示水平方向需要8個像素點,垂直方向需要8個像素點。在這塊8x8的地盤上,每個像素點是否顯示由字模說了算,字模中的每1位數據表示一個像素點,如果該位為0則表示此處像素點不顯示、為1則表示顯示(陰碼規則)。 以下為 逐行式,順向(高位在前),陰碼格式輸出的字模數據。在程序中逐位讀取字模,如果該位為0則該點點亮,如果該位為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行顯示一條直線,應如何操作?
先在數據手冊中找到關于第0個行的寄存器地址。根據右圖顯示得知,第0個數碼管的地址是0X01知道地址后,根據數據手冊提示找到數據位設置表,因為全部沒有進行譯碼,那么只需要發送:
//高8位=0x01(寄存器地址), 低8位=0xff(數據) Write_Max7219(0x01,0xff);//第0行顯示一條直線
3.2. 引腳選擇?
該模塊有10個引腳,其中有5個是接入下一個級聯的點陣。如果不接入下一個級聯的點陣,則只要接5個引腳,具體引腳連接見下表。
數碼管模塊 | 開發板 |
---|---|
VCC | 5V |
GND | GND |
DIN | PB10 |
CS | PB13 |
CLK | PB15 |
3.3. 移植至工程?
我們新建兩個文件分別是 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" /****************************************************************** * 函 數 名 稱:MAX7219_GPIO_Init * 函 數 說 明:初始化MAX7219引腳 * 函 數 形 參:無 * 函 數 返 回:無 * 作 者:LC * 備 注:無 ******************************************************************/ void MAX7219_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStruct; // GPIO初始化結構體 RCC_MAX7219_ENABLE(); // 使能GPIO時鐘 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); // 初始化 } /****************************************************************** * 函 數 名 稱:Write_Max7219_byte * 函 數 說 明:向MAX7219寫入字節 * 函 數 形 參:dat寫入的數據 * 函 數 返 回:無 * 作 者:LC * 備 注:無 ******************************************************************/ 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); } } /****************************************************************** * 函 數 名 稱:Write_Max7219 * 函 數 說 明:向MAX7219寫入數據 * 函 數 形 參:address寫入地址 dat寫入數據 * 函 數 返 回:無 * 作 者:LC * 備 注:無 ******************************************************************/ void Write_Max7219(uint8_t address,uint8_t dat) { Write_Max7219_byte(address); //寫入地址,即點陣行號1-8 Write_Max7219_byte(dat); //寫入數據,即該行顯示內容 } /****************************************************************** * 函 數 名 稱:Max7219_Lock * 函 數 說 明:將更新的數據寫入芯片 * 函 數 形 參:無 * 函 數 返 回:無 * 作 者:LC * 備 注:無 ******************************************************************/ void Max7219_Lock(void) { MAX7219_CS(1); MAX7219_CS(0); } /****************************************************************** * 函 數 名 稱:Max7219_display * 函 數 說 明:4個點陣顯示 * 函 數 形 參:show1第一個點陣顯示內容 show2第二個 show3第三個 show4第四個 * 函 數 返 回:無 * 作 者:LC * 備 注:無 ******************************************************************/ 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行 進行更新 { Write_Max7219_byte(i); //寫入地址,即行編號1-8 Write_Max7219_byte(show1[i-1]); //第一個點陣 Write_Max7219_byte(i); //寫入地址,即行編號1-8 Write_Max7219_byte(show2[i-1]); //第二個點陣 Write_Max7219_byte(i); //寫入地址,即行編號1-8 Write_Max7219_byte(show3[i-1]); //第三個點陣 Write_Max7219_byte(i); //寫入地址,即行編號1-8 Write_Max7219_byte(show4[i-1]); //第四個點陣 Max7219_Lock();//鎖存顯示數據 } } /****************************************************************** * 函 數 名 稱:Write_Max7219_AllOff * 函 數 說 明:控制第一片MAX7219的全部數碼管全滅 * 函 數 形 參:address寫入地址 dat寫入數據 * 函 數 返 回:無 * 作 者:LC * 備 注:無 ******************************************************************/ void Write_Max7219_AllOff(void) { int i = 0; for( i = 1; i < 9; i++ )//1~8行 進行更新 { Write_Max7219_byte(i); //寫入地址,即行編號1-8 Write_Max7219_byte(0x00); //全滅 Write_Max7219_byte(i); //寫入地址,即行編號1-8 Write_Max7219_byte(0x00); //全滅 Write_Max7219_byte(i); //寫入地址,即行編號1-8 Write_Max7219_byte(0x00); //全滅 Write_Max7219_byte(i); //寫入地址,即行編號1-8 Write_Max7219_byte(0x00); //全滅 Max7219_Lock();//更新內容 } } /****************************************************************** * 函 數 名 稱:MAX7219_Init * 函 數 說 明:MAX7219初始化 * 函 數 形 參:無 * 函 數 返 回:無 * 作 者:LC * 備 注:無 ******************************************************************/ void MAX7219_Init(void) { unsigned int i = 0; MAX7219_GPIO_Init();//引腳初始化 for( i = 0; i < 4; i++ )//設置4個點陣 { Write_Max7219(0x09, 0x00); //譯碼方式:不進行譯碼 } Max7219_Lock();//更新設置 for( i = 0; i < 4; i++ )//設置4個點陣 { Write_Max7219(0x0a, 0x01); //亮度 } Max7219_Lock();//更新設置 for( i = 0; i < 4; i++ )//設置4個點陣 { Write_Max7219(0x0b, 0x07); //掃描界限;8個數碼管顯示 } Max7219_Lock();//更新設置 for( i = 0; i < 4; i++ )//設置4個點陣 { Write_Max7219(0x0c, 0x01); //掉電模式:0,普通模式:1 } Max7219_Lock();//更新設置 for( i = 0; i < 4; i++ )//設置4個點陣 { Write_Max7219(0x0f, 0x00); //顯示測試:1;測試結束,正常顯示:0 } Max7219_Lock();//更新設置 }
在文件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
四、移植驗證?
在自己工程中的main主函數中,編寫如下。
/* * 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},/*"創",11*/ }; int main(void) { board_init(); uart1_init(115200); MAX7219_Init(); Write_Max7219_AllOff(); printf("MAX7219 demo startrn"); while(1) { //第一個點陣顯示disp1數組的第10行內容 //第二個點陣顯示disp1數組的第11行內容 //第三個點陣顯示disp1數組的第7行內容 //第四個點陣顯示disp1數組的第6行內容 Max7219_display(disp1[10],disp1[11], disp1[7], disp1[6]); delay_ms(1000); } }
上電效果:顯示“立創76”
移植成功案例代碼:
鏈接:https://pan.baidu.com/s/1xXCdgOcDR8lY7poyH9vayA?pwd=LCKF 提取碼:LCKF
審核編輯 黃宇
-
寄存器
+關注
關注
31文章
5408瀏覽量
123074 -
CW32
+關注
關注
1文章
242瀏覽量
1059
發布評論請先 登錄
【CW32模塊使用】1.8寸彩色觸摸屏

代碼+案例+生態:武漢芯源半導體CW32嵌入式開發實戰正式出版
CW32模塊使用 紅外接收模塊

CW32模塊使用 EC-01G NBIOT+GPS模塊

CW32模塊使用 NEO-6M GPS模塊

CW32模塊使用 HC05藍牙模塊

CW32模塊使用 紅外解碼編碼模塊

CW32模塊使用 BMP180氣壓傳感器

ESP32驅動3264點陣屏有噪點的原因?
基于CW32的有刷直流電機控制實驗三:直流電機閉環位置和速度控制實驗

評論