汉字点阵显示系统的设计与实现张焕焕电信1171665110732摘要汉字点阵显示广泛应用于各种服务性的公共场所。文章首先介绍了汉字点阵显示的基本原理,在此基础上,提出了基于单片机AT89C51的汉字点阵显示系统的总体设计方案,并进一步细化设计了各单元电路。在论证了所设计显示汉字系统的可行性后,进行了实际制作及相关的程序设计,经过硬件电路及程序的调试,成功显示我院校训“厚学启智,修德树人”。关键词汉字显示单片机16×16点阵引言当今社会在大型商场、车站、码头、地铁站以及各类办事窗口等越来越多的场所需要用点阵显示图形和汉字。LED行业已经成为一个快速发展的新兴产业,市场空间巨大,前景广阔。随着信息产业的高速发展,LED显示作为信息传播的一种重要手段,已经广泛应用于室内外需要进行服务内容和服务宗旨宣传的公共场所,例如户内外公共场所广告宣传、机场车站旅客引导信息、公交车站报站系统、证券与银行信息显示、餐馆报价信息提示、高速公路可变情报板、体育场馆比赛转播、楼宇灯饰、交通信号灯、景观照明等。显然,LED显示已经成为城市现代化和信息化社会的一个重要标志。本文提出了一种基于单片机AT89C51的汉字点阵显示系统的设计方案,并显示我院校训“厚学启智,修得树人”。1汉字点阵显示原理从理论上讲,不论显示图形还是汉字,只要控制组成这些图形或文字的各个发光点的亮灭,就可以实现显示,这种方法称为静态驱动显示方式。16×16的点阵共有256个发光二极管,显然单片机没有这么多端口,如果我们采用锁存器来扩展端口,按8位的锁存器来计算,16×16的点阵需要256/8=32个锁存器。这个数字很庞大,因为我们仅仅是16×16的点阵,在实际应用中的显示屏往往要大的多,这样在锁存器上花的成本将是一个很庞大的数字。因此在实际应用中的显示屏几乎都不采用这种设计,而采用另一种称为动态扫描的显示方法。动态扫描的意思简单的说就是逐行轮流点亮,这样扫描驱动电路就可以实现多行的同多列共用一套列驱动器。具体就16×16的点阵来说,把所有同一行的发光管的阳极连在一起,把所有同一列的发光管的阴极连在一起,先送出对应第一行发光管亮灭的数据并锁存,然后选通第一行使其燃亮一定的时间,然后熄灭;以次类推,到第16行之后,又重新点亮第一行,反复轮回。当这样轮回的速度足够快,由于人眼的视觉暂留现象,就能看到显示屏上稳定的图形或汉字了。2汉字点阵显示系统的总体设计汉字点阵显示系统硬件电路大致上可以分为系统的电源电路、单片机小系统、显示驱动控制电路三部分,如图1所示。图1汉字点阵显示电路框图单片机采用AT89C51,晶振12MHz,若能采用24MHz或更高频率的晶振,可以获的更高的刷新频率,使显示更稳定。单片机的串口与列驱动器相连,用来送显示数据。列驱动器由集成电路74HC595构成,它具有一个8位传入并处的移位寄存器和一个8位锁存器的结构,而且移位寄存器和输出锁存器的控制是各自独立的,可以实现在显示本行各列数据的同时,传送下一行的列数据,即达到重叠处理的目的。行驱动器是由译码器74LS154构成,单片机P1口低4位输出的行号经4/16线译码器74LS154译码后生成16条行选通信号线,再经过驱动器驱动对应的行线。3各单元电路的设计3.1系统的电源电路汉字点阵显示喜用可以直接与220V交流电相连,经过变压器、整流桥后输出12V带有交流成分的直流电压,再经过滤波电容后输出12V直流工作电单片机列驱动器LED显示点阵行驱动器电源压,供给四个串联LED工作;再将12V直流工作电压接7805的1脚,2脚接地、3脚便输出5V直流电压再经过一滤波电容输出+5V直流电压为主控模块89C51提供5V工作电压,接法如图二所示。图二系统电源电路3.2单片机小系统单片机采用89C51芯片,89C51是一种带4K字节闪烁可编程可擦除只读存储器(FPEROM—FalshProgrammableandErasableReadOnlyMemory)的低电压,高性能CMOS8位微处理器,俗称单片机。单片机的串口与列驱动器相连,用来送显示数据。P1口低4位与行驱动器相连,送出行选信号;P1.5~P1.7口则用来发送控制信号。P0和P2口空着,在有必要时可以扩展系统的ROM和RAM。图三单片机小系统3.3显示驱动控制电路显示驱动控制电路分为列驱动电路和行驱动电路。列驱动电路是由集成电路74HC595构成。它具有一个8位传入并处的移位寄存器和一个8位锁存器的结构,而且移位寄存器和输出锁存器的控制是各自独立的,可以实现在显示本行各列数据的同时,传送下一行的列数据,即达到重叠处理的目的。74HC595的输入侧有8个串行移位寄存器,每个移位寄存器的输出都连接一个输出锁存器。引脚SI是串行数据的输入端。引脚SCK是移位寄存器的移位时钟脉冲,在其上升沿发生移位,并将SI的下一个数据打入最低位。移位后的各位信号出现在各移位寄存器的输出端,也就是输出寄存器的输入端。RCK是输出寄锁存器的打入信号,其上升沿将移位寄存器的输出打入到输出锁存器。引脚G是输出三态门的开放信号,只有当其为低时移位寄存器的输出全部为0.由于SCK和RCK两个信号是相互独立的,所以能够做到输入串行移位与输出锁存互不干扰。芯片的输出端为QA~QH,最高位QH可作为多片74HC595级联应用时,向上一级的级联输出。但因QH受输出锁存器打入控制,所以还从输出锁存器前引出了QH,作为与移位寄存器完全同步的级联输出。图三74HC595外形及内部逻辑结构图行驱动电路是由译码器74LS154构成,单片机P1口低4位输出的行号经4/16线译码器74LS154译码后生成16条行选通信号线,再经过驱动器驱动对应的行线。一条行线上要带动16列的LED进行显示,按每一LED器件20mA电流计算,16个LED同时发光时,需要320mA电流,选用三极管8550作为驱动器可满足要求。4电路的制作在Protel99SE中画出电路原理的SCH图,再转化成相应的PCB图,在PCB图中把各个元器件的位置摆放合适,以保证线条有足够的宽度,而且交叉线最少。检查无误后通过刻板机刻出PCB板。对照PCB电路图,将选择好的元件正确地安装在PCB板上。在焊接时,要有足够的热量和温度。如温度过低,焊锡流动性差,很容易凝固,形成虚焊;如温度过高,将使焊锡流淌,焊点不易存锡,焊剂分解速度加快,使金属表面加速氧化,并导致印制电路板上的焊盘脱落。尤其在使用天然松香作助焊剂时,锡焊温度过高,很易氧化脱皮而产生炭化,造成虚焊。电路板各元器件焊接完成之后,就可对电路进行调试了。在调试之前,一定要先认真的做好目视检查,检查在焊接的过程中是否有可见的短路和管脚搭锡等故障;检查是否有元器件型号放置错误,第一脚放置错误,漏装配等问题。然后用万用表测量各个电源到地的电阻,以检查是否有短路,这个好习惯可以避免贸然上电后损坏PCB板。检查无误后就可以接通电源,导入程序检查电路板是否工作正常。16×16点阵显示屏PCB图5程序设计显示屏软件的主要功能是向屏体提供显示数据,并产生各种控制信号,使屏幕按设计的要求显示。根据软件分层次设计的原理,可把显示屏的软件系统分为两大层:第一层是底层的显示驱动程序,第二层是上层的系统应用程序。显示驱动程序负责向屏体送显示数据,并负责产生行扫描信号和其他控制信号,配合完成LED显示屏的扫描显示工作。显示驱动程序由定时器T0中断程序实现。系统应用程序完成系统环境设置,显示效果处理等工作,由主程序来实现。5.1程序流程图显示驱动程序在进入中断后首先要对定时器T0重新赋值,以保证显示屏刷新率的稳定,1/16扫描显示屏的刷新率(帧频)计算公式如下:刷新率=1/16×0T)65536(120tfosc溢出率=1/16×其中oscf为晶振频率,0t为定时器0T初值。然后显示驱动程序查询当前燃亮的行号从显示缓存区内读取下一行的显示数据,并通过串口发送给移位寄存器。为消除在切换行显示数据的时候产生拖尾现象,驱动程序先要关闭显示屏,即消隐,等显示数据打入输出锁存器并锁存,然后在输出新的行号,重新打开显示。右图为显示驱动程序(显示屏扫描函数)流程图。系统主程序开始以后,首先对系统环境初始化,包括设置串口,定时器,中断和端口;然后向上滚动显示“厚学启智修德树人”八个汉字。5.2源程序软件程序主要由开始、初始化、主程序、字库组成。;**********************************************;;字幕显示:(源程序)ORG0000HLJMPSTARTORG0003HRETIORG000BHLJMPINTT0ORG0013HRETIORG001BHRETIORG0023HRETIORG002BHRETI;****************;;初始化程序;;****************;;***************;;主程序;;***************;START:MOV20H,#00HMOVA,#0FFHMOVP1,AMOVP2,AMOVP3,AMOVP0,ACLRP1.6;串行寄存器输入打入输出控制位MOVTMOD,#01H;使用T0作16位定时器,行扫描用MOVTH0,#0FCH;1MS初值(12MHZ)MOVTL0,#18HMOVSCON,#00H;串口0方式传送显示字节MOVIE,#82H;T0中断允许,总中断允许MOVSP,#70HMAIN:LCALLDIS1;显示准备,黑屏,1.5SMOVDPTR,#TABLCALLMOVDISP;向上滚动显示一页(8个字)INCDPHLCALLMOVDISP;向上滚动显示一页(8个字)INCDPHLCALLMOVDISP;向上滚动显示一页(8个字)AJMPMAIN;****************;;;多字滚动显示子程序;;*****************;;;每次8个字,入口时定义好DPTR值;;MOVDISP:MOVB,#00H;向上移动显示,查表偏址暂存(从00开始)DISLOOP:MOVR3,#07H;移动速度DISMOV:MOVR2,#00H;第0行开始MOVR1,BSETBTR0;开始扫描(每次一祯,每行1ms)WAITMOV:JBC01H,DISMOV1AJMPWAITMOVDISMOV1:DJNZR3,DISMOV;一祯重复显示(控制移动速度)INCB;显示字的下一行INCBMOVA,R1;R1为0,8个字显示完JZMOVOUTAJMPDISLOOPMOVOUT:RET;移动显示结束;;**************;;单字显示子程序;;;;**************;;;显示表中某个字DIS1:MOVR3,#5AH;静止显示时间控制(16ms*#=1.6s)DIS11:MOVR2,#00H;一祯扫描初始值(行地址从00~0F)MOVDPTR,#TAB;取表首址MOVR1,#00H;查表偏值SETBTR0;开扫描WAIT11:JBC01H,DIS111;为1,扫描一祯结耸?AJMPWAIT11DIS111:DJNZR3,DIS11RET;****************;;;扫描程序;;;****************;;;1MS刷新一次,每行显示1SINTT0:PUSHACCMOVTH0,#0FCH;1MS初值重装MOVTL0,#18HJBC00H,GOEND;16行扫描标志为1,结束INCR1;取行右边字节偏址MOVA,R1MOVCA,@A+DPTR;查表MOVSBUF,A;串口0方式发送WAIT:JBCTI,GO;等待发送完毕AJMPWAITGO:DECR1;取行左边字节偏址MOVA,R1MOVCA,@A+DPTRMOVSBUF,AWAIT1:JBCTI,GO1AJMPWAIT1GO1:SETBP1.7;关行显示,准备刷新NOP;串口寄存器数据稳定SETBP1.6;产生上升沿,行数据打入输出端NOPNOPCLRP1.6;恢复低电平MOVA,R2;修改显示行地址ORLA,#0F0H;修改显示行地址MOVR2,A;修改显示行地址