【Proteus仿真】| 51单片机——MAX7219 驱动数码管,单片机数码管显示芯片MAX7219芯片指令详解

前言
1. 简单了解MAX7219
1.1 引脚说明
1.2 寄存器说明
1.2.1 选位寄存器
1.2.2 BCD译码器设置寄存器
1.2.3 亮度寄存器
1.2.4 扫描限制寄存器
1.2.5 显示测试寄存器
1.2.6 关停寄存器
1.3 spi总线通信时序
1.4 数据格式
2. 使用MAX7219驱动数码管
2.1 驱动数码管的原理图
2.2 MAX7219驱动程序
2.2.1 定义spi信号引脚和寄存器地址
2.2.2 根据时序图实现写字节
2.2.3 根据通信数据格式需要实现写数据(16bit)
2.2.4 初始化MAX7219
3. 仿真效果
前言
该文章目的:让大家快速上手——知道如何使用MAX7219。故MAX7219就不做详细介绍了(需要了解的话可以看其他博文及数据手册)。

1. 简单了解MAX7219
max7219是一个串行输入/输出共阴极数码管(点阵)驱动芯片。1个MAX7219最多可以驱动8位数码管。它具有自动扫描(切换位),BCD译码器(即 不用管数码管段码值 需要让其显示几直接填几就好)、内部8X8的静态RAM(可以存放显示数据 用作驱动8x8点阵)、亮度控制等功能。我们需要通过SPI总线驱动它。
注意:只能驱动共阴极的哦

1.1 引脚说明

可以看到 spi总线的3条控制线 DIN、LOAD(CS)、CLK

1.2 寄存器说明
主要有以下几个寄存器


1.2.1 选位寄存器

后面对应的地址 比如我要给 让第一位数码管显示1 那么 我先发 第一位选位寄存器地址 然后发内容

1.2.2 BCD译码器设置寄存器

配置是否使用 译码器 可按位设置

1.2.3 亮度寄存器

可以看到亮度设置范围 0x00-0x0F

1.2.4 扫描限制寄存器

配置要显示的位数

1.2.5 显示测试寄存器

测试模式 配置该寄存器为0X01 效果:所有都亮
即显示8.8.8.8.8.8.8.8.

1.2.6 关停寄存器
配置关闭显示/正常显示


1.3 spi总线通信时序


1.4 数据格式
如图 一共16位 其中 8-11 4位地址 0-7 8位数据内容
所以每次传16位的数据

后面驱动程序都是根据 时序图完成的 一个简单的spi写时序

2. 使用MAX7219驱动数码管
2.1 驱动数码管的原理图

级联时


2.2 MAX7219驱动程序
2.2.1 定义spi信号引脚和寄存器地址
根据原理图 接线定义

定义寄存器地址


2.2.2 根据时序图实现写字节


2.2.3 根据通信数据格式需要实现写数据(16bit)


2.2.4 初始化MAX7219


3. 仿真效果

————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
                        
原文链接:https://blog.csdn.net/weixin_43822014/article/details/130750554

1.max7219芯片


各引脚的功能为:

DIN:串行数据输入端

DOUT:串行数据输出端,用于级连扩展

LOAD:装载数据输入

CLK:串行时钟输入

DIG0~DIG7:8位LED位选线,从共阴极LED中吸入电流

SEG A~SEG G DP 7段驱动和小数点驱动

ISET: 通过一个10k电阻和Vcc相连,设置段电流

2.数据及时序
​ 1.max7219通信方式为SPI,16bit 数据格式就是2字节 = 地址 + 数据 。先发高位,即先发地址再发数据。

16位数据包结构如下图:

​ 2.对AX719串行数据以16位包的形式从DIN引脚串行输人,在CLK的每一个上升沿一位行地送入芯片内部16位移位寄存器,而不管LOAD脚的状态如何,LOAD脚必须在第16CK上升沿出现的同时或之后,并在下一个 CLK上升沿之前变为高电平,否则移入的数据将丢失。


3.寄存器及指令
下图就是寄存器表地址

​ 5个控制寄存器分别为:译码方式,亮度设置,扫描范围(选择扫描位数),停机方式,显示测试

功能概述

解码模式(指令=X9+hex code)
是否支持BCD解码

亮度设置(指令=XA+hex code)
选择亮度

扫描限制(指令=XB+hex code)
选择使用几个数码管,数量小于等于三个时必须进行电流设置

掉电模式 (指令=XC+hex code)
选择是否掉电

显示测试 (指令=XF+hex code)

正常显示=0;显示测试=1;

4.初始化max7219
//寄存器宏定义
 
#define DECODE_MODE  0x09   //译码控制寄存器
 
#define INTENSITY    0x0A   //亮度控制寄存器
 
