嵌入式开发 > 详情

用AT89C51控制活动字符显示屏

字符和图形的显示,在各种智能设备或系统中是常常用到的,如实现人机对话的功能菜单提示液晶屏,或是以输出文字信息为主要功能的大型LED广告屏等。本文通过利用LED点阵模块实现活动字符显示的控制电路,向大家介绍单片机片内RAM的使用、累加器循环移位等字符的字模设计原理指令。
一、电路功能及显示内容
本电路由AT89C51通过P0口和P2口与由VD1-1至VD8-8等64只发光二极管组成的显示点阵模块相连接而组成,通过相应的行列电位控制,上电后,使点阵模块依次显示出“OK”、“ST”、“JC”和“之二”字样,并周而复始地循环。
二、电路原理
整个电路由AT89C51、显示模块及驱动三极管VT1至VT8等构成,电路原理见图1。
图1虚线内VD1-1至VD8-8共64只发光二极管构成了显示字符的点阵模块,这种模块是专门用于LED显示屏的。型号是TOM-2088BE-B,这种点阵模块有16条引脚。点阵模块正面点阵布局如图2所示,背面引脚排列如图3所示。在图1中,虚线外边与IC1相连接的行列线所标序号为模块引脚号。整个显示点阵连接成行列控制的形式,8条行线分别与P0口的8条I/O线相连接,8条列线分别与受P2口8条口线控制的8只驱动三极管相连接。这样,当我们向P2口送入一个控制字#80H,P2.7呈高电位,而P2.6至P2.0皆呈低电位,因此,P2.7的高电位通过R17使VT1导通,VD1-1至VD1-8的8只发光二极管的负极皆与地相接,这就为VD1-1至VD1-8组成的第1列发光二极管的导通提供了使能条件。此时我们再向P0口送入字模数据,相应的二极管就被点亮,点阵像素就会被显示出来。比如我们向P0口送入数据#7EH,VD1-2至VD1-7就被点亮。模块最左边一列呈现的图形如图2中左边第1列所示。如果我们将P2口的高电位依次向右循环移动,VT1至VT8就会依次导通,使能条件就会从第1列依次转换至第8列。在VT1至VT8导通时我们依次向P0口送入数据#7EH、#42H、#7EH、#00H、#FFH、#28H、#44H、#82H,点阵模块显示的图形则如图2所示,即呈现出字符“OK”,这就实现了字符的显示。VT1至VT8依次导通,使第1列至第8列的二极管依次得到发光使能条件的过程,就是通常所说的扫描。由于点阵模块中的发光二极管发光不存在余辉,断电就会熄灭,如果不进行这种扫描,要么只能显示1列像素,要么就使几列或所有列都显示相同的像素。所以,只有不断地通过P0口送出字符或图形的点阵数据,再在P2口的控制下使各列依次显示一定的时间,才能使模块将整幅图形的像素完整地显示出来。因此,只有系统周而复始地扫描,才会使点阵模块显示出稳定的字符与图形。
三、片内RAM的使用及字符活动原理
由于本系统要显示的字符是活动的,所有字符的数据在存储空间的位置顺序是要不断变化的。因此,仅将要显示的点阵数据存在程序存储区是无法进行变化处理的,因为程序存储器是只读存储器,在应用系统中是无法改写的,而单片机内的RAM,是可读可写的静态存储器,存取时间极短,专门存放需频繁改写处理的数据,所以,只有将本系统要显示的活动字符的所有点阵代码存放在片内RAM中,在程序的控制下,根据当前显示的需要,进行相应的变化处理,再通过P0口送出,才能使点阵模块中显示的字符活动起来。
我们讲过,AT89C51片内有128字节RAM,地址空间为00H至7FH。其中00H至2FH具有特殊功能,所以我们可以将要显示字符的字模数据从30H开始存放。如图4所示,“OK”、“ST”、“JC”和“之二”字模数据共56个字节,我们把它存储在30H至67H单元之内。在图4中,数据为“1”的位被涂色,为“0”的位为空白,要显示的字符图形与字模数据的对应关系就被清楚地表示出来。在前述的扫描过程中,当扫描第一列,也就是向P2口送出控制字#80H,P2.7呈高电位时,CPU将RAM中67H单元内的内容送至P0口,于是,67H中字模数据的含义就在LED点阵模块的最左一列被以亮暗不同的点表达出来,完成字模数据与图像的对应转换。之后,P2.7的高电位向P2.0逐步移动,依次扫描,CPU便将RAM区66H至60H中的内容依次通过P0口送至点阵模块的第2列至第8列显示出来。至此,一帧完整的图形显示即告完成。然后可重返67H取字模数据进行下一帧扫描。由于67H至60H中数据的每一位与点阵模块中的VD1-1至VD8-8是一一对应的,因此,67H至60H的这8个存储单元即为字符显示缓存区。在RAM内30H至67H的整个数据块中,只有处在60H至67H之间的数据才会被送到点阵模块中显示出来。如果显示点阵好比电影的屏幕,整个数据块就是胶片。30H至67H这个区间就是电影放映机的镜头,所有的数据只有到达这个区间,也就是显示缓存区以后,其代表的图形信息才会在点阵模块中“放映”出来。因此,若想将“OK”以后的“ST”、“JC”、“之二”等字符显示出来,只要将自5FH至30H内的数据逐字节向上移动即可实现。具体过程是,首先将67H的内容送至68H之中,空出67H单元,以后将下面的字节逐个上移,直至移动56个字节,30H中的内容就被移到了31H之中,至此整个数据块上移了一个地址空间,点阵模块中的字形“OK”也便左移了一列,字符开始“活动”起来。当整个数据块上移一个地址空间之后,必须将移至68H中的数据再移至30H,因为,只有这样才能保证整个字模数据不至于在以后的移动中因被覆盖而丢失,才能保证数据块的完整和连续性。如此,不断地重复上述数据上移过程,整个数据块就会连续地通过60H至67H组成的显示缓存区,所有的字符就会在点阵模块中滚动经过,这就实现了字符的移动显示。
四、程序设计及主要指令
本例程序的设计思路是:上电后,首先向P0口和P2口送#00H,关闭显示完成初始化。然后调入所有字符的字模数据,进行扫描显示。连续扫描0.5s以后,将数据块上移一字节,再返回扫描程序和数据块移动程序,周而复始。连续扫描时间在主程序中设定。
1.字模数据的调入及查表指令
利用查表指令构成查表子程序,可以使字模数据从程序存储器调入片内RAM的程序更简短,并可以使字模数据在程序存储空间中集中存放。
由前述可知,全部字模数据为56个字节,如果用普通的数据传送指令MOV direct,#data,每送1字节数据需3个字节的程序代码才能完成。比如将“OK”字形的第1列字模数据#7EH送入片内RAM的67H空间,指令是MOV 67H,#7EH;机器码是75677EH,这样,传送完56个字节的字模数据的程序需168个字节的程序代码,占用空间较大。而用查表指令来完成上述56个字节的字模数据的调入,所有程序代码只用76个字节就完成了,比利用一般数据传输指令少用了92个字节,既节约了程序存储空间,又使程序设计变得简单。
查表指令MOVC A,@A+PC,机器代码是83H。执行结果是将累加器A中的内容与程序地址寄存器PC中的值相加得到一个被查找的程序存储空间的单元地址(数据表格的地址),然后将该单元的内容送入累加器A中,其中PC是用来存放下一条指令的地址。例如,如果我们先将立即数#01H存入RAM的69H单元中,当执行完程序存储器中地址为0078H处的MOV A,69H指令后,累加器A中的值就是#01H,若数据表格的起始地址是007CH,则执行完下一条MOVC A,@A+PC指令后,就将007CH中的字模数据#7EH送到了累加器A中。因为当执行完0078H处的MOV A,69H指令后,CPU的程序地址寄存器PC中的值为#007AH,CPU便直接到007AH中去取程序代码来识别执行。由于安放在007AH中的指令是一条专用的变址查表指令,执行后,PC中的值不但会自动加1,变成#007BH,而且还会将A中的值与PC中的值相加得到一个地址,指向所取数据的存储单元。由于A中的值是#01H,所以,CPU就会到007C中将立即数#7EH取出存于A中,然后再执行007BH处的指令。上述也是查表子程序的执行过程。从查表子程序返回主程序后,在主程序的控制下,将A中的字模数据再存于片内RAM的67H之中。由上述不难理解,我们每取一次数之后将69H中的内容加1,这样,不断地调用查表子程序,CPU就会将字模数据表中的所有字模数据逐字节调到片内RAM之中。
2.扫描程序及累加器循环移位指令
扫描程序能使单片机在向P0口送出数据之后,不断改变P2口各口线的高低电位,使VT1至VT8依次导通,完成整幅字符或图形的显示。而利用累加器循环移位指令来实现P2口各口线的电位改变是最为简捷的办法。
根据如前所述的扫描显示过程,我们采用累加器循环移位指令来完成P2口中的高电位移动是极其方便的。累加器A是单片机中使用最频繁的具有特殊功能的寄存器。RR A指令能使A中的内容向右循环移位,该指令代码是03H。执行该指令的结果是(An+1)→(An),(A0)→(A7)。如图5所示。假如在A中装入的数据为#80H,也就是1000 0000B,执行RR A后,A中的数据则是#40H,也就是0100 0000B,所有数据皆向右移动了一位,而原来的最低位则转移到最高位,其中唯一的一位高电位也便右移了一位。因此,要使P2口仅有一条口线呈高电位,并向右循环移动,首先执行MOV A #80H,再执行MOV P2,A,将#80H送入P2口,然后执行RR A完成一次循环,再执行MOV P2,A,将循环后的控制字送至P2口即可。向A中装入立即数#80H,经过8次上述操作过程,P2口自P2.7至P2.0就会依次呈现高电位,完成前述的扫描任务。
3.数据块移动程序及寄存器间接寻址数据传送指令
数据块移动程序能使片内RAM中的字模数据块整体向上移动,当主程序持续运行,就会使所有的字模数据从RAM的60H至67H之间通过,使系统显示的字符以“拉幕”的形式在点阵模块中依次显示出来。
我们先分别向R0和R1中送入立即数#68H和#67H,再执行MOV A,@R1和MOV @R0,A,这是两条寄存器间接寻址数据传送指令。其结果是先将以R1中的内容为地址的存储单元内的数据送入累加器A,再将A中的内容送入以R0中的内容为地址的存储单元内,这就将片内RAM 67H中的字模数据送到了68H之中。然后将R0和R1中的内容减1,使R0中的内容变为#67H,使R1中的内容变为#66H,重复前面的过程,又将66H中的字模数据送到了67H之中了。依次类推,将上述过程重复56次,片内RAM 30H中的字模数据就被送到了31H之中,至此,整个字模数据块便整体向上移动了一个地址空间。之后,还必须执行MOV 30H,68H,将68H中的字模数据送入30H之中,实现字模数据块的首尾相接。
4.短转移指令
为了实现连续滚动显示,当完成调入字模数据、扫描显示和数据上移之后,需要CPU再返回扫描显示处循环执行扫描和数据块上移的程序,所以在数据块移动程序的最后还要安放一条短转移指令SJMP(指令的机器码是80H)。执行此指令后,程序就转移至扫描程序的入口处,开始又一次的扫描和数据块上移操作。例如:SJMP 0051H,即程序转移至程序存储器中地址为0051H处,执行该处程序。指令SJMP rel的转移范围为-128至+127。
五、本文涉及的其他指令
算术操作类指令:
INC Rn:执行结果是将寄存器Rn中的内容加1。
DEC Rn:执行结果是将寄存器Rn中的内容减1。
六、程序清单

