一、 模块来源
资料下载链接: https://pan.baidu.com/s/15TcV9HevtfVBWcm7pgRNTw
资料提取码:e1q5

产品实物展示
二、规格参数
工作电压:4-5.5V
工作电流:8-330MA
扫描速率:500-1300Hz
通信协议:单总线
以上信息见厂家资料文件
三、移植过程
我们的目标是将例程移植至CW32F030C8T6开发板上。首先要获取资料,查看数据手册应如何实现读取数据,再移植至我们的工程。
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位=0xff(数据) Write_Max7219(0x09,0xff);
在全部数码管都进行译码的情况下,如果想要第0个数码管显示数字3,第1个数码管不显示应如何操作?

先在数据手册中找到关于第0个数码管和第1个数码管的寄存器地址。根据右图显示得知,第0个数码管的地址是0X01;第1个数码管的地址是0X02。知道地址后,根据数据手册提示找到数据位设置表,因为全部数码管都进行了译码,那么只需要发送:
//高8位=0x01(寄存器地址), 低8位=0x03(数据) Write_Max7219(0x01,0x03);//第0个数码管显示数字3 //高8位=0x02(寄存器地址), 低8位=0x0F(数据) Write_Max7219(0x02,0x0F);//第1个数码管b不显示

3.2. 引脚选择
该模块有10个引脚,其中有5个是接入下一个级联的数码管。如果不接入下一个级联的数码管,则只要接5个引脚,具体引脚连接见各引脚连接。

模块接线图
3.3. 移植至工程
我们新建两个文件分别是 bsp_max7219.c 和 bsp_max7219.h ,然后将C文件添加至工程中,将h文件路径添加到工程中。

在文件bsp_max7219.c中,编写如下代码。
/* * Change Logs: * Date Author Notes * 2024-06-18 LCKFB-LP first version */ #include "bsp_max7219.h" #include "stdio.h" #include "board.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) { MAX7219_CS(0); Write_Max7219_byte(address); //写入地址,即数码管编号1-8 Write_Max7219_byte(dat); //写入数据,即数码管显示内容字 MAX7219_CS(1); } /****************************************************************** * 函 数 名 称:Write_Max7219_2 * 函 数 说 明:向第二片MAX7219写入数据 * 函 数 形 参:address写入地址 dat写入数据 * 函 数 返 回:无 * 作 者:LC * 备 注:只有接入第二片MAX7219才可以用 ******************************************************************/ void Write_Max7219_2(uint8_t address,uint8_t dat) { MAX7219_CS(0); Write_Max7219_byte(address); //写入地址,即数码管编号1-8 Write_Max7219_byte(dat); //写入数据,即数码管显示内容 MAX7219_CLK(1); Write_Max7219_byte(0X00); //对第一片执行空操作 Write_Max7219_byte(0X00); MAX7219_CS(1); } /****************************************************************** * 函 数 名 称:Write_Max7219_AllOff * 函 数 说 明:控制第一片MAX7219的全部数码管全灭 * 函 数 形 参:address写入地址 dat写入数据 * 函 数 返 回:无 * 作 者:LC * 备 注: ******************************************************************/ void Write_Max7219_AllOff(void) { int i = 0; for( i = 1; i < 9; i++ ) { MAX7219_CS(0); Write_Max7219_byte(i); //写入地址,即数码管编号1-8 Write_Max7219_byte(15); //全灭 MAX7219_CS(1); } } /****************************************************************** * 函 数 名 称:MAX7219_Init * 函 数 说 明:MAX7219初始化 * 函 数 形 参:无 * 函 数 返 回:无 * 作 者:LC * 备 注:无 ******************************************************************/ void MAX7219_Init(void) { MAX7219_GPIO_Init(); //引脚初始化 Write_Max7219(0x09, 0xff); //译码方式:BCD码 Write_Max7219(0x0a, 0x03); //亮度 Write_Max7219(0x0b, 0x07); //扫描界限;4个数码管显示 Write_Max7219(0x0c, 0x01); //掉电模式:0,普通模式:1 Write_Max7219(0x0f, 0x01); //显示测试:1;测试结束,正常显示:0 }
在文件bsp_max7219.h中,编写如下代码。
/* * 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. 移植验证
在自己工程中的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_max7219.h" int32_t main(void) { board_init(); // 开发板初始化 uart1_init(115200); // 串口1波特率115200 int i =0; MAX7219_Init(); delay_ms(1000); Write_Max7219(0x0f, 0x00); //显示测试:1;测试结束,正常显示:0 Write_Max7219_AllOff();//数码管全灭 printf("MAX7219 demo startrn"); while(1) { //第一个显示1,第二个显示2,第三个显示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
审核编辑 黄宇
-
数码管
+关注
关注
32文章
1891浏览量
93710 -
CW32
+关注
关注
1文章
281浏览量
1677
发布评论请先 登录
CW32单片机在智能马桶的应用
CW32 MCU温度监测应用
第5章 定时器与数码管基础(5.3)
【瑞萨RA6E2】ADC数据采集与数码管显示
使用芯源CW32的CW32L012开发评估板做了spi屏幕驱动
FZH114 LED(发光二极管、数码管、点阵屏)驱动控制专用芯片,集成数字通讯电路、 解码电路、数据锁存器、震荡器
CW32 MCU用什么IDE开发?
级联动态扫描显示数码管问题
CW32模块使用 0.91寸彩屏
CW32模块使用 1.3寸单色OLED显示屏
数码管的结构与原理
四位数码管12个引脚怎么分配
CW32模块使用 红外接收模块

CW32模块使用 8位数码管显示模块
评论