STM32接入MAX7219点阵屏


ChangeCode
原创
发布时间: 2025-06-11 10:05:12 | 阅读数 0收藏数 0评论数 0
封面
要使用STM32F103C8T6微控制器点亮MAX7219驱动的8x8点阵屏,首先需要通过SPI接口与MAX7219芯片相连。在STM32上初始化SPI外设,并设置为SPI主模式。编写函数来初始化MAX7219,设置其工作模式,清除显示屏,并控制亮度。然后,通过SPI发送命令和数据到MAX7219。

准备工作:

材料:

材料名称
数量
备注
STM32F103C8T6
1
/
MAX7219驱动模块
1
/
8x8点阵屏
1
/
杜邦线
1
/
USB数据线
1
/

工具:

工具名称
数量
备注
keil MDK
1
/
1

查看STM32F103C8T6文件夹

新建STM32工程(自行查找文档)

打开附件中的文件夹

ZIP
F103C8T6Code.zip
22.72MB
2

文件介绍

第一个文件夹“Drivers”是存放库函数的文件夹

第二个文件夹“Middlewares”是存放应用程序中起到连接作用的软件组件

第三个文件夹“Output”是存放工程启动和输出之类的文件夹

第四个文件夹“Projects”是存放一些STM32F103的系统文件

第五个文件夹“Users”是存放用户添加的函数文件

3

.c 和 .h

其中里面每个文件夹里面都创建如下两个文件夹

第一个是用于存放.h头文件的,第二个是用于存放.c文件的。

4

打开工程

我的路径E:\false\proj\STM32Demo\F103C8T6Code\Blink\Projects\MDK-ARM

在这里双击.uvprojx后缀的文件打开工程

5

MAX7219管脚描述

管脚描述:


管脚

名称

功能

1

DIN

串行数据输入端口。在时钟上升沿时数据被载入内部的16 位寄存器。

2,3,5-8,10,11

DIG 0–DIG

八个数据驱动线路置显示器共阴极为低电平。关闭时7219 此管脚输出高电平,7221 呈现高阻抗。

7

4,9

GND

地线(4 脚和9 脚必须同时接地)

12

LOAD

载入数据。连续数据的后16 位在LOAD 端的上升沿时被锁定。

(MAX7219)

CS

片选端。该端为低电平时串行数据被载入移位寄存器。连续数据的后16 位在cs 端的上升沿时被锁定。

(MAX7221)

13

CLK

时钟序列输入端。最大速率为10MHz.在时钟的上升沿,数据移入内部移位寄存器。下降沿时,数据从DOUT端输出。对MAX7221 来说,只有当cs 端为低电平时时钟输入才有效。

14-17,20-23

SEG

7 段和小数点驱动,为显示器提供电流。当一个段驱动关闭时,7219 的此端呈低电平,7221 呈现高阻抗。

A–SEG G,

DP

18

SET

通过一个电阻连接到VDD 来提高段电流。

19

V+

正极电压输入,+5V

24

DOUT

串行数据输出端口,从DIN 输入的数据在16.5 个时钟周期后在此端有效。当使用多个MAX7219/MAX7221时用此端方便扩展。

6

MAX7219讲解

二、规格参数

工作电压:4-5.5V

工作电流:8-330MA

扫描速率:500-1300Hz

通信协议:串行通信

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

7

MAX7219时序图

时序讲解

  1. 无论数据输入或输出CS端必须为低电平。然后数据在CS端的上升沿被载入数据寄存器或控制寄存器。CS端在第 16个时钟的上升沿之后,下个时钟上升沿之前变为高电平,否则数据将会丢失。
  2. 对 MAX7219 来说,串行数据在 DIN 输入 16 位数据包,在CLK的上升沿数据均移入到内部 16 位移位寄存器。即DIN不能在CLK的上升沿时进行数据变换。

数据位讲解

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);
}
8

MAX7219寄存器

我们发送的数据位是16位,而进入译码方式寄存器只使用到了D15-D8数据位(0x09),还有D7到D0没有设置。

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

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

以字模举例