#define SCAN_LIMIT   0x0B   //扫描界限寄存器
 
#define SHUT_DOWN    0x0C   //掉电模式寄存器
 
#define DISPLAY_TEST 0x0F   //显示控制寄存器       

void Initial(void)                
 
{
 
    Write7219(SHUT_DOWN,0x01);         //开启正常工作模式(0xX1)
 
    Write7219(DISPLAY_TEST,0x00);      //选择正常工作模式(0xX0)
 
    Write7219(DECODE_MODE,0xff);       //选用全译码模式
 
    Write7219(SCAN_LIMIT,0x07);        //8只LED全用
 
    Write7219(INTENSITY,0x04);          //设置初始亮度9/32     
 
}

————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
                        
原文链接:https://blog.csdn.net/m0_46152804/article/details/120418929

max7219驱动数码管程序(51单片机+STM32 MAX7219数码管程序案例)

1、STM32 硬件SPI max7219 8位数码管显示模块

数码管模块电路图

max7219驱动数码管

/*****************************************************************

Updated time: 12th,12,2015

Function:通过MAX7219驱动数码管

******************************************************************/

#include “delay.h”

#include “sys.h”

#include “usart.h”//串口通信

#define Max7219_pinCLK PAout(5)

#define Max7219_pinCS PAout(3)

#define Max7219_pinDIN PAout(7)

/****************************************************************************

* 名称:SPI1_Init(void)

* 功能:STM32_SPI1硬件配置初始化

* 入口参数:无

* 出口参数:无

* 说明:STM32_SPI1硬件配置初始化,使用3V3

****************************************************************************/

void SPI1_Init(void)

{

SPI_InitTypeDef SPI1_InitStructure;

GPIO_InitTypeDef GPIO_InitStructure;

//配置SPI1管脚

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO|RCC_APB2Periph_GPIOA, ENABLE);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1,ENABLE);

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_3;

GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;

