本科毕业设计LED点阵广告牌的设计_第1页
本科毕业设计LED点阵广告牌的设计_第2页
本科毕业设计LED点阵广告牌的设计_第3页
本科毕业设计LED点阵广告牌的设计_第4页
本科毕业设计LED点阵广告牌的设计_第5页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

摘要本文以STC89C52RC为核心控制器,用四块8×8共阳型点阵模块构建一个16×16的LED电子显示屏,实现滚动汉字的的动态显示。驱动局部使用两个移位存储器74HC595和两个移位存放器74HC164组成,主要负责列扫描和行扫描。行控制电路采用8550三极管放大电流,加大扫描强度,提高点阵显示屏亮度。软件控制程序采用C语言编写,通过设置LED发光二极管阳极与阴极电平的上下来控制它的亮灭。点阵显示的字符可以直接在字模软件中提取,字体显示方式采用动态显示,使文字可以实现左移、上移、下移的动态显示效果。实验说明,该系统的总体设计完成了LED点阵显示滚动汉字和数字的功能,且显示效果清晰,性能稳定,无拖尾现象。关键词:STC单片机16*16点阵显示动态显示AbstractThisarticlewithSTC89C52RCasthecorecontroller,usingfour8x8totalYangtypelatticemodulestobuilda16x16LEDelectronicdisplayscreen,realizethedynamicdisplayofthescrollofChinesecharacters.Drivepartusedtwoshiftmemory74hc595areneededandshiftregister74hc164composition,ismainlyresponsibleforscanandlinescan.Linecontrolcircuitadopts8550triodeamplifier,currentscanintensity,improvethedotmatrixdisplayscreenbrightness.SoftwarecontrolprogramwrittenusingClanguage,bysettingtheanodeandcathodeLEDlight-emittingdiodes(leds)levelofhighandlowtocontrolthelightoutofit.Dotmatrixdisplayofcharacterscanbedirectlyextractedinthefontsoftware,fontdisplaymodeusingdynamicdisplay,makethetextcanrealizethedynamicdisplayoftheleft,moveupanddown.ExperimentsshowthatthesystemoveralldesigntocompletethefunctionofLEDdotmatrixdisplayscrollofChinesecharacters,anddisplayeffectisclear,stableperformance,notrailingphenomenon.Keywords:STCmicrocontroller16*16dotmatrixdisplaydynamicdisplay目录TOC\o"1-3"\h\u7271绪论 1235701.1课题背景 1302061.2研究目的和意义 1322071.3论文主要内容 1210742系统硬件电路设计 327742.1系统结构的设计 344312.2行驱动电路设计 3141532.3列驱动电路设计4319622.4单片机最小系统电路 568062.5单片机芯片选择 6305342.6LED点阵显示器 9317372.7取字模软件介绍 10103123系统软件局部设计 1251403.1主程序设计 12242423.2显示驱动程序设计 13297673.3显示屏刷新率的计算 13135544系统调试及性能分析 1424674.1系统调试 14139944.2hex文件的生成 1483754.3仿真调试 16306814.4调试中出现的问题 16144725结论与展望18210965.1结论1898375.2展望1825891参考文献 1922950附录1201883附录2211绪论1.1课题背景随着时代的不断开展,广告显示牌在宣传中发挥着越来越重要的角色,无论是在公交车站,地铁站,股票市场,或者学校都不能缺少它,但是,传统的霓虹灯,无论是在显示、功耗都不能满足当前社会的需要。因此,改良传统霓虹灯是必要的。正是因为单片机超越性的开展和高亮度LED发光管的崛起,使得高亮度的点阵显示屏垄断了市场。LED显示设备与传统的显示设备相比,它具有鲜明的色彩,多样化的显示方式,高强度的亮度显示,并且LED显示屏上的文字或图像可以随意改动,使用灵活方便。同时,点阵屏幕视野开阔、显示方式又灵活多变,因此,被很多企业所应用。如:银行、股市、商业广告和文化娱乐场所等。1.2研究目的和意义本设计的主要研究目是让我们熟练掌握并清楚的知道单片机点阵的设计原理,并且让我们把大学期间所学到的理论知识充分应用于实践,使我们更深刻的认识了理论与实践相结合的重要性。通过设计,我们学会了如何利用计算机软件和硬件的开发工具,并积累了珍贵的经验,为今后在相关行业工作积累了丰富的实践经验。目前我国信息技术的开展越来越快,LED显示屏作为显示平面功能也更广泛。但是不管LED技术开展再迅速,我国的生产水平和外国先进水平相比起来还是存在一定的距离。因此,研究这一课题为我们未来的就业或对LED显示屏技术的开展有很大的帮助。1.3论文主要内容本课题设计主要是利用单片机来控制一个16×16点阵显示屏,并且LED显示屏各点能够高亮度且均匀显示,要求文字在显示过程中平稳、清晰不拖隐,文字的显示样式有循环的左移、上移。根据任务要求,具体的内容如下:1.查阅点阵的相关文献资料,学习最简单点阵的使用方法;2.将单一的8*8点阵扩展成16×16点阵,利用Proteus软件对硬件系统电路进行仿真;3.利用keil软件编写单片机程序,编译链接生成.hex文件,然后下载到Proteus软件中进行硬件仿真;4.硬件电路仿真调试成功后制作实物,并且要使实物能够完本钱设计所要实现的要求。2系统硬件电路设计2.1系统结构的设计系统的整体设计是将单片机最小系统、行驱动电路、列驱动电路、LED点阵显示电路,运用单片机的智能化,将每个驱动模块系统的组合在一起,总体设计框图如图2.1所示。图2.1系统结构设计总图2.2行驱动电路设计行驱动电路的设计采用芯片74HC164,并利用三极管8550放大驱动电流,加大扫描强度,提高点阵屏的亮度。由于单片机的输出端口有限,如果要控制16*16的LED点阵显示那么需要32个端口,这样就占用了单片机很多的I/O口,并且对单片机的扩展也带来很大的麻烦,影响I/O口的其他扩展功能。而行驱动电路仅用7~9端口可以实现控制显示,因此,使用行驱动电路大大减少占用I/O口扩展其他功能,为单片机节约了大量的空间。74HC164是属于8位边沿触发移位存放器的高速硅门CMOS器件,数据采用串入并出,并且数据经过两个输入端〔A或B〕串行输入;两个端口都可作为数据输入端,可以相互交替来控制另外一个端口。两个输入端都可接高电平并且可以连接在一起,但是一定不能悬空处理。主复位(CLR)如果是低电平,那么其它输入端均无效,此时也去除了存放器,致使所有的输出为低电平。其引脚排列图如下列图2.2所示。图2.274HC164引脚排列2.3列驱动电路设计列驱动电路是采用集成芯片74HC595组成,具有一个8位串入并出的移位存放器还有一个8位输出锁存器的特殊结构,移位存放器和输出锁存器是相互独立控制的,这样的目的是先移好位,再存储数据,并且在移位时,输出的数据能够保持。74HC595的输入端拥有8个串行移位存放器,8个移位存放器的输出都和一个锁存器相连接。其引脚排列如图2.2所示。图2.274HC595引脚排列引脚SER是串行数据的输入端,SRCLR为直接清零端,它的优先级别最高。RCK是移位时钟脉冲,当脉冲到达上升沿时开始移位,同时把SER的下一个数据输入到最低位。移位存放器时钟〔SRCLK〕和数据存储存放器时钟〔RCLK〕两个都属于上升沿触发有效。假设两个时钟相连在一起工作,那么移位存放器会始终超前于存储存放器一个时钟脉冲。2.4单片机最小系统电路单片机最小系统是由晶振电路和复位电路两局部组成,其总体电路图如下列图2.4所示。图2.4单片机最小系统图〔1〕时钟电路系统的时钟电路设计采用内部方式,即利用芯片内部的振荡电路。STC单片机内部有一个用于构成振荡器的高增益反相放大器。引脚XTAL1和XTAL2分别是此放大器的输入端和输出端。这个放大器与作为反应元件的片外晶体谐振器一起构成一个自激振荡器。外接晶体谐振器以及电容C1和C2构成并联谐振电路,接在放大器的反应回路中。对外接电容的值虽然没有严格的要求,但电容的大小会影响震荡器频率的上下、震荡器的稳定性、起振的快速性和温度的稳定性。因此,此系统电路的晶体振荡器的值为12MHz,电容值约为30pF。〔2〕复位电路复位是对单片机进行初始化操作,即把特殊功能存放器的数据刷新为默认数据,单片机在运算过程中如果遇到外界干扰,存放器中的数据就会发生混乱,以至于程序不能正常运行,这样就需要单片机复位,以使程序重新开始。复位方式一般分两种:上电自动复位和按键手动复位,本设计中的复位电路既可实现上电自动复位也可实现手动复位,其电路的组成是在RST复位输入引脚上接一个电容至VCC端,还有按键,下接一个电阻到地即可。2.5单片机芯片选择单片机是把微型计算机主要局部集成在一块芯片上的单芯片微型计算机。单片机STC89C52由CPU、存储器〔包括RAM和ROM〕、I/O接口、定时器/计数器、中断控制功能等均集成在一块芯片上,片内各功能通过内部总线相互连接起来。〔1〕主要特性:●8位CPU●内置4K字节可重复编程Flash●寿命:1000写/擦循环●全静态工作:0Hz-24Hz●三级程序存储器锁定●128*8位内部RAM●32根可编程I/O线●两个16位定时器/计数器●5个中断源,2个中断优先级●可编程串行通道●低功耗的闲置和掉电模式●片内振荡器和时钟电路〔2〕单片机的管脚如图2.5所示。图2.5STC89C52的引脚图VCC:供电电压GND:接地P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8个TTL门电流。当P1口的管脚第一次写“1”时,被定义为高阻输入。P0能够用于外部程序数据存储器,他可以被定义为数据/地址的第八位。在FIASH编程时,P0口作为原码输入口,当FLISH进行校验时,P0输出源码,此时P0外部必须被拉高。P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4个TTL门电流。P1口管脚写入“1”后,被内部上拉位高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。在FLISH进行校验时,P1口作为第8地址接受。P2口:P2口位一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。并因此作为输入时,P2口的管脚被外部拉低,将输出电流。这是由于内部上拉的缘故。串口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高8位。在给地址“1”时,他利用内部上拉优势,当对外部8位地址数据存储器进行读写时,P2口输出器特殊功能存放器的内容。P2口在FLISH编程和校验时接受高8位地址信号和控制信号。P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接受输出4个TTL门电流。当P3口写入“1”后,他们被内部上拉为高电平,并用作输入。作为输入,由于外部下拉为低电平,P3口将输出电流,这是由于上拉的缘故。P3口也作为STC89C51的一些特殊功能口,如下所示:P3.0RXD(串行输入口);P3.1TXD〔串行输出口〕;P3.2/INT0〔外部中断0〕;P3.3/INT1〔外部中断1〕;P3.4T0〔计时器0外部输入〕;P3.5T1〔计时器1外部输入〕;P3.6/WR(外部数据存储器写选通);P3.7/RD〔外部数据存储器读选通〕;P3口同时为闪烁编程和编程校验接收一些控制信号;RST:复位输入。当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。ALE/PROG:当访问外部存储器时,地址所存允许的输出电平用于锁存地址的低位字节。在FLISH编程期间,此引脚用于输入编程脉冲。在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。因此它可用作对外部输出的脉冲或用于定是目的。然而要注意的是:每当用作外部数据存储器是,将跳过一个ALE脉冲。如想禁止ALE的输出可在SFR8EH地址上置0。此时,ALE只有在执行MOVX,MOVC指令是ALE才起作用。另外,该引脚被略微拉高,如果微处理器在外部执行状态ALE禁止,置位无效。/PSEN:外部程序存储器的的选通信号。在有外部程序存储器取指期间,每个机器周期两次/PSEN有效。但在访问外部存储器时,这两次有效的/PSEN信号讲不出现。/EA/VPP:当/EA保持低电平时,那么在此期间外部存储器〔0000H-FFFFH〕,不管内部是否有程序存储器。注意加密方式1时,/EA将内部锁存为RESET;当/EA端保持高电平时,此间内部程序存储器。在FLASH编程期间,此引脚也用于施加12V编程电源〔VPP〕。XTAL1:反响放大振荡器的输入及内部时钟工作电路的输入XTAL2:来自反响振荡器的输出。2.6LED点阵显示器1LED点阵显示器的介绍LED点阵显示器是使用发光二极管点阵模块组成的平面式显示屏幕。它具有很多优点:效率高、使用寿命长、显示清晰亮眼、色彩丰富鲜明。自二十一世纪初,随着LED技术的不断提高与创新,在国外得到了广泛的利用。LED点阵显示器的种类有多种:根据阵列分为5×7,5×8,6×8,8×8,根据发光颜色可分为单色,双色,三色,根据极性的排列方式可分为共阳极和阴极。LED〔8*8〕点阵显示的根本原理:8*8的点阵是由64个发光二极管组成,每个二极管都是分布在行线与列线的交点上,当某一列的电平为1,某一行为0时,那么对的二极管就会点亮;如图2.6所示。图2.68*8点阵LED根据驱动方式的不同,LED点阵屏分为计算机驱动型和单片机驱动型两种工作方式:计算机驱动型的特点:LED点阵显示屏由计算机驱动的,不仅可以显示字符,图形,还可以显示多媒体彩色视频内容,但其本钱高。单片机驱动型的特点:体积小,重量轻,本钱低,无线电爱好者有一定根底,经过一个简单的学习后,只需要购置一些元器件,就可以使用LED点阵屏了。2用8*8LED点阵构成16*16LED点阵在现实应用中,用一个16×16的点阵就可以完整的显示一个汉字。下面就以4块8*8点阵构成的16×16点阵来实现本课题设计的显示任务。构建16*16点阵时首先在Proteus软件的元件库中找到一块“Matrix-8x8-red”元器件,然后复制四块该元件并移到编辑窗口中。在放置元件时,要注意把元件左转90°,使其水平放置,这样它的行线和列线分别为左面8个引脚和右边8个引脚。然后开始对四个元器件对应的行线和列线分别进行标号,每一条行线和列线的引脚都接一行16个LED。但要注意将行线和列线的引脚都要设计长一点,为方便我们连线使用。可以看到原来的连接线已被自动隐藏,而交叉留下的点可以不去管它。然后我们选中下面的两块点阵,拖动它们与上侧的两块合拢。这样做成的LED点阵的列线为左边的16个位选数据线,右边的16个引脚是用来输入字体代码。最终连接的效果如图2.7所示。图2.716*16LED点阵2.7取字模软件介绍在设计中由于用到的是一个16*16的LED点阵,需要显示27个汉字,如果单是手工对字体取模,将会花费很多时间,为了方便操作,我们利用字模软件PCtoLCD2002,该软件简单方便易操作,省了很多工作量。软件主界面如图2.8所示。图2.8取字模软件界面1.文字输入区输入所需要显示的文字,文字数目不限。2.文字输入完毕后,点击生成字模按键,然后将字模保存。3.取模原那么:以字节为单位,每取8个点作为一个字节,如果最后缺乏8个点就补满8位。4.取模方式:可根据字体显示移动的方向自行选择是横向取模还是纵向取模。5.提供图象保存,数据保存为文本文件的功能。6.如果想要输入汉字和字母,那就要先输入汉字,程序会将您第一个输入的文字作为取模宽度。在软件文字输入区输入某个字,按下Enter在点阵生成区就会有相对应字的点阵生成,软件中还可以自行设置字模的取模方式,修改图像,参数设置等。3系统软件局部设计在单片机系统中,硬件局部是系统的根底,软件那么是在硬件的根底上对电路元件的调配和使用,最终实现系统所要到达的目标。因此,系统在总体设计上首先要确定程序结构,合理分配内置的RAM资源,划分功能模块,其次进行主程序和各模块程序的设计,最后连接成一个完整的应用程序。系统软件选用C语言程序编写,根据模块化的设计思路进行设计。软件的主要作用就是向点阵显示屏提供显示数据,并产生各种控制信号来控制显示屏上显示的汉字的移动。根据软件分层次设计的原理,将软件系统分成两大块:一块是显示驱动程序,另一块是系统的应用程序。显示驱动程序主要负责向显示屏传输显示数据,并负责产生行、列扫描信号和其它的控制信号,共同实现点阵显示屏的扫描显示工作。系统应用程序主要掌管系统整体环境的设置和显示效果处理等工作,由主程序来完成。3.1主程序设计系统运行主程序后,首先是初始化系统环境,然后点阵进入开机状态,进入正常显示,显示屏每次显示一个汉字且连续实现汉字向左滚动和向上滚动。由于单片机没有停机指令,所以可以设置系统程序不断地循环执行上述显示效果。系统主程序结构如图3.1所示。图3.1主程序的总体结构3.2显示驱动程序设计显示驱动程序首先进入中断模块,给定时器赋初值,然后开始查询当前点亮的行号,并且把下一行的显示数据从显示缓存区内读取出来,经过串口输出发送到移位存放器内。为了防止在切换显示数据时发生拖尾现象,因此,我们要提前关闭显示屏,即消隐。等到显示数据被输出锁存器锁存后,再重新输出新的行数据,并同时翻开显示。显示驱动程序流程图如图3.2所示。图3.2显示驱动程序流程图3.3显示屏刷新率的计算显示驱动程序在中端程序中首先应该对定时器T0重新赋初值,以保证显示屏刷新率的稳定,16行扫描格式的显示屏刷新率计算公式如下:刷新率〔帧频〕=×〔溢出率〕=×〔3.1〕式〔3.1〕中:fosc—晶振频率;t0—定时器T0初值〔工作在16位定时器模式〕。4系统调试及性能分析4.1系统调试系统调试主要分为硬件调试和软件调试两局部。硬件调试方面主要是在焊接时应该先焊接小元器件,然后分模块逐个进行焊接测试,防止元器件的虚焊。对硬件进行调试时要在软件正确无误的条件下进行,这样即使某个模块出现焊接错误,我们也可以逐个调试排查。当然,在调试的时候也会出现一些防止不了的误差。软件调试方面主要是依据事先设计好的硬件电路原理图来编写程序。在大二期间所学的是C语言,因此,本设计在编写软件程序时都是采用C语言编写的。首先是编写不同模块的功能程序,等全部编写完成后将他们组合在一起。起初在编写时总会出现一些意想不到的问题,但是经过仔细分析、屡次调试还是将问题逐个击破,将程序编译成功。4.2hex文件的生成要生成.hex文件,首先要进行系统软件调试,软件调试主要是将每个功能模块的程序在Keil软件中进行编译以验证其功能的可实现性。在软件编译成功后生成.hex文件方可进行功能测试。1.翻开Keil编程软件,单击菜单栏中的“工程”选项,在下拉菜单中选择“新建工程”,然后弹出“创立工程工程”对话框,输入新建工程名称,单击“确定”按钮后,在弹出的“选择设备”的对话框中选择适宜的单片机型号。2.单击菜单栏中的“文件”,在下拉菜单栏中选择“新建”,翻开一个空的文本编辑窗口后保存,创立新的源程序文件“16_16MOVE.c”。3.在左侧的“工程”窗口的“文件”页中单击文件组,单击鼠标右键,在弹出的窗口中选中添加文件到“源组1”选项,将“16_16MOVE.c”程序导入到“源组1”中。如图4.1所示。图4.1Project界面4.在“工程”下拉菜单中,选择“OptionsforTarget”设置对话框,将会弹出“OptionsforTarget”窗口,在此对话框中选中“Output”选项卡中的“CreateHEXFile”选项。如图4.2所示。图4.2OptionsforTarget界面5.在“Project”下拉菜单中,选择“RebuildallTargetFiles”项。如图4.3所示。图4.3RebuildallTargetFiles界面假设程序编译成功,将生成“16_16MOVE.hex”文件。如图4.4所示。图4.4生成的.hex文件4.3仿真调试在最新版本的Proteus软件中,没有现成的16*16点阵模块,因此,在设计过程中采用现有的4块8*8点阵模块组合成一个16*16点阵模块。仿真时,先在Proteus中找到STC89C52芯片,单击鼠标左键然后对其进行参数设置,将单片机的时钟频率设置为12MHz后开始加载.hex文件。等加载完成后连接好电路点击仿真按键即可对系统进行仿真。在仿真过程当中如果遇见硬件问题可在Proteus中直接更换修改,如果遇到软件参数问题可在keil中直接调试更换,这样,通过用keil软件和Proteus软件的共同作用就可以实现本设计的最终目标。4.4调试中出现的问题在调试过程中,系统在调用延时子程序时,假设遇到延时时间过短问题,即使能提高点阵显示屏的亮度,也无法看到字体完整的显示,每行的汉字尚未等显示完整就进入了下一行的扫描,甚至锁存器的输出还没到达显示屏,就进入到下一个扫描周期;如果延时时间过长,就会造成显示屏的亮度降低,并且扫描出来的字体断断续续,人眼看到的并不是一个完整的汉字,因此,以上两种情况都是不符合设计要求,假设想要到达最正确的显示效果,就必须依靠锁存器的锁存时间来准确算出扫描一行的最短时间,以获得最正确的时间延时,显示屏才能显示稳定的汉字。5结论与展望5.1结论本设计采取由浅入深,循序渐进的模式。首先简单的介绍了半导体的相关知识,继而讲到在半导体根底上产生的发光二极管,接着自然联想到由LED矩阵组成的显示屏,这样就谈到了本次设计的核心。在设计上分为三大步。第一步是程序的设计。程序设计采用C语言编写,在大二上学期,学习了单片机的知识,在学习期间也得到了很多同学的热心指导,从而为编程以及素材上积累了广泛的知识和经验,所以本次设计思路很清晰。主要由主显示程序的设计和附加电路程序的设计。第二步是电路的仿真,通常使用Proteus仿真软件,根据设计要求,选择必要的器件,并将他们有机的连接起来。完成之后,将已经生成的hex文件下载到仿真电路中的单片机上,就可以运行仿真了。第三步是实物的设计,也是本设计的又一重点。实体的设计会遇到很多实际问题,比方器件的选购,元器件的排列,以及电路的焊接。不过还好经过老师的指导,同学的帮助,以及自己的一点努力,虽然几经曲折,最终还是完成了实物的设计。最后将程序通过下载器下载到单片机上,整个系统就可以正常工作了。5.2展望本设计为简单的单色显示屏,在工业上,单色LED屏,双基色LED屏,以及全彩LED屏技术方兴未艾,在生活中已经得到了广泛应用并将继续发挥它们的作用。将来全彩LED显示屏必将大放异彩。所以我不会满足当前所取得的微小成绩,还将继续努力,不断充实和提高自己,为社会主义现代化奉献自己的力量。参考文献[1]张鑫.单片机原理及应用,电子工业出版社,2010,10.[2]涂时亮.单片微型机原理应用,复旦大学出版社,2008,8.[3]阳进.基于单片机的LED显示屏的汉字显示[J].中国科技信息,2006,12.[4]汪建.MCS-96系列单片机原理与应用技术.武汉华中科技大学出版社,2007,8.[5]唐德礼.STC89C52RC系列单片机原理及应用实例,华中科技大学出版社,2009.[6]宋万杰.罗丰.CPLD技术及其应用.西安电子科技大学出版社,2008.[7]杨卫平.LED大屏幕信息显示系统的设计,河北工业大学学报,2010.[8]郑刚.LED大屏幕显示系统的设计,北方工业大学出版社,2007,3.[9]李元生.LED光柱专用驱动器[J].家庭电子,2005,(04):1-7.[10]王亭.李瑞涛,宋召清.在Windows下PC机和单片机的串行通信[J].微型机与应用,2000,(1):25-27.[11]陈新忠.基于RS232总线的单片机多机通信软件设计[J].现代电子技术,2002,(03):56-78.[12]乔世杰.小波图像编码中的对称边界延拓法[J].中国图像图形学报,2000,5(9):725-729.[13]李桂平.LED屏幕显示器的设计[J].零陵师范学院学报,2002,(9):367-380.[14]DavidFRogers.Computergraphicsalgorithm[M].Beijing:ChinaMachinePress,2002:97-99.附录1硬件原理图附录2程序清单/*16*16点阵屏的移动显示*/#include<reg51.h>#include<intrins.h> #defineDATE_OUTP2 //指定P2口做为输出sbitDATA=DATE_OUT^0; //列数据输出位 sbitSCLH=DATE_OUT^1; //列扫描时钟位sbitSCLT=DATE_OUT^2; //列数据锁存位sbitAB=DATE_OUT^5; //行数据输出位sbitSCK=DATE_OUT^4; //行扫描时钟位unsignedchardate[32];//32字节RAM做为16*16点阵屏显示缓存voiddisplay();//做为点阵扫描函数,将显示缓存的数据输出到点阵屏voiddisplay_time(unsignedinttimer); //指定时间扫描显示voiddisplaymove(unsignedchar*lp,unsignedcharc,unsignedchartimer);//显示汉字内容的移动效果,LP指向要显示第一个字的首地址,C表示显示字的个数, //timer是移动的速度voiddisplaymovetb(unsignedchardin,unsignedchar*lp,unsignedchartimer);//上下移动内容,din:1为向下,0为向上,lp指向要移入的内容,timer为移动速度voiddelay(unsignedinta);//延时子函数codeunsignedcharxi[32]=//西{0x00,0x00,0xFF,0xFE,0x04,0x40,0x04,0x40,0x04,0x40,0x3F,0xF8,0x24,0x48,0x24,0x48,0x24,0x48,0x24,0x48,0x28,0x38,0x30,0x08,0x20,0x08,0x20,0x08,0x3F,0xF8,0x20,0x08};codeunsignedcharjing[32]=//京{0x02,0x00,0x01,0x00,0xFF,0xFE,0x00,0x00,0x00,0x00,0x1F,0xF0,0x10,0x10,0x10,0x10,0x10,0x10,0x1F,0xF0,0x01,0x00,0x11,0x10,0x11,0x08,0x21,0x04,0x45,0x04,0x02,0x00};codeunsignedcharxue[32]=//学{0x22,0x08,0x11,0x08,0x11,0x10,0x00,0x20,0x7F,0xFE,0x40,0x02,0x80,0x04,0x1F,0xE0,0x00,0x40,0x01,0x80,0xFF,0xFE,0x01,0x00,0x01,0x00,0x01,0x00,0x05,0x00,0x02,0x00};codeunsignedcharyuan[32]=//院{0x00,0x40,0x78,0x20,0x4B,0xFE,0x52,0x02,0x54,0x04,0x61,0xF8,0x50,0x00,0x48,0x00,0x4B,0xFE,0x48,0x90,0x68,0x90,0x50,0x90,0x41,0x12,0x41,0x12,0x42,0x0E,0x44,0x00};codeunsignedcharji[32]={//机0x10,0x00,0x10,0x10,0x11,0xF8,0x11,0x10,0xFD,0x10,0x11,0x10,0x31,0x10,0x39,0x10,0x55,0x10,0x51,0x10,0x91,0x10,0x11,0x10,0x11,0x12,0x12,0x12,0x14,0x0E,0x18,0x00};codeunsignedchardian[32]={//电0x01,0x00,0x01,0x00,0x01,0x00,0x3F,0xF8,0x21,0x08,0x21,0x08,0x21,0x08,0x3F,0xF8,0x21,0x08,0x21,0x08,0x21,0x08,0x3F,0xF8,0x21,0x0A,0x01,0x02,0x01,0x02,0x00,0xFE};codeunsignedchargong[32]={//工0x00,0x00,0x00,0x00,0x7F,0xFC,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0xFF,0xFE,0x00,0x00,0x00,0x00};codeunsignedcharcheng[32]={//程0x08,0x00,0x1D,0xFC,0xF1,0x04,0x11,0x04,0x11,0x04,0xFD,0xFC,0x10,0x00,0x30,0x00,0x39,0xFE,0x54,0x20,0x54,0x20,0x91,0xFC,0x10,0x20,0x10,0x20,0x13,0xFE,0x10,0x00};codeunsignedcharxie[32]={//系0x00,0xF8,0x3F,0x00,0x04,0x00,0x08,0x20,0x10,0x40,0x3F,0x80,0x01,0x00,0x06,0x10,0x18,0x08,0x7F,0xFC,0x01,0x04,0x09,0x20,0x11,0x10,0x21,0x08,0x45,0x04,0x02,0x00};codeunsignedcharzi[32]={//自0x01,0x00,0x02,0x00,0x04,0x00,0x1F,0xF0,0x10,0x10,0x10,0x10,0x10,0x10,0x1F,0xF0,0x10,0x10,0x10,0x10,0x1F,0xF0,0x10,0x10,0x10,0x10,0x10,0x10,0x1F,0xF0,0x10,0x10};codeunsignedchardong[32]={//动0x00,0x40,0x00,0x40,0x7C,0x40,0x00,0x40,0x01,0xFC,0x00,0x44,0xFE,0x44,0x20,0x44,0x20,0x44,0x20,0x84,0x48,0x84,0x44,0x84,0xFD,0x04,0x45,0x04,0x02,0x28,0x04,0x10};codeunsignedcharhua[32]={//化0x08,0x80,0x08,0x80,0x08,0x84,0x10,0x88,0x10,0x90,0x30,0xA0,0x30,0xC0,0x50,0x80,0x91,0x80,0x12,0x80,0x14,0x80,0x10,0x82,0x10,0x82,0x10,0x82,0x10,0x7E,0x10,0x00};codeunsignedcharyi[32]={//10x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x1F,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x1F,0xF8,0x00,0x00,0x00,0x00};/*"1",0*/codeunsignedcharlin[32]={//0 0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xF0,0x0C,0x18,0x18,0x0C,0x30,0x06,0x30,0x06,0x30,0x06,0x30,0x06,0x30,0x06,0x18,0x0C,0x0C,0x18,0x03,0xE0,0x00,0x00,0x00,0x00};/*"0",0*/codeunsignedcharling[32]={//0 0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xF0,0x0C,0x18,0x18,0x0C,0x30,0x06,0x30,0x06,0x30,0x06,0x30,0x06,0x30,0x06,0x18,0x0C,0x0C,0x18,0x03,0xE0,0x00,0x00,0x00,0x00};/*"0",0*/codeunsignedcharer[32]={//20x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xF0,0x18,0x18,0x38,0x1C,0x38,0x1C,0x00,0x38,0x00,0x70,0x01,0xC0,0x07,0x00,0x0C,0x04,0x3F,0xFC,0x3F,0xFC,0x00,0x00,0x00,0x00};codeunsignedcharban[32]={//班0x00,0x80,0x00,0x80,0xF8,0xBE,0x22,0x88,0x22,0x88,0x22,0x88,0x22,0x88,0xFA,0xBE,0x22,0x88,0x24,0x88,0x20,0x88,0x39,0x08,0xE1,0x08,0x42,0x3E,0x04,0x00,0x08,0x00};codeunsignedcharzhang[32]={//张0x01,0x00,0xF9,0x08,0x09,0x08,0x09,0x10,0x09,0x20,0x79,0x40,0x41,0x00,0x47,0xFE,0x41,0x40,0x79,0x20,0x09,0x20,0x09,0x10,0x09,0x08,0x09,0x44,0x51,0x82,0x21,0x00};codeunsignedcharpeng[32]={//鹏0x00,0x10,0x77,0x20,0x55,0x7C,0x55,0x44,0x55,0x64,0x77,0x54,0x55,0x44,0x55,0x4C,0x55,0x40,0x77,0x7E,0x55,0x02,0x55,0x02,0x55,0x7A,0xB5,0x02,0x89,0x0A,0x13,0x04};codeunsignedcharzhin[32]={//制0x04,0x04,0x24,0x04,0x24,0x04,0x3F,0xA4,0x44,0x24,0x04,0x24,0xFF,0xE4,0x04,0x24,0x04,0x24,0x3F,0xA4,0x24,0xA4,0x24,0xA4,0x26,0x84,0x25,0x04,0x04,0x14,0x04,0x08};codeunsignedcharzuo[32]={//作0x09,0x00,0x09,0x00,0x09,0x00,0x11,0xFE,0x12,0x80,0x32,0x80,0x34,0x80,0x50,0xF8,0x90,0x80,0x10,0x80,0x10,0x80,0x10,0xFC,0x10,0x80,0x10,0x80,0x10,0x80,0x10,0x80};codeunsignedcharduan[32]={//段0x06,0x00,0x38,0xF8,0x20,0x88,0x20,0x88,0x20,0x88,0x3C,0x86,0x21,0x00,0x20,0x00,0x3D,0xFC,0x20,0x84,0x20,0x88,0x2C,0x50,0xF0,0x20,0x20,0x50,0x20,0x88,0x23,0x06};codeunsignedcharjin[32]={//金0x01,0x00,0x01,0x00,0x02,0x80,0x04,0x40,0x08,0x20,0x10,0x10,0x2F,0xE8,0xC1,0x06,0x01,0x00,0x3F,0xF8,0x01,0x00,0x11,0x10,0x09,0x10,0x09,0x20,0xFF,0xFE,0x00,0x00};codeunsignedcharying[32]={//英0x08,0x20,0x08,0x20,0xFF,0xFE,0x08,0x20,0x01,0x00,0x01,0x00,0x1F,0xF0,0x11,0x10,0x11,0x10,0x11,0x10,0xFF,0xFE,0x02,0x80,0x04,0x40,0x08,0x20,0x30,0x18,0xC0,0x06};codeunsignedcharlao[32]={//老0x02,0x00,0x02,0x08,0x3F,0xD0,0x02,0x20,0x02,0x40,0xFF,0xFE,0x01,0x00,0x02,0x00,0x0C,0x10,0x18,0xE0,0x2F,0x00,0x48,0x08,0x88,0x08,0x08,0x08,0x07,0xF8,0x00,0x00};codeunsignedcharshi[32]={//师0x08,0x00,0x0B,0xFE,0x48,0x20,0x48,0x20,0x48,0x20,0x49,0xFC,0x49,0x24,0x49,0x24,0x49,0x24,0x49,0x24,0x49,0x24,0x09,0x34,0x11,0x28,0x10,0x20,0x20,0x20,0x40,0x20};codeunsignedcharzhi[32]={//指0x11,0x00,0x11,0x04,0x11,0x38,0x11,0xC0,0xFD,0x02,0x11,0x02,0x10,0xFE,0x14,0x00,0x19,0xFC,0x31,0x04,0xD1,0x04,0x11,0xFC,0x11,0x04,0x11,0x04,0x51,0xFC,0x21,0x04};codeunsignedchardao[32]={//导0x00,0x00,0x3F,0xF0,0x20,0x10,0x20,0x10,0x3F,0xF0,0x20,0x04,0x20,0x04,0x1F,0xFC,0x00,0x20,0x00,0x20,0xFF,0xFE,0x08,0x20,0x04,0x20,0x04,0x20,0x00,0xA0,0x00,0x40};voidmain(void)//主入口函数{ unsignedchari=0,j=0; for(i=0;i<32;i++) date[i]=xi[i];//将"西"复制到显示缓存 while(1) { display_time(2); //显示约2秒 displaymove(jing,27,10);//将从"京"开始的四个汉字从右向左移动 display_time(1); //等持约1秒 displaymovetb(1,0,10); //将点阵上显示的内容向下以10的速度移出,补上0,即清空显示屏 display_time(1); //等待1秒 displaymovetb(0,xi,10); //将"西"字以10的速度向上移动 displaymovetb(0,jing,10); //将"京"字以10的速度向上移动 displaymovetb(0,xue,10); //将"学"字以10的速度向上移动 displaymovetb(0,yuan,10); //将"院"字以10的速度向上移动 displaymovetb(0,ji,10); //将"机"字以10的速度向上移动 displaymovetb(0,dian,10); //将"电"字以10的速度向上移动 displaymovetb(0,gong,10); //将"工"字以10的速度向上移动 displaymovetb(0,cheng,10); //将"程"字以10的速度向上移动 displaymovetb(0,xie,10); //将"系"字以10的速度向上移动 displaymovetb(0,zi,10); //将"自"字以10的速度向上移动 displaymovetb(0,dong,10); //将"动"字以10的速度向上移动 displaymovetb(0,hua,10); //将"化"字以10的速度向上移动 displaymovetb(0,yi,10); //将"1"字以10的速度向上移动 displaymovetb(0,ling,10); //将"0"字以10的速度向上移动 displaymovetb(0,lin,10); //将"0"字以10的速度向上移动 displaymovetb(0,er,10); //将"2"字以10的速度向上移动 displaymovetb(0,ban,10); //将"班"字以10的速度向上移动 displaymovetb(0,zhang,10); //将"张"字以10的速度向上移动 displaymovetb(0,peng,10); //将"鹏"字以10的速度向上移动 displaymovetb(0,zhin,10); //将"制"字以10的速度向上移动 displaymovetb(0,zuo,10); //将"作"字以10的速度向上移动 displaymovetb(0,duan,10); //将"段"字以10的速度向上移动 displaymovetb(0,jin,10); //将"金"字以10的速度向上移动 displaymovetb(0,ying,10); //将"英"字以10的速度向上移动 displaymovetb(0,lao,10); //将"老"字以10的速度向上移动 displaymovetb(0,shi,10); //将"师"字以10的速度向上移动 displaymovetb(0,zhi,10); //将"指"字以10的速度向上移动 displaymovetb(0,dao,10); //将"导"字以10的速度向上移动 displaymovetb(0,0,10); //以10的速度向上清空 display_time(1); //等待1秒 displaymovetb(1,xi,10); //将"西"字以10的速度向下移动 }}voiddisplay()//显示{ unsignedchari,ia,j,tmp; //定义变量 DATE_OUT=0XFF; //置位高电平做准备 AB=0; //将行数据位清0,准备移位 for(i=0;i<16;i++){ //循环输出16行数据 SCK=0; //为行移位做准备 SCLT=0; //为列锁存做准备 for(ia=2;ia>0;){ //每行16个点,循环位移两个字节 ia--; //循环两次 tmp=~date[i*2+ia]; //读取点阵数据做输出,这里用到ia目的是先读取点阵数据的第二位字节,因一行16个点由两个字节组成, //电路中的移位存放器最后一位对应最后一列,所以要先输出一行中的第二个字节数据 for(j=0;j<8;j++){ //循环两次,每次移一个字节, SCLH=0; //为列移位做准备 DATA=tmp&0x01; //将数据低位做输出,由电路图可知,移位存放器的最后一位对应最后一列,因此先移最后一位 tmp>>=1; //将数据缓冲右移一位,为下次输出做准备 SCLH=1; //将DATA上的数据移入存放器 } //移入单字节结束 } //移入两个字节结束 DATE_OUT|=0X14; //此句可以用以下两句来理解,如果不将两句合为一句,将出现拖影现像 //SCK=1; //SCK拉高,行数据移位,相应行拉低,三极管导通输出电量到相应行点阵管阳极〔共阳〕 //SCLT=1; //SCLT拉高,将数据锁存输出到相应列的点阵发光管显示,显示一行后将保持到下一行显示开始 AB=1; //行数据位只在第一行时为0,其它时候都为1,当将这个0移入存放器后,从第一位开始一直移位最后一位, //移位的过程,AB就必需是1,这是因为不能同时有两个及两个以上0的出现,否那么显示出乱 } j=64; while(j--); //每一行的显示,保持了两字节的移位时间,因此,最后一行的显示,也要参加保持时间,补尝显示的亮度 SCK=0; // SCK=1; //将最后一行数据移出}voiddisplay_time(unsignedinttimer) //指定时间扫描显示{ unsignedcha

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论