地址

机器码

指令

注释

0000

02003B

AJMP

003BH

;转至主程序

003B

758000

MOV

P0,#00H

;初始化

003E

75A000

MOV

P2,#00H

;关闭显示

0041

7938

MOV

R1,#38H

;调入字模数据

0043

7867

MOV

R0,#67H

;设字模存放起始地址

0045

756901

MOV

69H,#01H

;送字模数据表起始地址

0048

120078

LCALL

0078H

;调查表子程序

004B

F6

MOV

@R0,A

;字模送入RAM

004C

18

DEC

R0

004D

0569

INC

69H

004F

D9F7

DJNZ

R1

;未完,返回

0051

7D18

MOV

R5,#18H

;置扫描时间常数

0053

7EFF

MOV

R6, #FFH

0055

7F08

MOV

R7,#08H

;置扫描列数

0057

7860

MOV

R0,#60H

;设显示缓冲区低地址

0059

7480

MOV

A, #80H

;送列扫描起始控制字

005B

8680

MOV

P0,@R0

;字模数据输出至显示屏

005D

F5A0

MOV

P2,A

;输出列控制字至显示屏

005F

08

INC

R0

;准备字模的下一字节

0060

03

RR

A

;准备扫描下一列

0061

DFF8

DJNZ

JNZ

;未完返回

0063

DEF0

DJNZ

R6

0065

DDEC

DJNZ

R5

0067

7F38

MOV

R7,#38H

;置字模数据移动总字节数

0069

7868

MOV

R0,#68H

;设块移动暂存单元地址

006B

7967

MOV

R1,#67H

;设移动块超始地址

006D

E7

MOV

A,@R1

006E

F6

MOV

@R0,A

;向上移动一个地址

006F

18

DEC

R0

;转向下一个字节

0070

19

DEC

R1

0071

DFFA

DJNZ

R7

;不足56个字节继续移动

0073

856830

MOV

30H,68H

;首尾相接

0076

80D9

SJMP

0051H

;跳转至0051H

0078

E569

MOV

A,69H

;取查表增址值

007A

83

MOVC

A,@A+PC

;取字模数据

007B

22

RET

;子程序返回

007C

7E 42

7E 00

FF 28 44

82 字模数据表

00 00

4C 92

92 92 64

00

00 06

02 FE

FE 02 06

00

00 00

04 85

FD 04 00

00

7C FE

82 82

82 46 00

00

40 44

A4 A5

96 8C 84

80

00 20

24 24

24 24 24

20




『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
什么是总线压限