资源描述
1 绪论
随着人们生活环境的不断改善和美化,在许多场合可以看到LED灯。在大型商场车站,地铁站以及各类办事窗口等越来越多的场所需要用LED点阵显示汉字或者图像。LED行业已成为一个快速发展的新兴产业,市场空间巨大,前景广阔。LED显示屏是利用发光二极管点阵模型或者像素单元组成平面的显示屏幕。不但拥有色彩丰富,组态灵活,能够适应室内外各种环境的特点,还具有发光效率高,使用寿命长的优势。LED显示屏经历了初期的不可更换显示内容,单色,双色的图文显示到如今的可随时更换显示内容,全彩色的视频显示,历经发展,LED显示屏得到了广泛的应用和发展。
1.1 LED点阵显示屏概述
目前,国内的LED点阵显示屏大部分是单显示,其显示的内容相对较少,显示花样较单一。一般在产品出厂时,显示内容就已经写入显示屏控制系统中的EPROM芯片中,当需要更换显示内容时就非常困难,这样使该类型的显示屏使用范围受到了限制。国内还有另一种LED显示屏——可编程序型LED显示屏,虽然增加了显示屏系统的编程能力,显示内容和显示花样都有所增加,但也存在着更换显示内容不便的缺点。随着社会经济的迅速发展,如今的广告牌都存在着显示内容丰富,信息量大,信息更换速度快的特点。因此传统的LED显示屏控制系统已经越来越不能满足现代社会的需要。而利用PC机通信技术控制LED显示屏,则具有显示内容丰富,信息更换更灵活等优点。LED点阵显示屏是通过PC机将要显示的汉字字模提取出来,并发送给单片机,然后显示在点阵屏上。单片机具有优异的性价比、体积小、可靠性高、控制功能强,广泛应用在智能仪表、机电一体化、实时过程控制、机器人、家用电器、模糊控制、通信系统等领域。
1.2 LED显示屏控制技术状况
LED汉字显示的控制系统主要有输入接口电路、信号控制、转换和数字化处理电路及其输出接口电路等,虽然包括的相关技术比较多,但关键技术是串行传输与并行传输技术、动态扫描和静态锁存技术等。
1.2.1 串行传输与并行传输技术
LED汉字显示屏的数据传输方式有串行和并行两种。,目前主要采用的是串行控制技术,即显示屏每个单元内部的不同驱动电路和各级联动单元之间,每个时钟只传送一位数据,此方式可有效减少显示单元的数据传输驱动元件,从而提高整个系统的可靠性和性价比。
1.2.2 动态扫描与静态锁存技术
LED汉字显示屏实现显示信息的刷新技术有动态扫描和静态锁存两种方式。安装在室内的显示屏一般宜采用动态扫描技术,也即是一行放光二极管共用一行驱动寄存器,根据共用一行驱动寄存器的发光二极管像素数目,可以分为1/4,1/16扫描等等。而安装在室外的显示屏大多使用静态锁存技术,也就是每一个发光一级管都对应一个驱动寄存器,这样就不需要分时工作,保证了每一个发光一级管的亮度占空比为100%。因为动态扫描法可以有效减少控制器的I/O口,应用广发,本毕业设计也采用动态扫描。
1.2.3 自动检测与远程控制控制技术
LED汉字显示屏的构成复杂,安装位置,供电、周围亮度、环境温度等条件都直接影响着显示屏的正常工作与否。所以,在LED汉字显示屏的控制系统中,不但需要对以上条件进行自动检测控制,还要实现能够远程对显示屏的亮度,色度,垂直位置,显示内容和工作方式的转换的控制。
2 总体方案论证及设计
本毕业设计要求利用单片机设计出LED汉字显示屏的控制系统,本设计由四个部分构成:LED点阵显示条屏(LED驱动模块)、译码驱动电路和移位寄存系统(数据存储模块)、单片机控制系统(PC机通信模块)。下面对各个模块的设计逐一进行论证比较。
2.1 LED驱动模块
方案一:采用静态锁存方式,每一个LED发光管的一端接至单片机的一个I/O口,另一端通过电阻连接到电源。此方案可以直接驱动LED,原理简单,驱动能力很强,LED的亮度也可以通过限流电阻进行适当的调节,非常方便,但此方案过于浪费单片机的I/O口,只适合适用于较小的系统。
方案二:采用动态扫描方式,通过三极管驱动并联在一起的LED发光管的一端(共阴或者共2端),LED发光管的另一脚连接通用I/O口,来控制LED亮灭。这种方法能同时驱动较多的LED,方式灵活,可以节省单片机的I/O口资源。
比较两种方案,本设计采用方案二。
2.2 数据存储模块
方案一:采用静态RAM存储需要显示的内容,尽管静态存储器具有存储内容大,传输速度快的优点,但是断电后,其存储的数据就会消失,所以不适合用于存储固定或者长时间不变的数据。
方案二:采用ROM存储需要显示的内容,ROM可以长时间的存储信息,并且掉电后数据不丢失,此种方案适合存储不变的数据。
方案三:采用串行EEPROM存储需要显示的内容。串行EEPROM技术几乎拥有了所有类型存储器的优点:不易丢失、可更新、高性价比、低功耗。普遍适合应用于各类工业测控系统。在速度要求不是很高的情况下,串行EEPROM(暂定使用24C256)是比较理想的选择。
以上方案,第三种方案有明显的优点,所以选择方案三。
2.3 本设计任务
综合以上技术选择的论述和LED的发展趋势,本设计将以AT89C51单片机为核心,采用串行传输、动态扫描技术、制作一款拥有PC机通信功能的,模块化LED多功能汉字显示屏。
2.4 总体硬件组成框图
3 系统硬件设计
为使该模块化LED显示屏显示屏控制系统具有更加方便的实用性和灵活性,需要对系统的各个硬件进行精心设计。其中硬件电路包括LED点阵显示条屏、译码驱动电路、移位寄存系统、单片机控制系统等。
3.1 LED点阵显示条屏的硬件设计
LED驱动模块是LED显示屏设计的关键部分,其驱动电路的设计合理与否直接关系到LED显示屏的亮度、稳定的重要指标。本设计中LED的驱动采用三极管和74LS154实现的。
3.1.1 74LS154的简单介绍
74LS154是一个4—16译码器,主要电特性的典型值如下:
tpd
Pd
ABCD->output
G1、G2->output
23ns
19ns
170mW
当选通端(G1、G2)均为低电平时,可将地址端(ABCD)的二进制编码在一个对应的输出端,以低电平译出。
若将 G1 和G2 中的一个作为数据输入端,由ABCD 对输出寻址,54/74154 还可作1 线-16 线数据分配器
真值表如下:
输入
输出
G1
G2
D
C
B
A
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
L
L
L
L
L
L
L
H
H
H
H
H
H
H
H
H
H
H
H
H
H
H
L
L
L
L
L
H
H
L
H
H
H
H
H
H
H
H
H
H
H
H
H
H
L
L
L
L
H
L
H
H
L
H
H
H
H
H
H
H
H
H
H
H
H
H
L
L
L
L
H
H
H
H
H
L
H
H
H
H
H
H
H
H
H
H
H
H
L
L
L
H
L
L
H
H
H
H
L
H
H
H
H
H
H
H
H
H
H
H
L
L
L
H
L
H
H
H
H
H
H
L
H
H
H
H
H
H
H
H
H
H
L
L
L
H
H
L
H
H
H
H
H
H
L
H
H
H
H
H
H
H
H
H
L
L
L
H
H
H
H
H
H
H
H
H
H
L
H
H
H
H
H
H
H
H
L
L
H
L
L
L
H
H
H
H
H
H
H
H
L
H
H
H
H
H
H
H
L
L
H
L
L
H
H
H
H
H
H
H
H
H
H
L
H
H
H
H
H
H
L
L
H
L
H
L
H
H
H
H
H
H
H
H
H
H
L
H
H
H
H
H
L
L
H
L
H
H
H
H
H
H
H
H
H
H
H
H
H
L
H
H
H
H
L
L
H
H
L
L
H
H
H
H
H
H
H
H
H
H
H
H
L
H
H
H
L
L
H
H
L
H
H
H
H
H
H
H
H
H
H
H
H
H
H
L
H
H
L
L
H
H
H
L
H
H
H
H
H
H
H
H
H
H
H
H
H
H
L
H
L
L
H
H
H
H
H
H
H
H
H
H
H
H
H
H
H
H
H
H
H
L
L
H
X
X
X
X
H
H
H
H
H
H
H
H
H
H
H
H
H
H
H
H
H
L
X
X
X
X
H
H
H
H
H
H
H
H
H
H
H
H
H
H
H
H
H
H
X
X
X
X
H
H
H
H
H
H
H
H
H
H
H
H
H
H
H
H
74LS154的真值表
3.1.2 驱动电路的设计
该系统的驱动电路由74LS154与三极管共同组成的,原理图如下:
如上图所示,首先采用AT89C51为本系统的单片机型号。其中,AT89C51是一种带4 kb闪烁可编程可擦除只读存储器(Falsh Programmable and Erasabl Read OnlyMemory FPEROM)的低电压、高性能CMOS型8位微处理器,俗称单片机。器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集、输出管脚相兼容。由于将多功能8位CPU和闪烁存储器组合在单个芯片中,能够进行1000次写/擦循环,数据保留时间为10年。
时钟电路由AT89C51的18,19脚的时钟端(XTALl及XTAL2)以及12 MHz晶振X1,电容C2,C3组成,采用片内振荡方式。
复位电路采用简易的上电复位电路,主要由电阻R1,R2,电容C1,开关K1组成,分别接至AT89C51的RST复位输入端。
LED的行扫描端接到单片机P0口,而列扫描接到三极管的发射极。其中列扫描端(B1—B8)用于LED的数据扫描,凭借74LS154的译码和三极管的驱动,使得LED能发光。(A1—A8)通过P0口提供给LED的显示数据。考虑到P0口必须设置上拉电阻,本设计采用4.7kΩ排电阻作为单片机的上拉电阻。
下图为AT89C51的引脚图:
3.2 数据存储电路的设计
本设计由串行的ROM 24C256组成数据存储电路。其中,24C256是一款1—256K位的支持I2C总线数据传送协议,可以用电擦拭,可编程自定时写周期的串行CMOS EEPROM。此芯片有两种写入方式,一种是字节写入方式,另一种是页写入方式。此芯片允许在一个写周期内进行对一个字节到一页的若干个字节的编程写入。
24C256的引脚排列和各个引脚的功能如下图和下表:
引脚名称
功用
A0 A1 A2
器件地址选择
SDA
串行数据/地址
SCL
串行时钟
WAP
写保护
Vcc
1.8V到6.0V电源
Vss
接地
数据存储器24C256的接口设计原理图如下图所示:
该存储电路只由24C256芯片组成,SCL为串行时钟引脚,用来产生器件所有数据发送或接受的时钟。SDA是串行数据/地址,这是一个双向的传输端,功能是接收或者发送所有的数据以及传送地址。LED显示器的控制系统工作时,单片机89C51依靠SDA引脚与SCL引脚读取24C256中存储的内容,并在LED显示屏上显示出来。当然也可以通过PC机(上位机)将已经编辑好的数据内容下载到24C256的芯片内。
3.3 PC机(上位机)通信模块的设计
LED显示屏和电脑的通讯方式采用了标准RS232接口,电路原理图如下图所示:
通讯方式为10位的异步通讯。RS232接口实际上是一种串行通信标准,是由美国EIA(电子工业联合会)和BELL 公司一起开发的通讯协议,它对信号线的功能、电气特性、连接器等都有明确的规定。由于RS-232接口的EIA是用正负电平表示逻辑关系的(-3V—-15V为1、+3V—+15V为0)。与TTL以高低电平表示逻辑关系不同,因此,为了能够和计算机接口通信,必须在EIA电平和TTL电平之间进行电平转换。MAX232芯片可完成TTL-EIA电平转换,且只用单一+5V电源,因此得到广泛应用。由于采用的是标准RS232接口,所以传输距离不能很远,当传输距离超过15M,就要采用422或485接口,则只要加上一块RS232转422/485电路模块就可以了。
3.4 LED显示屏的选择
LED显示屏模块技术指标参数表如下表所示:
规格(mm)
φ5
显示像素/平米
17300
模块
1R1YG(绿红)
显示屏
像素点数
64*16=1024
尺寸(mm)
480*120
面积(㎡)
0.576
最大功耗(瓦/平方米)
100(单)/200(双)
扫描速度
大于75Hz
视角
水平视觉160℃,垂直视觉160℃
环境要求
-20℃—60℃
供电要求
220VAC±10% 50Hz
驱动方式
1/16扫描
使用寿命
10万小时
4 系统的软件设计
软件也是LED汉字显示屏控制系统的重要组成部分。在系统的软件设计中,我同样采用模块化的设计,将系统的各个部分编写出子模块的形式,通过这样的方式,可以增加系统软件的可移植性和可读性。
4.1 下位机软件流程
本系统的下位机(单片机89C51)主要作用是用来实现LED汉字显示屏上字样的移位、显示和数据的读取等等功能。所以主程序的流程图如下:
4.2 上位机软件
本系统的上位机软件主要是编辑LED显示屏显示的内容,在设计中采用Visual Basic语言LED显示屏控制系统的内容下载软件。
4.2.1 Visual Basic 中串口通讯的应用
现在大量的智能仪器或数据采集模块都采用了RS—232或485通讯接口,通过相应的通讯协议,将测试、采集的数据传输给上位机,以满足各种形式的数据处理的要。VisualBasic6.0(以下简VB)是许多工程技术人员熟悉和常用的应用程序开发软件,VB以其简单易学、32位面向对象的程序设计等特点,倍受广大计算机开发者的青睐,已广泛地应用于各个领域;如何用VB编写数据通讯程序,并进行数据处理,意义重大。 用VB开发串口通讯一般有两种方法:一是采用VB自身的标准控件Mscomm来实现;另一种是利用windows的通讯API函数。
4.2.2 通讯基础知识
一般来说,计算机都有一个或多个串行端口,它们依次为com1、com2、…,这些串口还提供了外部设备与PC进行数据传输和通信的通道。这些串口在CPU和外设之间充当解释器的角色。当字符数据从CPU发送给外设时,这些字符数据将被转换成串行比特流数据;当接收数据时,比特流数据被转换为字符数据传递给CPU,再进一步说,在操作系统方面,Windows用通信驱动程序(COMM.DRV)调用API函数发送和接收数据,当用通信控件或声明调用API函数时,他们由COMM. DRV解释并传递给设备驱动程序,作为一个VB程序员,要编写通信程序.只需知道通信控件提供给Windows通信API函数的接口即可.换句话说,只需设定和监视通信控件的属性和事件即可。
4.2.3 数据的发送
VB发送数据有两种:一、发送字符数据;二、发送二进制数据。
1.发送字符数据
在通讯中以单字符方式逐个发送数据时,每一个数据范围是:0—128。如发送58给单片机则可以这样表示:
Mscomm1.Output=Chr(50) ‘发送数据(16进制)
在通讯中以多字符方式发送数据时,发送的是Ascii码值。如发送“LED显
示屏”则可以这样表示:
Dim data as String ‘定义发送数据变量
data=” LED显示屏” ‘给变量赋值
Mscomm1.Output=data ‘发送数据
2.发送二进制数据
以发送字符方式时,发送的数据范围只能是:0—128,而单片机经常处理的数据范围是0—255,那么怎么样发送大于128的数据呢?方法是采用二进制方式发送数据。首先定义一个二进制类型的数组,然后把要发送的数值赋给二进制数组,再通过Mscomm发送。如发送数值220的具体过程如下:
Dim data(0) as byte ‘定义发送数据数组
Data(0)=220 ‘给数组赋值
Mscomm1.output=data(0) ‘发送数据
4.2.4 数据的接收
接收数据有两种方式,一、以文本方式接收(InputMode=0);二、以二进制
方式接收(InputMode=1)。
1.以文本方式接收数据
在InputMode=0的模式下,是以文本方式接收数据,在接收数据之前,我们
必须先定义一个字符串变量,用以接收数据缓冲区里的数据,具体过程如下:
Dim receive As String * 1 ‘定义接收数据变量
Select Case MSComm1.CommEvent ‘判断事件类型
Case comEvReceive ‘事件类型为接收数据
receive = MSComm1.Input ‘接收数据
End Select
2.以二进制方式接收数据
在InputMode=1的模式下,是以二进制方式接收数据,在接收数据之前,我们必须先义一个二进制类型的数组,用以接收数据缓冲区里的数据,过程如下:
Dim receive(n) As Byte ‘定义接收数据变量
Select Case MSComm1.CommEvent ‘判断事件类型
Case comEvReceive ‘事件类型为接收数据
Mscomm1.InputMode=1 ‘接收方式为二进制方式
For k=0 to n
Receive(k) = MSComm1.Input ‘接收数据
Next k
End Select
4.3 编程思想
要实现LED汉字显示屏的动态滚动显示效果,其实就是以固定的合适周期,显示一幅幅不同内容的屏幕画面。所以在软件设计上,只需按照一定的时间间隔改变存储于显示缓冲区的信息内容。比如左移的动态效果,就是让显示缓冲区的点阵数据向左移动一列,由于显示缓冲区的所有数据左移一列需要一定的时间,不可能在两次中断间隔时间内实现这一处理过程,鉴于此,就需要设置两个显示缓冲区,一个用于保存当前屏幕正在显示的信息数据,另一个则用来对当前的信息数据进行处理。在到达换屏时间间隔后,切换当前显示缓冲区到数据已经处理的显示缓冲区,然后再对另一显示缓冲区进行数据处理,以此循环下去。要保证动态显示的正常,符合人们的视觉习惯,最根本的问题是如何分配刷新显示屏的定时时间与两个显示缓冲区数据显示、处理的替换。为了二者的处理时间不相互冲突,本设计采用的方法是使显示缓冲区的数据处理在多次多次定时中断程序执行之间的时间间隔内进行并完成。
数据处理时间=(定时中断时间-传输数据时间)×中断次数
这样,只要合理的设定中断次数就能保证刷新屏幕间隔时间内显示缓冲区有足够的时间处理数据。
4.4 字模处理
从字节长度看,汉字占两个字节(Byte),数字只占一个字节,那么:汉字字模为16*16个点),ASCII码字符的字模为8*16个点。这样字模的长度不同,处理起来就会有困难。为此,本设计采用这种字模处理方法:把汉字拆成两半,这样就与英文字母和阿拉伯数字的字模统一起来。字模的存储是按顺次存储在数据存储区里,如‘苏’字的字模在数据存储区里是这样存放的:
uchar code tab[32]={ 08H,20H,08H,24H,0FFH,0FEH,08H,20H
0AH,20H,02H,10H,3FH,0F8H,02H,10H
02H,10H,22H,18H,24H,16H,44H,12H
08H,10H,10H,10H,20H,50H,40H,20H }
但是仅仅依靠人工方法获取汉字代码是会很繁琐。所以,我检索了互联网,找到了一款功能十分强大的汉字字库提取程序,软件打开后,在指定地方输入汉字,点“生成”,十六进制数据的汉字代码即可自动生成。甚至可以输入多个汉字以及选择动态显示方式,截图如下:
4.5 动态效果的实现
本文设计的LED点阵显示屏可以实现左移、掉下、上升三种显示方式。其中只有左移方式可以实现多于一屏内容的显示,其它的显示方式只能显示一屏的内容。显示方式设置由微机控制,微机在传送点阵字模数据时,先显示方式,再传送点阵数据。显示过程由单片机定时中断程序控制,每定时中断一次点亮一行,定时中断时间为0.8ms,每中断16次,即可对整个显示屏扫描一次,完成一屏信息的刷新,每秒显示画面数达78屏,可保证画面无闪烁感。编程采用的是C言语,应用C51编程具有以下优点:
① C51管理内部寄存器和存储器的分配,编程时,无需考虑不同存储器的
寻址和数据类型等细节问题。
② 程序由若干函数组成,具有良好的模块结构。
③ 有丰富的子程序库可直接引用,从而大大减少用户编程的工作量。
④ C言语和汇编言语可以交叉使用,汇编言语程序代码短、运行速度快,但复杂运算编耗时。用汇编言语编写与硬件有关的部分,用C言语编写与硬件无关的运算部分程序,充分发挥两种言语的长处,提高开发效率。
4.5.1 左移效果
在显示条屏较小的情况下,为了显示更多的信息内容,普遍采用的方法是移位显示,按照人们的日常习惯,本设计选择左移的动态效果,它的特点是不仅仅局限于显示屏幕的大小、显示效果好,编程简单。下面,用16*64的条型显示屏的左移方式为例,说明左移动态效果的实现方法:
屏幕的数据大小为128个字节,所以要先在数据存储区里开辟一个256个字节的显示缓冲区(分为两个显存),其中一个用以保存当前需要显示的信息内容,而另一个用来处理数据。要实现左移的动态效果,原理很简单,其实就是每隔一段时间,向显示缓冲区里加入一列数据。具体做法是:第一个字节左移一位,保存于变量A中,第二个字节右移7位(一个字节是8位),保存于变量B中,A和B逻辑或运算,结果保存于A中,这样就完成了第一个字节的数据处理。一行有8个字节的数据需要处理,所以要设8此循环,如此循环8次后,便完成了一行的数据处理。同时,每个字有16行,因此我们需要在8次循环里再设计一个16次的外循环,至此,整个屏幕的数据就都处理完了。再启动更新信号,交换显示存储区,显示程序就显示刚才处理好了的内容,接着,单片机再对另一显示存储区的数据进行处理,处理完成后再交换显示。如此这样,就能实现左移的动态效果。程序流程图如下图所示:
具体源程序如下:
void rtol(void)
{
uchar a,b,i,k,u,n;
while(1)
{
//--------- //判断内容改变没有?
if(change==1)break;
//---------
for(n=0;n<leng;n++) //一共有length个字(8*16)
{
//--------- //判断内容改变没有?
if(change==1)break;
//---------
for(i=0;i<8;i++) //一边字有8位,要移8次
{
//--------- //判断内容改变没有?
if(change==1)break;
//---------
if(choose==1) //处理显存1区
{
addr2=0;
}
else //处理显存2区
{
addr2=256;
}
//---------
for(k=0;k<16;k++) //一屏要处理16个字(8*16)
{
for(u=0;u<16;u++) //一个字要处理16个字节
{
num=512+u+k*16+n*16;
a=*num<<i;
num=512+u+k*16+16+n*16;
b=*num>>8-i;
a|=b;
dispd=addr2+u+k*16;
*dispd=a; //保存数据
}
}
while(jh==0);
jh=0; //关交换信号
choose=~choose;
}
}
}
}
4.5.2 上升效果编程
本系统实现的上升效果具体是:内容从显示屏底部缓慢地上升,整行字出现后,会定格一段时间,让人们看清楚显示的内容,接着闪烁三下,提醒正在显示的内容即将退出,然后内容开始上移,直到消失,这样,就完成了一次完整显示过程。
具体实现的方法是:设定一个16次循环,在第一次循环中,显存只取显示内容的第一行数据,放到显存的末行,即第16行。在第二次循环中,显存读取显示内容的第一和第二行数据,同时,第一行数据放入显存的第15行,第二行数据放入显存的第16行,如此循环16次,直到全部显示内容显示出来。设定程序,显示内容闪烁三次。接着退出的方法差不多。区别仅是每次取的行数不一样。程序流程图如下:
具体源程序如下:
void rise(void)
{
uchar i;
uint k,g,t,m;
//--------------
deal(); //显示前把数据重新排列
//--------------
while(1)
{
//--------- //判断内容改变没有?
if(change==1)break;
//---------
for(t=0;t<2;t++) //入、出共两次
{
//--------- //判断内容改变没有?
if(change==1)break;
//---------
if(t==0)g=1024; //入的首地址
if(t==1)g=1280; //出的首地址
//---------------
for(i=0;i<=16;i++) //出完有16行
{
//--------- //判断内容改变没有?
if(change==1)break;
//---------
if(choose==1) //处理显存1区
{
addr2=0;
}
else //处理显存2区
{
addr2=256;
}
//---------
for(k=0;k<256;k++) //一屏有256个字节
{
dispd=addr2+k;
num=g+k;
*dispd=*num;
}
g+=16; //指向上一行数据
while(jh==0);
jh=0; //关交换信号
choose=~choose;
}
//---------------------- 定一会
for(i=0;i<25;i++)
{
//--------- //判断内容改变没有?
if(change==1)break;
//---------
while(jh==0);
jh=0;
}
if(t==0)
{
//--------- //判断内容改变没有?
if(change==1)break;
//---------------------- 闪3下
TR0=0;
p34=1;
p35=1;
for(m=0;m<34000;m++);
TR0=1;
//--------- //判断内容改变没有?
if(change==1)break;
//---------
for(m=0;m<35000;m++);
TR0=0;
p34=1;
p35=1;
//--------- //判断内容改变没有?
if(change==1)break;
//---------
for(m=0;m<34000;m++);
TR0=1;
//--------- //判断内容改变没有?
if(change==1)break;
//---------
for(m=0;m<35000;m++);
TR0=0;
p34=1;
p35=1;
//--------- //判断内容改变没有?
if(change==1)break;
//---------
for(m=0;m<34000;m++);
TR0=1;
//--------- //判断内容改变没有?
if(change==1)break;
//---------
for(m=0;m<35000;m++);
}
}
4.5.3 掉下效果编程
掉下的动态效果的实现与上升的编程思想差不多,也是设定一个16次的循环,在第一次的循环中,只读取显示内容的最后一行数据,放到显存的第一行里。在第二次循环中,读取显示内容的第15和第16行数据,并依次放入显存的第1和第2行。如此循环16次,整屏幕的数据都显示出来。退出同理。不再复述。程序流程图如下:
具体源程序如下:
void drop(void)
{
uchar i;
uint k,g,t,m;
//--------------
deal(); //显示前把数据重新排列
//--------------
while(1)
{
//--------- //判断内容改变没有?
if(change==1)break;
//---------
for(t=0;t<2;t++) //入、出共两次
{
//--------- //判断内容改变没有?
if(change==1)break;
//---------
if(t==0)g=1536; //入的首地址
if(t==1)g=1280; //出的首地址
//---------------
for(i=0;i<=16;i++) //出完有16行
{
//--------- //判断内容改变没有?
if(change==1)break;
//---------
if(choose==1) //处理显存1区
{
addr2=0;
}
else //处理显存2区
{
addr2=256;
}
//---------
for(k=0;k<256;k++) //一屏有256个字节
{
dispd=addr2+k;
num=g+k;
*dispd=*num;
}
g-=16; //指向上一行数据
while(jh==0);
jh=0; //关交换信号
choose=~choose;
}
//---------------------- 定一阵
for(i=0;i<25;i++)
{
//--------- //判断内容改变没有?
if(change==1)break;
//---------
while(jh==0);
jh=0;
}
if(t==0)
{
//--------- //判断内容改变没有?
if(change==1)break;
//---------------------- 闪3下
TR0=0;
p34=1;
p35=1;
for(m=0;m<34000;m++);
TR0=1;
//--------- //判断内容改变没有?
if(change==1)break;
//---------
for(m=0;m<35000;m++);
TR0=0;
p34=1;
p35=1;
//--------- //判断内容改变没有?
if(change==1)break;
//---------
for(m=0;m<34000;m++);
TR0=1;
//--------- //判断内容改变没有?
if(change==1)break;
//---------
for(m=0;m<35000;m++);
TR0=0;
p34=1;
p35=1;
//--------- //判断内容改变没有?
if(change==1)break;
//---------
for(m=0;m<34000;m++);
TR0=1;
//--------- //判断内容改变没有?
if(change==1)break;
//---------
for(m=0;m<35000;m++);
}
}
}
4.6 上位机串口通信软件
4.6.1 界面设计
新建一个窗体From1,添加以下主要控件:
1、ProgressBar1
2、Commad1、Commad2
3、Frame1
4、Combo1
5、Text1
软件界面如下图:
4.6.2 程序编写
首先对8051串口进行初始化,与上位机通讯接收数据,判断数据是否接收完,如果没有继续接收,如果接收完则计算地址偏移量然后从字库中取字,最后固定显示并移动。传输函数编程流程图如下图所示
源程序如下:
Public Sub port(contton As String, msg As Byte, way As Integer)
'-------------------------
Dim counter As Integer '进度条
Dim x As Long '保存字的位置
Dim num As Integer '计算字的个数
Dim data As String * 4 '接收数据
Dim se(0) As Byte
If contton = "" Then
MsgBox "没有输入要显示的内容,请输入!"
Exit Sub
Else
num = Len(contton)
'-------------------------- 校对有没有字库里没有的字符?
For k = 1 To num
x = Asc(Mid(contton, k, 1))
If (x < -24158) Or (x > -23617 And x < -20319) Or (x > -2050 And x < 32
展开阅读全文