一、 模塊來(lái)源
?
資料下載鏈接: https://pan.baidu.com/s/15TcV9HevtfVBWcm7pgRNTw
資料提取碼:e1q5
產(chǎn)品實(shí)物展示
二、規(guī)格參數(shù)?
工作電壓:4-5.5V
工作電流:8-330MA
掃描速率:500-1300Hz
通信協(xié)議:?jiǎn)慰偩€
以上信息見(jiàn)廠家資料文件
三、移植過(guò)程?
我們的目標(biāo)是將例程移植至CW32F030C8T6開(kāi)發(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)說(shuō),串行數(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ù)包說(shuō)明,見(jiàn)表格000。其中D8-D11 為寄存器地址位。D0-D7 為數(shù)據(jù)位。D12-D15 為無(wú)效位。
根據(jù)以上的時(shí)序說(shuō)明和傳輸格式,實(shí)現(xiàn)的數(shù)據(jù)傳輸代碼。
//向MAX7219寫(xiě)入字節(jié) //dat寫(xiě)入的數(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寫(xiě)入數(shù)據(jù) //address寫(xiě)入地址 dat寫(xiě)入數(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)寄存器地址,見(jiàn)下表。這里先講解0X09譯碼方式寄存器。
我們發(fā)送的數(shù)據(jù)位是16位,而進(jìn)入譯碼方式寄存器只使用到了D15-D8數(shù)據(jù)位(0x09),還有D7到D0沒(méi)有設(shè)置。而根據(jù)數(shù)據(jù)手冊(cè)的說(shuō)明,關(guān)于譯碼方式寄存器的D7-D0的設(shè)置在數(shù)據(jù)手冊(cè)的表格4.
按照?qǐng)D中所示,如果要設(shè)置譯碼方式為全部數(shù)碼管都進(jìn)行譯碼,那么要發(fā)送:
//高8位=0x09(寄存器地址), 低8位=0xff(數(shù)據(jù)) Write_Max7219(0x09,0xff);
在全部數(shù)碼管都進(jìn)行譯碼的情況下,如果想要第0個(gè)數(shù)碼管顯示數(shù)字3,第1個(gè)數(shù)碼管不顯示應(yīng)如何操作?
先在數(shù)據(jù)手冊(cè)中找到關(guān)于第0個(gè)數(shù)碼管和第1個(gè)數(shù)碼管的寄存器地址。根據(jù)右圖顯示得知,第0個(gè)數(shù)碼管的地址是0X01;第1個(gè)數(shù)碼管的地址是0X02。知道地址后,根據(jù)數(shù)據(jù)手冊(cè)提示找到數(shù)據(jù)位設(shè)置表,因?yàn)槿繑?shù)碼管都進(jìn)行了譯碼,那么只需要發(fā)送:
//高8位=0x01(寄存器地址), 低8位=0x03(數(shù)據(jù)) Write_Max7219(0x01,0x03);//第0個(gè)數(shù)碼管顯示數(shù)字3 //高8位=0x02(寄存器地址), 低8位=0x0F(數(shù)據(jù)) Write_Max7219(0x02,0x0F);//第1個(gè)數(shù)碼管b不顯示

