[font=ˎ̥]MAX7219是[font=ˎ̥]MAXIM公司生产的串行输入[font=ˎ̥]/输出共阴极数码管显示驱动芯片,一片[font=ˎ̥]MAX7219可驱动[font=ˎ̥]8个[font=ˎ̥]7段(包括小数点共[font=ˎ̥]8段)数字[font=ˎ̥]LED、[font=ˎ̥]LED条线图形显示器、或[font=ˎ̥]64个分立的[font=ˎ̥]LED发光二级管。该芯片具有[font=ˎ̥]10MHz传输率的三线串行接口可与任何微处理器相连,只需一个外接电阻即可设置所有[font=ˎ̥]LED的段电流。。它的操作很简单,[font=ˎ̥]MCU只需通过模拟[font=ˎ̥]SPI三线接口就可以将相关的指令写入[font=ˎ̥]MAX7219的内部指令和数据寄存器,同时它还允许用户选择多种译码方式和译码位。此外它还支持多片[font=ˎ̥]7219串联方式,这样[font=ˎ̥]MCU就可以通过[font=ˎ̥]3根线(即串行数据线、串行时钟线和芯片选通线)控制更多的数码管显示。[font=ˎ̥]MAX7219的外部引脚分配如图1[font=ˎ̥]所示及内部结构如图2[font=ˎ̥]所示。[font=ˎ̥]
[font=ˎ̥] [font=ˎ̥]图1 MAX7219[font=ˎ̥]的外部引脚分配[font=ˎ̥]
[font=ˎ̥] [font=ˎ̥]
[font=ˎ̥] [font=ˎ̥]图2 MAX7219[font=ˎ̥]的内部引脚分配[font=ˎ̥]
[font=ˎ̥]各引脚的功能为:[font=ˎ̥]
DIN[font=ˎ̥]:串行数据输入端[font=ˎ̥]
DOUT[font=ˎ̥]:串行数据输出端,用于级连扩展[font=ˎ̥]
LOAD[font=ˎ̥]:装载数据输入[font=ˎ̥]
CLK[font=ˎ̥]:串行时钟输入
LOAD(CS): 是 片选信号 不是通讯端口 随便接 所以 一般就接普通IO口 最常用的SPI 通讯 CS 也可以随便接
DIG0~DIG7[font=ˎ̥]:8[font=ˎ̥]位LED[font=ˎ̥]位选线,从共阴极LED[font=ˎ̥]中吸入电流[font=ˎ̥]
SEG A~SEG G DP 7[font=ˎ̥]段驱动和小数点驱动[font=ˎ̥]
ISET[font=ˎ̥]: [font=ˎ̥]通过一个10k[font=ˎ̥]电阻和Vcc[font=ˎ̥]相连,设置段电流[font=ˎ̥]
[font=ˎ̥] [font=ˎ̥]
[font=ˎ̥]MAX7219有下列几组寄存器:(如图[font=ˎ̥]3)[font=ˎ̥]
[font=ˎ̥]MAX7219内部的寄存器如图3[font=ˎ̥],主要有:译码控制寄存器、亮度控制寄存器、扫描界限寄存器、关断模式寄存器、测试控制寄存器。编程时只有正确操作这些寄存器,[font=ˎ̥]MAX7219才可工作。[font=ˎ̥]
[font=ˎ̥] [font=ˎ̥]
[font=ˎ̥] [font=ˎ̥]图 [font=ˎ̥]3 MAX7219内部的相关寄存器 [font=ˎ̥]
[font=ˎ̥] [font=ˎ̥]
[font=ˎ̥] [font=ˎ̥]
[font=ˎ̥]分别介绍如下:[font=ˎ̥]
[font=ˎ̥](1)[font=ˎ̥] 译码控制寄存器([font=ˎ̥]X9H)[font=ˎ̥]
[font=ˎ̥]如图[font=ˎ̥]4所示,[font=ˎ̥]MAX7219
有两种译码方式:[font=ˎ̥]B
译码方式和不译码方式。当选择不译码时,[font=ˎ̥]8
个数据为分别一一对应[font=ˎ̥]7
个段和小数点位;[font=ˎ̥]B
译码方式是[font=ˎ̥]BCD
译码,直接送数据就可以显示。实际应用中可以按位设置选择[font=ˎ̥]B
译码或是不译码方式。[font=ˎ̥] [font=ˎ̥]图4 MAX7219[font=ˎ̥]的译码控制寄存器[font=ˎ̥]
[font=ˎ̥](2)[font=ˎ̥] 扫描界限寄存器([font=ˎ̥]XBH)[font=ˎ̥]
[font=ˎ̥]如图[font=ˎ̥]5所示,此寄存器用于设置显示的[font=ˎ̥]LED的个数([font=ˎ̥]1~8),比如当设置为[font=ˎ̥]0xX4时,[font=ˎ̥]LED 0~5显示。[font=ˎ̥]
[font=ˎ̥] [font=ˎ̥]
[font=ˎ̥] [font=ˎ̥]图5 MAX7219[font=ˎ̥]的扫描界限控制寄存器[font=ˎ̥]
[font=ˎ̥] [font=ˎ̥]
[font=ˎ̥](3)[font=ˎ̥] 亮度控制寄存器([font=ˎ̥]XAH)[font=ˎ̥]
[font=ˎ̥]共有[font=ˎ̥]16级可选择,用于设置[font=ˎ̥]LED的显示亮度,从[font=ˎ̥]0xX0~0xXF[font=ˎ̥]
[font=ˎ̥](4)[font=ˎ̥] 关断模式寄存器([font=ˎ̥]XCH)[font=ˎ̥]
[font=ˎ̥]共有两种模式选择,一是关断状态,(最低位 [font=ˎ̥]D0=0)一是正常工作状态([font=ˎ̥]D0=1)。[font=ˎ̥]
[font=ˎ̥](5)[font=ˎ̥] 显示测试寄存器([font=ˎ̥]XFH)[font=ˎ̥]
[font=ˎ̥]用于设置[font=ˎ̥]LED是测试状态还是正常工作状态,当测试状态时(最低位 [font=ˎ̥]D0=1)各位显示全亮,正常工作状态[font=ˎ̥](D0=0)。[font=ˎ̥]
[font=ˎ̥]各寄存器具体操作见驱动程序详解。[font=ˎ̥]
[font=ˎ̥] [font=ˎ̥]
[font=ˎ̥]2 读写时序说明[font=ˎ̥]
MAX7129[font=ˎ̥]是SPI[font=ˎ̥]总线驱动方式。它不仅要向寄存器写入控制字,还需要读取相应寄存器的数据。[font=ˎ̥]
[font=ˎ̥]要想与MAX7129[font=ˎ̥]通信,首先要先了解MAX7129[font=ˎ̥]的控制字。MAX7129[font=ˎ̥]的控制字格式如图[font=ˎ̥]6。[font=ˎ̥]
[font=ˎ̥] [font=ˎ̥]图[font=ˎ̥]6 控制字(即地址及命令字节)[font=ˎ̥]
[font=ˎ̥] [font=ˎ̥]
[font=ˎ̥]如图,工作时[font=ˎ̥],MAX7219规定一次接收[font=ˎ̥]16位数据,在接收的[font=ˎ̥]16位数据中:[font=ˎ̥]D15~D12可以与操作无关,可以任意写入,[font=ˎ̥]D11~D8决定所选通的内部寄存器地址,[font=ˎ̥]D7~D0为待显示数据或是初始化控制字。在[font=ˎ̥]CLK脉冲作用下,[font=ˎ̥]DIN的数据以串行方式依次移入内部[font=ˎ̥]16位寄存器,然后在一个[font=ˎ̥]LOAD上升沿作用下,锁存到内部的寄存器中。注意在接收时,先接收最高位[font=ˎ̥]D16,最后是[font=ˎ̥]D0,因此,在程序发送时必须先送高位数据,在循环移位。工作时序图见图[font=ˎ̥]7。[font=ˎ̥]
[font=ˎ̥]由于[font=ˎ̥]51是[font=ˎ̥]8位单片机故需要分两次来送数据。具体操作见驱动程序详解。[font=ˎ̥]
[font=ˎ̥] [font=ˎ̥]图7 [font=ˎ̥]数据读写时序[font=ˎ̥]
[font=ˎ̥]3 电路原理图 [font=ˎ̥]
[font=ˎ̥]电路原理图[font=ˎ̥]
[font=ˎ̥]电路原理图如图7,MAX7219[font=ˎ̥]与单片机的连接只需要3[font=ˎ̥]条线:LOAD[font=ˎ̥](CS[font=ˎ̥])片选引脚、CLK[font=ˎ̥]串行时钟引脚、DIN[font=ˎ̥]串行数据引脚。其中C1 [font=ˎ̥]为电源滤波电容,R1[font=ˎ̥]用来设置段电流。 MAX[font=ˎ̥]7219的[font=ˎ̥]PCB布线有些难度,作者可以提供画好的[font=ˎ̥]PCB
给读者。有需要的读者请与作者联系。邮箱:[font=ˎ̥]zhaoliang_0801@dl.cn[font=ˎ̥] [font=ˎ̥] [font=ˎ̥]
[font=ˎ̥] [font=ˎ̥]图8 [font=ˎ̥]电路原理图[font=ˎ̥]
[font=ˎ̥]4 驱动程序[font=ˎ̥]
[font=ˎ̥]//管脚定义[font=ˎ̥]
[font=ˎ̥]sbit LOAD=P1^2; //MAX7219片选 [font=ˎ̥] 12脚[font=ˎ̥]
[font=ˎ̥]sbit DIN=P1^1; //MAX7219串行数据[font=ˎ̥] 1脚[font=ˎ̥]
[font=ˎ̥]sbit CLK=P1^0; //MAX7219串行时钟[font=ˎ̥] 13脚[font=ˎ̥]
[font=ˎ̥]//寄存器宏定义[font=ˎ̥]
[font=ˎ̥]#define DECODE_MODE 0x09 //译码控制寄存器[font=ˎ̥]
[font=ˎ̥]#define INTENSITY 0x0A //亮度控制寄存器[font=ˎ̥]
[font=ˎ̥]#define SCAN_LIMIT 0x0B //扫描界限寄存器[font=ˎ̥]
[font=ˎ̥]#define SHUT_DOWN 0x0C //关断模式寄存器[font=ˎ̥]
[font=ˎ̥]#define DISPLAY_TEST 0x0F //测试控制寄存器[font=ˎ̥] [font=ˎ̥]
[font=ˎ̥]//函数声明[font=ˎ̥]
[font=ˎ̥]void Write7219(unsigned char address,unsigned char dat);[font=ˎ̥]
[font=ˎ̥]void Initial(void);[font=ˎ̥]
[font=ˎ̥]//地址、数据发送子程序[font=ˎ̥]
[font=ˎ̥]void Write7219(unsigned char address,unsigned char dat)[font=ˎ̥]
[font=ˎ̥]{ [font=ˎ̥]
[font=ˎ̥] unsigned char i;[font=ˎ̥]
[font=ˎ̥] LOAD=0; //拉低片选线,选中器件[font=ˎ̥]
[font=ˎ̥] //发送地址[font=ˎ̥]
[font=ˎ̥] for (i=0;i<8;i++) //移位循环[font=ˎ̥]8次[font=ˎ̥] [font=ˎ̥]
[font=ˎ̥] { [font=ˎ̥]
[font=ˎ̥] CLK=0; //清零时钟总线[font=ˎ̥]
[font=ˎ̥] DIN=(bit)(address&0x80); //每次取高字节[font=ˎ̥] [font=ˎ̥]
[font=ˎ̥] address<<=1; //左移一位[font=ˎ̥]
[font=ˎ̥] CLK=1; //时钟上升沿,发送地址[font=ˎ̥]
[font=ˎ̥] }[font=ˎ̥]
[font=ˎ̥] //发送数据[font=ˎ̥]
[font=ˎ̥] for (i=0;i<8;i++) [font=ˎ̥]
[font=ˎ̥] { [font=ˎ̥]
[font=ˎ̥] CLK=0;[font=ˎ̥]
[font=ˎ̥] DIN=(bit)(dat&0x80); [font=ˎ̥]
[font=ˎ̥] dat<<=1; [font=ˎ̥]
[font=ˎ̥] CLK=1; //时钟上升沿,发送数据[font=ˎ̥]
[font=ˎ̥] }[font=ˎ̥]
[font=ˎ̥] LOAD=1; //发送结束,上升沿锁存数据[font=ˎ̥] [font=ˎ̥]
[font=ˎ̥]}[font=ˎ̥]
[font=ˎ̥]//MAX7219初始化,设置[font=ˎ̥]MAX7219内部的控制寄存器[font=ˎ̥]
[font=ˎ̥]void Initial(void) [font=ˎ̥]
[font=ˎ̥]{ [font=ˎ̥]
[font=ˎ̥] Write7219(SHUT_DOWN,0x01); //开启正常工作模式([font=ˎ̥]0xX1)[font=ˎ̥]
[font=ˎ̥] Write7219(DISPLAY_TEST,0x00); //选择工作模式([font=ˎ̥]0xX0)[font=ˎ̥]
[font=ˎ̥] Write7219(DECODE_MODE,0xff); //选用全译码模式[font=ˎ̥]
[font=ˎ̥] Write7219(SCAN_LIMIT,0x07); //8只[font=ˎ̥]LED全用[font=ˎ̥]
[font=ˎ̥] Write7219(INTENSITY,0x04); //设置初始亮度[font=ˎ̥] [font=ˎ̥]
[font=ˎ̥]}[font=ˎ̥]
[font=ˎ̥]测试程序[font=ˎ̥]
[font=ˎ̥]void main(void)[font=ˎ̥]
[font=ˎ̥]{[font=ˎ̥]
[font=ˎ̥] unsigned char i; [font=ˎ̥]
[font=ˎ̥] Initial(); //MAX7219初始化[font=ˎ̥]
[font=ˎ̥] while(1)[font=ˎ̥]
[font=ˎ̥] { [font=ˎ̥]
[font=ˎ̥] for(i=1;i<9;i++)[font=ˎ̥]
[font=ˎ̥] {[font=ˎ̥]
[font=ˎ̥] Write7219(i,i); //数码管显示[font=ˎ̥]1~8[font=ˎ̥]
[font=ˎ̥] }[font=ˎ̥]
[font=ˎ̥] } [font=ˎ̥]
[font=ˎ̥]}[font=ˎ̥]
[font=ˎ̥]典型应用电路:[font=ˎ̥]