微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 模拟电路设计 > MAX7219驱动LED显示器显示连续数的方法

MAX7219驱动LED显示器显示连续数的方法

时间:05-06 来源:无忧电子开发网 点击:

摘要:生产实际中单片机应用系统往往需要显示诸多数据,采用MAX7219驱动LED显示器有许多优点,该芯片采用BCD译码模式编程比较方便,但要使显示器显示一系列连续数要经过一定的程序处理。本文介绍了一种用MAX7219驱动数码管显示器显示连续数的硬件电路及编程方法,它设计思想独特,程序简单,在包装机械及数据采集系统中使用效果良好。

关键词: MAX7219;LED;BCD译码模式;显示;连续数 

1 引言

显示是单片机应用系统中非常重要的环节,通常用数码管显示器LED作为输出设备显示一些信息和结果。在很多设备中,往往需要显示一系列不断递增的连续数,例如采集数据过程中不仅要显示采集数据的具体数值还要显示已经采集数据的个数,那么采集数据的个数就是一系列连续数,又如很多生产设备要不断显示已加工好的零件或产品的数量等。

在传统的显示驱动电路中,每一个LED显示器需要一个译码芯片,而每一段又需要一个限流电阻,在显示信息量较大时,电路变得复杂而且也会占用系统很多资源。MAX7219芯片是美国MAXIM公司出品的新型紧凑型、可编程共阴极LED数码管的驱动芯片,它集BCD译码器、多路扫描器、段驱动和位驱动电路于一体, 内含8×8位双口静态SRAM ,可保存8位LED数据。MAX7219芯片的外围接口电路简单,使用方便,仅需三根I/O口线便可驱动多块LED进行动态显示。MAX7219只需一个外部电阻来设置所有LED的段电流,不仅可以克服常规的动态显示亮度不够、闪烁等缺点,而且大大简化硬件电路并减少软件的工作量,因此MAX7219芯片成为单片机应用系统中首选的LED显示接口电路。MAX7219具有BCD译码模式和非译码模式。如果仅显示一些连续数,当然可采用非译码模式,这时可做一个TAB表,依次存放数字的相应编码, 通过使用查表指令即可实现。但生产实际中往往要显示很多种数据,其它数据的显示采用BCD译码显示方式比较方便。虽然一片MAX7219可以在不同的LED同时输出两种显示方式,但这样将大大增加软件编程的负担,为使程序简化,可将连续数和其它数据同时采用BCD译码模式显示。本文以MAX7219串行LED驱动器驱动LED显示连续数1~99999为例,说明其实现显示连续数的方法。

2 硬件接口电路

MAX7219是24脚DIP塑料封装元件,MAX7219芯片与AT89C52单片机及共阴极小电流LED段码显示器的接口电路简单,原理图如图1所示。AT89C52的引脚P1.0、P1.1、P1.2分别与MAX7219的DIN数据输入管脚、LOAD锁定输入管脚、CLK时钟输入管脚相连。

  MAX7219可通过V+ 管脚和ISET管脚之间所接的外部电阻RSET来控制显示的亮度,RSET电阻越大段电流越小,硬件电路中RSET可采用10KΩ。为了减少外界的干扰,应在MAX7219的V+ 管脚和GND管脚之间加上一个0.1μF的涤纶电容和一个10μF的钽电容。

图1 MAX7219与AT89C52单片机硬件接口电路

3 软件编程

MAX7219与AT89C52芯片编程主要分为两部分:初始化子程序、送显子程序以及数据传送。初始化程序主要是对MAX7219的显示模式、显示亮度、显示位数等进行初始化。本例中主要的初始化部分是选择每一显示位相应的显示方式为全译码方式,即给译码方式寄存器X9H 单元送相应的数值0FFH;限制显示扫描显示位数为5位,即给扫描限制寄存器XBH 单元送相应的数值04H。

数据传送子程序是根据器件的传送时序编写的子程序,其主要功能是串行传送数据。送显程序的功能是将要显示的数值送到MAX7219的数据寄存器里,使其显示出来。这两部分的内容在很多文献中都有说明,本文不多加说明。

本文要重点介绍在数据传送和送显程序前面部分的处理程序,也就是使要显示的一系列连续数1~99999逐步放入各个显示数据暂存单元的程序。当MAX7219采用BCD译码模式时,这个处理程序是往往是不好编程的,因为它要显示数据的位数不固定,要从一位数逐步跳变为多位数。如果采用普通的设计思路,这个程序将会十分复杂。我们采用了一种新的设计思路进行编程,取得了令人满意的结果。

显示器显示数据刷新的时间是根据需要而定的,本例采用单片机内部的定时器来进行定时,在每次定时时间到后先执行该处理程序,然后再调用数据传送和送显程序便可实现在LED数码管上显示连续数。

该处理程序的设计思想是在程序执行前先将各显示暂存单元中数字都清零,即让显示器最初显示"00000"。每当定时时间到时先将个位暂存单元中的数字与9相减,结果不为0时,将个位数字加1后送入个位暂存单元并送出显示(所有数的个位数字1~9的变化都通过该段程序完成);如果结果为0,则将十位暂存单元中的数字与9相减,结果不为0时,则先将个位数字变为0,再将十位数字加1后分别送入个位、十位暂存单元并送出显示(所有数的十位数字1~9的变化都通过该段程序完成);如果十位数字与9相减结果为0,则要再将百位暂存单元中的数字与9相减比较,结果不为0时,则先将个位、十位数字都先变为0,再将百位数字加1后分别送入个位、十位、百位数据暂存单元并送出显示(所有数的百位数字1~9的变化都通过该段程序完成);如果百位数字与9相减比较结果为0,再将千位数字与9相减比较结果…如此下去,便可使显示器显示一系列连续数。例如程序执行第一次时,个位暂存单元中的数字为0,它与9相减的结果不为0,那么将0加上1的结果1放入个位暂存单元送显便显示出数据"00001",执行第九次显示数据为"00009",执行第十次时,要先将个位暂存单元中的数字9与9相减,结果为0,这时再将十位暂存单元中的数字0与9相减,0与9相减的结果不为0,这时先将个位数字变为0放入个位暂存单元,再将十位暂存单元中的数字0加上1后的结果1放入十位暂存单元送显,便可显示数据"00010"。要使显示的数最大为99999,只需在每一数位与9比较之前判断它的下一数位是否是十万位,如果下一数位是十万位时退出程序即可。该处理程序十分巧妙地根据要显示的数不同数位上的数字与9比较的结果,来选择执行不同的程序段而达到目的,因此虽然程序设计思想复杂,但程序十分简单。程序如下:

(程序入口为C0)

C1:MOV @R1,#00H

INC R1

MOV A,R1

SUBB A,#45H ;判断是否到十万位暂存单元45H

CLR C

JZ C2

C0:MOV A,@R1

SUBB A,#09H

JZ C1

MOV A,@R1

ADD A,#01H

MOV @R1,A

C2:MOV R1,#40H ;个位暂存单元40H送寄存器

RET

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top