0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

CW32生态社区 来源:CW32生态社区 作者:CW32生态社区 2025-05-12 16:09 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

一、 模块来源


资料下载链接: https://pan.baidu.com/s/15TcV9HevtfVBWcm7pgRNTw
资料提取码:e1q5

wKgZPGggY2uAC2RwAAKzvEMLdbs551.jpg


产品实物展示

二、规格参数

工作电压:4-5.5V

工作电流:8-330MA

扫描速率:500-1300Hz

通信协议:单总线

管脚数量:5 Pin(2.54mm间距排针

以上信息见厂家资料文件

三、移植过程

我们的目标是将例程移植至CW32F030C8T6开发板上。首先要获取资料,查看数据手册应如何实现读取数据,再移植至我们的工程。

3.1. 查看资料

3.1.1. 时序讲解

wKgZO2ggY2uASyTNAAErLW5wGls642.jpg

无论数据输入或输出CS端必须为低电平。然后数据在CS端的上升沿被载入数据寄存器或控制寄存器。CS端在第 16个时钟的上升沿之后,下个时钟上升沿之前变为高电平,否则数据将会丢失。

对 MAX7219 来说,串行数据在 DIN 输入 16 位数据包,在CLK的上升沿数据均移入到内部 16 位移位寄存器。即DIN不能在CLK的上升沿时进行数据变换。

3.1.2. 数据位讲解

DIN传输的16位数据包说明,见表格000。其中D8-D11 为寄存器地址位。D0-D7 为数据位。D12-D15 为无效位。

wKgZPGggY2uABf0eAADavDrm-PY316.jpg

根据以上的时序说明和传输格式,实现的数据传输代码。

//向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译码方式寄存器。

wKgZO2ggY22Ae8sfAAEq2eAvk8Q761.jpg

我们发送的数据位是16位,而进入译码方式寄存器只使用到了D15-D8数据位(0x09),还有D7到D0没有设置。而根据数据手册的说明,关于译码方式寄存器的D7-D0的设置在数据手册的表格4.

wKgZPGggY26AMe9YAAD9kH7m84Q861.jpg

按照图中所示,如果要设置译码方式为全部数码管都进行译码,那么要发送:

//高8位=0x09(寄存器地址), 低8位=0xff(数据)
Write_Max7219(0x09,0xff);

在全部数码管都进行译码的情况下,如果想要第0个数码管显示数字3,第1个数码管不显示应如何操作?

wKgZO2ggY22Ae8sfAAEq2eAvk8Q761.jpg

先在数据手册中找到关于第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不显示
wKgZO2ggY26AUwSxAAF18qiv2wY379.jpg

3.2. 引脚选择

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

wKgZPGggY3SAK5_fAAYC0xZ4xGo029.jpg

模块接线图

3.3. 移植至工程

我们新建两个文件分别是 bsp_max7219.cbsp_max7219.h ,然后将C文件添加至工程中,将h文件路径添加到工程中。

wKgZO2ggY3SAJewMAAA5JignCx8085.jpg

在文件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);
        }
    }
}

上电效果:

wKgZPGggY3SAIOfLAAOGlD7MTJk807.jpg

模块移植成功案例代码:

链接:https://pan.baidu.com/s/1U_l3vfG-S79em6yLpkIWxQ?pwd=LCKF 提取码:LCKF

