如果用MAX7219帮忙的话,只用三根I/0口就可以完成任务,电路图见下图。
接下来我们就来看看如何使用MAX7219实现LED数码管的显示:
MAxT219简介
MAX7219的封装常见是DIP24,引脚如下图所示。
其引脚功能如下:
1.VCC:+5V电源端。
2.GND:接地端。
3.ISET:LED段峰值电流提供端。它通过一只电阻与电源相连,以便给LED段提供峰值电流。帮助位选信号显示。
4.SEGA-SEGG=LED七段显示器段驱动端。
5.SEGDP:小数点驱动端。
6.DIG7-DIGO:8位数值驱动线。输出位选信号,从每个LED公共阴极吸人电流。
7.DIN:串行数据输入端。在CLK的上升沿,数据被装入到内部的16位移位寄存器中。
8.CLK:串行时钟输入端。最高输入频率为lOMHz,在CLK的上升沿,数据被移人内部移位寄存器;在CLK的下降沿,数据被移至DOUT端。
9.LOAD:装载数据控制端。在LOAD的上升沿,最后送人的16位串行数据被锁存到数据或控制寄存器中。
10.DOUT:串行数据输出端。进人DIN的数据在16.5个时钟脉冲后送到DOUT端,以便在级联时传送到下一片MAX7219。
MAK7219的工作原理图4是MAX7219的时序图(DINCLKLOAD原理),这个图很简单,就是告诉大家三个端口是怎么合作传送数据的。其中,DIN是串行数据输入端,CLK和LOAD实际上是充当了组织者。
下面结合下图介绍一下数据传送的过程:
首先,在CLK的下降沿,无效,在CLK的上升沿,第一位二进制数据被移人内部移位寄存器,然后CLK再出现下降沿,无效,然后CLK再出现上升沿,第二位二进制数据被移入内部移位寄存器,就这样工作16个周期,完成16个二进制(前八个是地址,后8个是数据)的传送,这当中LOAD一直是低电平,当完成16个二进制的传送后。把LOAD置成高电平,产生上升沿,把这16位串行数据锁存到数据或控制寄存器中,完成装载。然后再把LOAD还原为低,重复开始的动作,周而复之.....
例如:把数据O9H传送到地址OAH(亮度控制寄存器)。即设定LED为16级亮度的第10级。编程如下:
MOV A,#OAH;亮度控制寄存器地
址以数据形式送累加器A
MOV B,#O9H;亮度控制码(第十
级)送寄存器B
LCALL WRIITE;调用“写
MAX7219子程序”
WRITE:;“写MAX7219子程序”
开始
CLR LOAD;设置LOAD无效
LCALL WRI:TE8;调用“写 8 位
数据子程序”(送的是前8位,所以是
亮度控制寄存器的地址)
MOV A.B;亮度控制码(第十级)
通过寄存器B送累加器A
LCALL WRITE8;调用写 8位数
据子程序(送的是后8位,所以是亮度
控制码)
SETB LOAD;使LOAD产生上升
沿,把刚送入的16位串行数据锁存到
数据或控制寄存器中。
RET;WRIITE子程序返回
WRTE8:;“写8位数据子程序”开始
MOV R6,#O8H;数据位写入次数,
8次
LPI:CLR CLK;CLK无效
RLC A1取累加器A的最高位
MOV D:IN,C1将累加器A的最高
位送 D:IN
NOP;等待,为了有足够的时间传
送数据,可省略
SETB CLK;CLK产生上升沿,数
据被移入内部移位寄存器
DJNZ R6,LPI;8 次结束,否则
循环LP1
RET:;“写 8位数据子程序”子程
序返回
MAX7219的工作寄存器
MAX7219主要由8个数位寄存器和6个控制寄存器组成:
1.数位寄存器7~0:它决定该位LED显示内容,地址依次为O1H一08H,2.译码方式寄存器:地址为O9H,它决定数位寄存器的译码方式,它的每一位对应一个数位。其中,1代表译码方式;0表示不译方式。比如,OOH,表示都不译码。若用于驱动LED数码管,一般都设置为译码方式,方便编程;当用于驱动条形图显示器时,应设置为不译码方式。
3.扫描位数寄存器:地址为OBH,设置显示数据位的个数。该寄存器的D2-DO(低三位)指定要扫描的位数,支持0-7位,比如要显示数据位的个数为三,则应送往地址OBH的数据就应为O3H。各数位均以1.3kHz的扫描频率被分路驱动。
4.亮度控制寄存器:地址为OAH,该寄存器通常用于数字控制方式,利用其D3-DO位控制内部脉冲宽度调制DAC的占空比来控制LED段电流的平均值,实现LED的亮度控制。
D3-DO取值可从0000-1111,对应电流占空比则从1/32变化到31/32,共16级,D3-DO的值越大,LED显示越亮。而亮度控制寄存器中的其他各位末使用,可置任意值。前面已经举例。
7.无操作寄存器:它主要用于多片MAX7219级联,允许数据通过而不对当前MAX7219产生影响。
MAX7215应用实例
按图2把单片机、MAX7219和数码管连接起来,由于只用了单片机(MCU)三个管脚,所以用简化版的AT89S2051单片机就足够了。图中DIN接P1.0,CLK接P1.1,LOAD接P1.2。
下面来做个简单的小实验:让数码管从左到右分别显示0、1、2、3、4、5、6、7,程序清单如下:
0RG0000H;程序开始
AJMPMAIN:跳转到MAIN主程
序处
DINBITP2.0:定又变量
cLKBITP1.2:定义变量
LOADBITP1.2:定义变量
0RGO080H;主程序MAIN从地
址0080H开始
;MAX7229(各工作寄存器)初
始化开始
MAIN:NOVA,#0BH;扫描位数寄存
器地址以数据形式送累加器A
MOVB,#07H;扫描位数(8位)
送寄存器B
LcALLWRITE:调用“写
MAX7219子程序”
MOVA,#09H;译码方式寄存器
地址以数据形式送累加器A
NOVB,#OFFH;译码方式(译码)
送寄存器B
LCALLWRITE:调用“写
HAX7219子程序”
NOVA,#OAH;亮度控制寄存器
地址以数据形式送累加器A
NOVB,#09H;亮度调节(10级)
送寄存器B
LCALLWRITE;调用“写
NAX7219子程序”
MOVA,#OCH;关断寄存器地址
以数据形式送累加器A
MOVB,#01H;待机开关(关)送
寄存器B
LCALLWRITE;调用“写
MAX7219子程序”
START:NOVR3,#08H;显示数据循
环次数送寄存器R3
NOVRO,#OOH;寄存器RO存放
TAB表格间接指针
LOOP:M0VDPTR,#TAB;送TAB首
地址入DPTR
MOVR4,#01H;数位寄存器0的
地址(01H)以数据形式入R4
LP:M0VA,RO;TAB表格间接指针入A
MOVCA,@A+DPTR;取TAB首地
址中的显示数据入A
NOVB,A;TAB首地址中的显示
数据入B
M0VA,R4;数位寄存器0的地址
入A
LCALLWRITE:调用“写
MAX7219子程序”
INCRO;RO加一(TAB表格间接
指针指向下一个)
INCR4:R4加一(换下一个数位
寄存器)
DJNZR3,LP;循环八次结束
LJMPSTART;重新开始显示0~
7
TAB:DB00H,01H,02H,U3H,
04H,05H,06H,07H;前面对“译码
方式寄存器”采用了BCD译码方式,所
以TAB数据这么写
WRLTE:;写MAX7219子程序(写
16位,前8位地址,后8位数据)
CLRLOAD:设置LOAD无效
LCALLWRITE8:调用写8位数
据子程序
HOVA,B;B中内容送A
LCALLWRITE8:调用写8位数
据子程序
SETBLOAD;使LOAD产生上升
沿,把刚送入的16位串行数据锁存到
数据或控制寄存器中。
RET;WRITE子程序返回
WRITE8:;“写8位数据子程序”
开始
NOVR6,#08H:数据位写入次
数.8次
LP1:CLRCLK:CLK无效
RLCA;取累加器A的最高位
MOVDIN,C;将累力口器A的最高
位送DIN
NOP;等待,为了有足够的时间传
送数据,可省略
SETBCLK;CLK产生上升沿,数
据被移入内部移位寄存器
本文关键字:单片机 元器件特点及应用,元器件介绍 - 元器件特点及应用