1 引言
显示是单片机应用系统中非常重要的环节,通常用数码管显示器LED作为输出设备显示一些信息和结果。在很多设备中,往往需要显示一系列不断递增的连续数,数码管按段数分为七段数码管和八段数码管,八段数码管比七段数码管多一个发光二极管单元(多一个小数点显示);按能显示多少个"8"可分为1位、2位、4位等等数码管;按发光二极管单元连接方式分为共阳极数码管和共阴极数码管。共阳数码管是指将所有发光二极管的阳极接到一起形成公共阳极(COM)的数码管。共阳数码管在应用时应将公共极COM接到+5V,当某一字段发光二极管的阴极为低电平时,相应字段就点亮。当某一字段的阴极为高电平时,相应字段就不亮共阴数码管是指将所有发光二极管的阴极接到一起形成公共阴极(COM)的数码管。共阴数码管在应用时应将公共极COM接到地线GND上,当某一字段发光二极管的阳极为高电平时,相应字段就点亮。当某一字段的阳极为低电平时,相应字段就不亮。
LED的技术进步是扩大市场需求及应用的推动力。初,LED只是作为微型指示灯,在计算机、音响和录像机等设备中应用,随着大规模集成电路和计算机技术的不断进步,LED显示器正在迅速崛起,近年来逐渐扩展到证券行情股票机、数码相机、PDA以及手机领域。LED显示器集微电子技术、计算机技术、信息处理于一体,以其色彩鲜艳、动态范围广、亮度高、寿命长、工作稳定可靠等优点,成为优势的新一代显示媒体,目前,LED显示器已广泛应用于大型广场、商业广告、体育场馆、信息传播、新闻发布、证券交易等,可以满足不同环境的需要。
在传统的显示驱动电路中,每一个LED显示器需要一个译码芯片,而每一段又需要一个限流电阻,在显示信息量较大时,电路变得复杂而且也会占用系统很多资源。MAX7219芯片是美国MAXIM公司出品的新型紧凑型、可编程共阴极LED数码管的驱动芯片,它集BCD译码器、多路扫描器、段驱动和位驱动电路于一体, 内含8×8位双口静态SRAM ,可保存8位LED数据。MAX7219芯片的外围接口电路简单,使用方便,仅需三根I/O口线便可驱动多块LED进行动态显示。MAX7219只需一个外部电阻来设置所有LED的段电流,不仅可以克服常规的动态显示亮度不够、闪烁等缺点,而且大大简化硬件电路并减少软件的工作量,因此MAX7219芯片成为单片机应用系统中的LED显示接口电路。
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译码模式时,这个处理程序是往往是不好编程的,因为它要显示数据的位数不固定,要从一位数逐步跳变为多位数。如果采用普通的设计思路,这个程序将会十分复杂。我们采用了一种新的设计思路进行编程,取得了令人满意的结果。
该处理程序的设计思想是在程序执行前先将各显示暂存单元中数字都清零,即让显示器初显示"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比较之前判断它的下一数位是否是十万位,如果下一数位是十万位时退出程序即可。程序如下:
(程序入口为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
4 结论
用MAX7219作为显示驱动电路,只需三根端口线,且软件驱动编程简单,控制方式灵活,使显示部分的电路和编程大为简化。本文通过一个实例说明使用MAX7219驱动LED显示器在其 BCD译码模式下显示连续数的方法,该方法已经在数据采集系统和包装设备上得到运用,效果良好。本文创新点是:MAX7219芯片在其BCD译码模式下驱动LED显示器显示连续数的软件部分如果采用普通编程设计思路,程序会十分复杂。本文采用一种新颖独特的编程思想,十分巧妙地根据要显示的一系列连续数不同数位上的数字与9比较的结果,来选择执行不同的程序段而达到目的,使得程序十分简单。
免责声明: 凡注明来源本网的所有作品,均为本网合法拥有版权或有权使用的作品,欢迎转载,注明出处。非本网作品均来自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。