审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 数码管
    +关注

    关注

    32

    文章

    1891

    浏览量

    93710
  • CW32
    +关注

    关注

    1

    文章

    281

    浏览量

    1677
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    CW32单片机在智能马桶的应用

    1.温度感应与控制 智能马桶内设有温度传感器,通过CW32单片机的处理,可以实时感知到用户所需的座圈温度并根据用户的设定进行调节。当温度过高或过低时,单片机将发出信号,通过控制模块对座圈的加热或制冷
    发表于 12-04 08:01

    CW32 MCU温度监测应用

    监测环境温度,并通过串口将数据发送到PC端进行显示。 硬件连接 CW32 MCU LM35温度传感器 USB转串口模块 代码实现 #include \"cw32f030.h\&qu
    发表于 12-03 08:03

    第5章 定时器与数码管基础(5.3)

    5-2所示。 图5-2 数码管原理图 这是比较常见的数码管的原理图,Kingst51开发板子上一共有6个数码管。前边有了LED小灯的学习,数码管学习就会轻松的多了。从图5-3可以看出,
    的头像 发表于 12-02 15:57 169次阅读
    第5章 定时器与<b class='flag-5'>数码管</b>基础(5.3)

    cw32 systick怎么用?

    cw32 systick怎么用
    发表于 12-01 08:10

    【瑞萨RA6E2】ADC数据采集与数码管显示

    模拟信号处理和显示控制方面的强大能力。 一、硬件设计与连接 1.1 硬件组件 主控板 :瑞萨RA6E2评估板 显示模块8(启用4
    发表于 11-27 00:52

    使用芯源CW32CW32L012开发评估板做了spi屏幕驱动

    CW32生态社区以极高的性价比入手了这块CW32L012开发评估板,开发板以底板、核心板、1.77寸TFT显示屏构成,所有的IO口都引出了排针,这点好评,使用杜邦线可以非常方便的连接其他模块
    的头像 发表于 11-21 11:34 296次阅读
    使用芯源<b class='flag-5'>CW32</b>的<b class='flag-5'>CW</b>32L012开发评估板做了spi屏幕驱动

    原厂 FZH114C  一款LED(发光二极数码管、点阵屏)驱动控制专用芯片

    :驱动6位数码管,每位数码管7段(a-g)。8段×5:驱动5位数码管,每位数码管
    发表于 11-19 14:43

    FZH114  LED(发光二极数码管、点阵屏)驱动控制专用芯片,集成数字通讯电路、 解码电路、数据锁存器、震荡器

    信号对应GR引脚。 8段×5模式:连接5位数码管,支持额外的段信号(如小数点DP)。 总结FZH114是一款功能丰富、易于集成的LED驱动芯片,适用于需要多位数码管或LED点阵
    发表于 11-19 11:13

    CW32 MCU用什么IDE开发?

    推荐使用IAR Embedded Workbench for ARM、Keil μVision for ARM等IDE开发CW32 MCU应用,其中新版本IAR EWARM直接支持CW32 MCU,Keil MDK-ARM则需要安装CW
    发表于 11-12 07:52

    级联动态扫描显示数码管问题

    GD32F103C8T6 硬件SPI连接移位寄存器74HC595级联,动态扫描显示位数码管 是否需要电平转换芯片TXB0104 数码管选择共阴极和共阳极区别是什么 若使用TXB010
    发表于 10-07 20:36

    CW32模块使用 0.91寸彩屏

    工作电流: 最大16mA 模块尺寸: 12(H) x 38(V) MM 像素大小: 128(H) x 32(V) 驱动芯片: SSD1306 通信协议: IIC 三、移植过程 我们的目标是将例程移植至立创·CW32F030C8T6开发板上。按照以下步骤,
    的头像 发表于 07-01 15:20 543次阅读
    <b class='flag-5'>CW32</b><b class='flag-5'>模块</b>使用 0.91寸彩屏

    CW32模块使用 1.3寸单色OLED显示

    0.21(V) 驱动芯片: SH1106 通信协议: SPI(可调IIC) 三、移植过程 我们的目标是将例程移植至立创·CW32F030C8T6开发板上。按照以下步骤,即可完成移植。 将源码导入工程; 根据编译报错处进行粗改;
    的头像 发表于 07-01 14:57 458次阅读
    <b class='flag-5'>CW32</b><b class='flag-5'>模块</b>使用 1.3寸单色OLED<b class='flag-5'>显示</b>屏

    数码管的结构与原理

    数码管,也被称作辉光或LED数码管,是一种能够显示数字、字母、符号等信息的电子设备。它广泛应用于各种电子设备中,如计算器、电子钟表、电子秤、数码
    的头像 发表于 02-05 17:32 4060次阅读

    位数码管12个引脚怎么分配

    在电子显示技术中,四位数码管作为一种常见的显示器件,广泛应用于各种数字显示系统。其通过控制不同段(A-G)的发光二极(LED)来
    的头像 发表于 01-30 15:00 5w次阅读

    CW32模块使用 红外接收模块

    静态电流3-5uA,动态电流3-5mA。 以上信息见厂家资料文件 三、移植过程 我们的目标是将例程移植至CW32F030C8T6开发板上【能够实现红外信号接收的功能】。首先要获取资料
    的头像 发表于 01-23 13:16 796次阅读
    <b class='flag-5'>CW32</b><b class='flag-5'>模块</b>使用 红外接收<b class='flag-5'>模块</b>