3.2. 引腳選擇?
該模塊有10個(gè)引腳,其中有5個(gè)是接入下一個(gè)級(jí)聯(lián)的數(shù)碼管。如果不接入下一個(gè)級(jí)聯(lián)的數(shù)碼管,則只要接5個(gè)引腳,具體引腳連接見(jiàn)各引腳連接。
模塊接線圖
3.3. 移植至工程?
我們新建兩個(gè)文件分別是 bsp_max7219.c 和 bsp_max7219.h ,然后將C文件添加至工程中,將h文件路徑添加到工程中。
在文件bsp_max7219.c中,編寫(xiě)如下代碼。
/* * Change Logs: * Date Author Notes * 2024-06-18 LCKFB-LP first version */ #include "bsp_max7219.h" #include "stdio.h" #include "board.h" /****************************************************************** * 函 數(shù) 名 稱:MAX7219_GPIO_Init * 函 數(shù) 說(shuō) 明:初始化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ù) 說(shuō) 明:向MAX7219寫(xiě)入字節(jié) * 函 數(shù) 形 參:dat寫(xiě)入的數(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ù) 說(shuō) 明:向MAX7219寫(xiě)入數(shù)據(jù) * 函 數(shù) 形 參:address寫(xiě)入地址 dat寫(xiě)入數(shù)據(jù) * 函 數(shù) 返 回:無(wú) * 作 者:LC * 備 注:無(wú) ******************************************************************/ void Write_Max7219(uint8_t address,uint8_t dat) { MAX7219_CS(0); Write_Max7219_byte(address); //寫(xiě)入地址,即數(shù)碼管編號(hào)1-8 Write_Max7219_byte(dat); //寫(xiě)入數(shù)據(jù),即數(shù)碼管顯示內(nèi)容字 MAX7219_CS(1); } /****************************************************************** * 函 數(shù) 名 稱:Write_Max7219_2 * 函 數(shù) 說(shuō) 明:向第二片MAX7219寫(xiě)入數(shù)據(jù) * 函 數(shù) 形 參:address寫(xiě)入地址 dat寫(xiě)入數(shù)據(jù) * 函 數(shù) 返 回:無(wú) * 作 者:LC * 備 注:只有接入第二片MAX7219才可以用 ******************************************************************/ void Write_Max7219_2(uint8_t address,uint8_t dat) { MAX7219_CS(0); Write_Max7219_byte(address); //寫(xiě)入地址,即數(shù)碼管編號(hào)1-8 Write_Max7219_byte(dat); //寫(xiě)入數(shù)據(jù),即數(shù)碼管顯示內(nèi)容 MAX7219_CLK(1); Write_Max7219_byte(0X00); //對(duì)第一片執(zhí)行空操作 Write_Max7219_byte(0X00); MAX7219_CS(1); } /****************************************************************** * 函 數(shù) 名 稱:Write_Max7219_AllOff * 函 數(shù) 說(shuō) 明:控制第一片MAX7219的全部數(shù)碼管全滅 * 函 數(shù) 形 參:address寫(xiě)入地址 dat寫(xiě)入數(shù)據(jù) * 函 數(shù) 返 回:無(wú) * 作 者:LC * 備 注: ******************************************************************/ void Write_Max7219_AllOff(void) { int i = 0; for( i = 1; i < 9; i++ ) { MAX7219_CS(0); Write_Max7219_byte(i); //寫(xiě)入地址,即數(shù)碼管編號(hào)1-8 Write_Max7219_byte(15); //全滅 MAX7219_CS(1); } } /****************************************************************** * 函 數(shù) 名 稱:MAX7219_Init * 函 數(shù) 說(shuō) 明:MAX7219初始化 * 函 數(shù) 形 參:無(wú) * 函 數(shù) 返 回:無(wú) * 作 者:LC * 備 注:無(wú) ******************************************************************/ void MAX7219_Init(void) { MAX7219_GPIO_Init(); //引腳初始化 Write_Max7219(0x09, 0xff); //譯碼方式:BCD碼 Write_Max7219(0x0a, 0x03); //亮度 Write_Max7219(0x0b, 0x07); //掃描界限;4個(gè)數(shù)碼管顯示 Write_Max7219(0x0c, 0x01); //掉電模式:0,普通模式:1 Write_Max7219(0x0f, 0x01); //顯示測(cè)試:1;測(cè)試結(jié)束,正常顯示:0 }
在文件bsp_max7219.h中,編寫(xiě)如下代碼。
/* * Change Logs: * Date Author Notes * 2024-06-18 LCKFB-LP first version */ #ifndef _BSP_MAX7219_H_ #define _BSP_MAX7219_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(uint8_t address,uint8_t dat); void Write_Max7219_AllOff(void); void MAX7219_Init(void); #endi
4. 移植驗(yàn)證?
在自己工程中的main主函數(shù)中,編寫(xiě)如下。
/* * Change Logs: * Date Author Notes * 2024-06-18 LCKFB-LP first version */ #include "board.h" #include "stdio.h" #include "bsp_uart.h" #include "bsp_max7219.h" int32_t main(void) { board_init(); // 開(kāi)發(fā)板初始化 uart1_init(115200); // 串口1波特率115200 int i =0; MAX7219_Init(); delay_ms(1000); Write_Max7219(0x0f, 0x00); //顯示測(cè)試:1;測(cè)試結(jié)束,正常顯示:0 Write_Max7219_AllOff();//數(shù)碼管全滅 printf("MAX7219 demo startrn"); while(1) { //第一個(gè)顯示1,第二個(gè)顯示2,第三個(gè)顯示3... for( i = 1; i < 9; i++ )//從1顯示到8 { Write_Max7219(i, i); delay_ms(1000); } } }
上電效果:
模塊移植成功案例代碼:
鏈接:https://pan.baidu.com/s/1U_l3vfG-S79em6yLpkIWxQ?pwd=LCKF 提取碼:LCKF
審核編輯 黃宇
-
數(shù)碼管
+關(guān)注
關(guān)注
32文章
1889瀏覽量
92397 -
CW32
+關(guān)注
關(guān)注
1文章
243瀏覽量
1174
發(fā)布評(píng)論請(qǐng)先 登錄
數(shù)碼管的結(jié)構(gòu)與原理
四位數(shù)碼管12個(gè)引腳怎么分配
CW32模塊使用 紅外接收模塊

基于FPGA實(shí)現(xiàn)數(shù)碼管顯示

評(píng)論