最近从TB买了一大堆各种各样的模块来玩,其中就有用MAX7219芯片来设计的8X8点阵模块,于是去查找了这个芯片的资料,现将学习笔记留下。 |
MAX7219 是美国 MAXIM 公司推出的多位LED显示驱动器,是一种集成化的 串行 输入/输出 共阴极 显示驱动器,采用 3线 串行接口传送数据,可直接与单片机接口连接,用户能方便修改其内部参数,以实现多位LED显示。它内含硬件动态扫描电路、BCD译码器、段驱动器和位驱动器。此外,其内部还含有8X8 位静态RAM,用于存放8 个数字的显示数据。
MAX7219与MCU相连的引线有三条:DIN、CLK、LOAD/CS,采用16位数据串行移位接收方式。在 CLK 的每个上升沿将一位数据移入 MAX7219 内部的移位寄存器,在每个下降沿将数据从 DOUT 端输出。当16位数据全部移入完毕,在 LOAD 引脚信号上升沿将16位数据装入 MAX7219 内相应位置,在 MAX7219 内部动态扫描显示控制电路的作用下实现动态显示。
MAX7221 同 MAX7219 基本相同,可以视作 MAX7219 的升级版。相比 MAX7219:
1.MAX7221的段驱动有回流限制可以减少EMI;
2.MAX7221与 SPI™、QSPI™、MICROWIRE™ 相兼容
即MAX7219抗EMI能力比较差, 相对而言用MAX7221比较可靠一点。
数据格式:
16位串行数据以 高位在前 的方式输入到芯片内部。
D15~D12 无效位
D11~D8 地址位,确定要送入数据的寄存器的地址
D7~D0 数据位,是要送入MAX7219内寄存器的数据
对于MAX7219,串行数据在 DIN 输入16位数据包,无论 LOAD/CS 处于何种状态,在时钟的上升沿数据均移入到内部16位移位寄存器。
对于MAX7221,无论数据输入或输出 LOAD/CS 必须为低电平,之后数据在 LOAD/CS 的上升沿被载入内部寄存器。
L0AD/CS 端在第16个时钟的上升沿同时或之后,下个时钟上升沿之前必须变为高电平,否则数据将会丢失。在 DIN 端的数据传输到移位寄存器在16. 5个时钟周期之后出现在DOUT端,在时钟的下降沿数据将被输出。
硬件方式调节亮度:
MAX7219通过V+和ISET之间的外部电阻来控制亮度。(MAX7219的段驱动电流峰值一般是流入ISET端电流的100倍)这个电阻最小值为9.53KΩ,设定段电流峰值为40mA。
译码方式有BCD译码和不译码两种方式
8个LED的译码方式由 译码模式寄存器(09H) 8个位是高电平还是低电平决定
亮度有16档,由0AH低4位D3~D0的16个值来设置
MAX7219最低亮度是1/32,而MAX7221是1/16,但两者的档位间隔都是1/16
MAX7219 可以选择扫描的LED个数,由0BH低3位的D2~D0的8个值来设置
当0CH的最低位 D0 为低电平时进入停机模式,扫描振荡器关闭,所有段电流源被拉到地,而所有的位驱动被拉到V+,显示器停止显示,但寄存器中的数据不变,且掉电模式下是可以编写驱动的。停机模式可以节省电源。
当0FH的最低位 D0 为高电平时进入显示测试模式,所有LED以最大亮度(31/32)显示。停机模式下不影响进入显示测试模式,因此可以用停机模式和显示测试来制作闪烁效果。
/**********************************************************************************
* 程序名: MAX7219驱动程序
* 作者: DaveoCKII
* 日期: 2020.2.27
* 版本: STC12C5A60S2
**********************************************************************************/
#ifndef _MAX7219_H_
#define _MAX7219_H_
#include
//--------------------------------------------------------------------------------//
sbit DIN = P1^3; // 数据线
sbit CS = P1^2; // 片选线
sbit CLK = P1^1; // 时钟线
unsigned char LED_CC[16]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; // 共阴LED显示数据 '0~F'
unsigned char LED_CA[16]={
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e}; // 共阳LED显示数据 '0~F'
//--------------------------------------------------------------------------------//
void Write7219(unsigned char addr, unsigned char Data); // MAX7219数据写入函数
void Init7219(unsigned char work_state, unsigned char test_state, unsigned char decode_nums, // MAX7219初始化设置
unsigned char display_nums, unsigned char Luminance); // 工作模式、测试模式、解码模式、扫描模式、亮度
//--------------------------------------------------------------------------------//
void Write7219(unsigned char addr, unsigned char dat)
{
unsigned char i;
CS=0; // 拉低CS选中芯片
for(i=0; i<8; i++) // 传输地址
{
CLK=0; // 拉低时钟线
DIN=Data & 0x80; // 数据格式:高位在前
addr<<=1;
CLK=1; // 拉高时钟线,写入数据
}
for(i=0; i<8; i++) // 传输数据
{
CLK=0;
DIN=dat & 0x80;
dat<<=1;
CLK=1;
}
CS=1; // 数据锁入
}
void Init7219(unsigned char work_state, unsigned char test_state, unsigned char decode_nums,
unsigned char display_nums, unsigned char Luminance)
{
Write7219(0X0C,work_state); // 工作模式选择 1:正常工作 0:掉电模式
Write7219(0X0F,test_state); // 测试模式开关 1:测试模式 0:正常工作
Write7219(0X09,decode_nums); // 解码模式选择 8个位分别控制8个LED是否解码,'1'为BCD解码,'0'为不解码
Write7219(0X0B,display_nums); // 扫描方式选择 0-7 设置扫描1-8个LED
Write7219(0X0A,Luminance); // 初始亮度设置 0-15设置1-16档亮度
}
//--------------------------------------------------------------------------------//
#endif
DaveoCKII |