点阵是通过一个个像素点显示,要在8x8点阵上显示个字符,需要以下两步:

  1. 占据屏幕上的一块地方,大小由字体大小说了算;
  2. 在占据的地方上依次控制每个像素点是否显示。

比如一个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行显示一条直线
10

引脚选择

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

11

移植至工程

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

在文件bsp_DotMatrix.c中,编写如下代码。

/*
* 立创开发板软硬件资料与相关扩展板软硬件资料官网全部开源
* 开发板官网:www.lckfb.com
* 技术支持常驻论坛,任何技术问题欢迎随时交流学习
* 立创论坛:https://oshwhub.com/forum
* 关注bilibili账号:【立创开发板】,掌握我们的最新动态!
* 不靠卖板赚钱,以培养中国工程师为己任
* Change Logs:
* Date Author Notes
* 2024-03-28 LCKFB-LP first version
*/
#include "bsp_DotMatrix.h"
#include "stdio.h"
#include "board.h"

/******************************************************************
* 函 数 名 称:MAX7219_GPIO_Init
* 函 数 说 明:初始化MAX7219引脚
* 函 数 形 参:无
* 函 数 返 回:无
* 作 者:LC
* 备 注:无
******************************************************************/
void MAX7219_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;

RCC_APB2PeriphClockCmd(RCC_MAX7219, ENABLE); // 使能GPIOB时钟

/* 配置GPIO */
GPIO_InitStructure.GPIO_Pin = GPIO_MAX7219_CLK|GPIO_MAX7219_DIN|GPIO_MAX7219_CS;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(PORT_MAX7219, &GPIO_InitStructure);
}

/******************************************************************
* 函 数 名 称: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中,编写如下代码。

/*
* 立创开发板软硬件资料与相关扩展板软硬件资料官网全部开源
* 开发板官网:www.lckfb.com
* 技术支持常驻论坛,任何技术问题欢迎随时交流学习
* 立创论坛:https://oshwhub.com/forum
* 关注bilibili账号:【立创开发板】,掌握我们的最新动态!
* 不靠卖板赚钱,以培养中国工程师为己任
* Change Logs:
* Date Author Notes
* 2024-03-28 LCKFB-LP first version
*/
#ifndef _BSP_DOTMATRIX_H_
#define _BSP_DOTMATRIX_H_

#include "stm32f10x.h"

#define RCC_MAX7219 RCC_APB2Periph_GPIOB
#define PORT_MAX7219 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_WriteBit(PORT_MAX7219, GPIO_MAX7219_CLK, X?Bit_SET:Bit_RESET)
#define MAX7219_DIN(X) GPIO_WriteBit(PORT_MAX7219, GPIO_MAX7219_DIN, X?Bit_SET:Bit_RESET)
#define MAX7219_CS(X) GPIO_WriteBit(PORT_MAX7219, GPIO_MAX7219_CS, X?Bit_SET:Bit_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);
#endif
12

移植验证

在main.c中输入代码如下:

/*
* 立创开发板软硬件资料与相关扩展板软硬件资料官网全部开源
* 开发板官网:www.lckfb.com
* 技术支持常驻论坛,任何技术问题欢迎随时交流学习
* 立创论坛:https://oshwhub.com/forum
* 关注bilibili账号:【立创开发板】,掌握我们的最新动态!
* 不靠卖板赚钱,以培养中国工程师为己任
* Change Logs:
* Date Author Notes
* 2024-03-28 LCKFB-LP first version
*/
#include "stm32f10x.h"
#include "board.h"
#include "bsp_uart.h"
#include "stdio.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 start\r\n");


while(1)
{
//第一个点阵显示disp1数组的第10行内容
//第二个点阵显示disp1数组的第11行内容
//第三个点阵显示disp1数组的第7行内容
//第四个点阵显示disp1数组的第6行内容
Max7219_display(disp1[10],disp1[11], disp1[7], disp1[6]);
delay_ms(1000);
}

}
13

上电效果

上电效果图

阅读记录0
点赞0
收藏0
禁止 本文未经作者允许授权,禁止转载
猜你喜欢
评论/提问(已发布 0 条)
评论 评论
收藏 收藏
分享 分享
pdf下载 下载