GPIO_Init(GPIOA,&GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;//SPI1相关引脚

GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//推挽复用功能

GPIO_Init(GPIOA,&GPIO_InitStructure);

SPI1_InitStructure.SPI_Direction=SPI_Direction_2Lines_FullDuplex;//设置SPI单向或者双向的数据模式;SPI设置为双线双向全双工

SPI1_InitStructure.SPI_BaudRatePrescaler=SPI_BaudRatePrescaler_64;//定义波特率预分频值;波特率预分频64

SPI1_InitStructure.SPI_DataSize=SPI_DataSize_8b;//设置SPI的数据大小;SPI发送接收8位帧结构

SPI1_InitStructure.SPI_Mode=SPI_Mode_Master;//设置SPI工作模式;设置为主SPI

SPI1_InitStructure.SPI_FirstBit=SPI_FirstBit_MSB; //高位MSB在先

SPI1_InitStructure.SPI_CPOL = SPI_CPOL_High; //选择了串行时钟的稳态,时钟悬空高

SPI1_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;//数据捕获于第二个时钟沿

SPI1_InitStructure.SPI_NSS = SPI_NSS_Soft; //使用软件模式,

SPI1_InitStructure.SPI_CRCPolynomial = 7;//CRC值计算的多项式

SPI_I2S_DeInit(SPI1);

SPI_Init(SPI1, &SPI1_InitStructure); //根据指定的参数初始化

SPI_Cmd(SPI1, ENABLE); //SPI使能

//--------------------------------------------

//功能:向MAX7219写入字节

//入口参数:DATA

//出口参数:无

//说明:

void Write_Max7219_byte(unsigned char DATA)

{

unsigned char i;

Max7219_pinCS=0;

for(i=8;i》=1;i--)

{

Max7219_pinCLK=0;

Max7219_pinDIN=DATA&0x80;

DATA=DATA《《1;

Max7219_pinCLK=1;

}

}

//-------------------------------------------

//功能:向MAX7219写入数据

//入口参数:address,dat

//出口参数:无

//说明:

void Write_Max7219(unsigned char address,unsigned char dat)

{

GPIO_ResetBits(GPIOA, GPIO_Pin_3);

SPI_I2S_SendData(SPI1, address); //写入地址,即数码管编号

delay_us(10);

SPI_I2S_SendData(SPI1, dat); //写入数据,即数码管显示数字

delay_us(10);

GPIO_SetBits(GPIOA, GPIO_Pin_3);

}

void Init_MAX7219(void)

{

Write_Max7219(0x09, 0xFF); //译码方式:BCD译码

Write_Max7219(0x0A, 0x03); //亮度

Write_Max7219(0x0B, 0x07); //扫描界限;8个数码管显示

Write_Max7219(0x0C, 0x01); //掉电模式:0;普通模式:1

Write_Max7219(0x0F, 0x00); //显示测试:1;测试结束,正常显示:0

}

int main(void)

{

unsigned char i,j;

delay_init();//延时初始化

SPI1_Init();//SPI初始化

NVIC_Configuration();//中断分组

uart_init(9600);//串口波特率9600

delay_ms(50);

Init_MAX7219();//初始化

Write_Max7219(0x01, 0x00); //1号数码管显示数字0

Write_Max7219(0x02, 0x01);

Write_Max7219(0x03, 0x02);

Write_Max7219(0x04, 0x03);

Write_Max7219(0x05, 0x04);

Write_Max7219(0x06, 0x05);

Write_Max7219(0x07, 0x06);

Write_Max7219(0x08, 0x07);

for(j=0;j《=9;j++)

{

Write_Max7219(0x04, j);

delay_ms(50);

}

}

spi通信配置

1、GPIO时钟使能,SPI时钟使能。

2、配置GPIO片选,推挽输出,上拉;SCLK、MOSI、MISO所用到的引脚为复用功能;SCLK下拉,MOSI推挽复用,MISO无推挽。

3、SPI初始化,配置工作模式为全双工,主机模式,SCLK闲时电平为低,第二个时钟沿(下降沿)(错误,时序图分明是第一个时钟边沿,上升沿采集数据2024.4.26)采样数据,SCLK时钟128预分频,CRC校验置默认值0x07,内部从机选择软件管理模式。设置接收FIFO为四分之一,内部从机选择设置为主机(置1),使能SPI。

4、从机设备一般上电是默认写使能的,因此若需要读取数据先关闭写使能。

5,stm32f0在使能spi后,miso和mosi都被拉低,因此在读取从机数据时,需要先发送的无效数据为0x00。
51单片机+MAX7219数码管显示C程序#e#

2、51单片机+MAX7219数码管显示C程序

/**************************************************

*程序名称: MAX7219 C语言控制程序

*程序功能: 3线串行控制8位共阴数码管

*3线定义:DIN 串行数据输入

* LOAD 数据锁存

* CLK 时钟输入

***************************************************/

#include 《reg52.h》

#include 《intrins.h》

sbit pinDIN=P0^0; //串行数据输入端

sbit pinLOAD=P0^1; //数据锁存端

sbit pinCLK=P0^2; //时钟输入端

#define uchar unsigned char

uchar code LEDcode[]=

{0x7e,0x30,0x6d,0x79,0x33,0x5b,0x5f,0x70,0x7f,0x7b,0x00 /*0,1,2,3,4,5,6,7,8,9,全灭*/

/* 0x77,0x1f,0x4e,0x3d,0x4f,0x47,0x67,0x3e,0xff, */ }; /*A,B,C,D,E,F,P,U,全亮*/

/**************************************************

* 向MAX7219写入字节(8位)函数 *

***************************************************/

void sendbyte (uchar dat)

{

uchar i,temp;

_nop_();

for (i=0;i《8;i++)

{

temp=dat&0x80;

dat=dat《《1;

if(temp)

pinDIN=1;

else

pinDIN=0;

pinCLK=0;

_nop_();

pinCLK=1;

}

}

/**************************************************

* 向MAX7219写入地址和控制字(16位) *

***************************************************/

void sendword (uchar addr,uchar dat)

{

pinLOAD=0;

_nop_();

sendbyte (addr);

_nop_();

sendbyte (dat);

_nop_();

pinLOAD=1; //第16个上升沿之后,第17个上升沿之前必须把pinCLK置高,否则数据丢失

}

/**************************************************

MAX7219初始化 *

***************************************************/

void init7219 (void)

{

sendword (0x0c,0x01); /* 设置电源工作模式 */

sendword (0x0a,0x09); /* 设置亮度 19/32 */

sendword (0x0b,0x03); /* 设置扫描界限 */

sendword (0x09,0x00); /* 设置译码模式 */

sendword (0x0f,0x00); /*显示测试 00为正常工作状态*/

}

/**************************************************

MAX7219清除显示 *

***************************************************/

void clear7219(void)

{

uchar i;

for(i=8;i》0;i--)

{

sendword(i,0x00);

}

}

/**************************************************

MAX7219主函数 *

***************************************************/

/*void main(void)

{

init7219 ();

//clear7219();

while(1)

{

clear7219();

sendword(0x01,LEDcode[11]);

sendword(0x02,LEDcode[12]|0x80);

sendword(0x03,LEDcode[13]);

sendword(0x04,LEDcode[4]);

sendword(0x05,LEDcode[5]);

sendword(0x06,LEDcode[6]);

sendword(0x07,LEDcode[7]);

sendword(0x08,LEDcode[8]);

}

}*/

http://news.eeworld.com.cn/mcu/ic654991.html

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值