基于单片机的16 16LED点阵显示屏的设计

更新时间:2023-04-11 08:13:01 阅读量: 实用文档 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

基于单片机的16*16LED点阵显示屏的设计

随着单片机在各个领域的广泛应用,许多用单片机作控制驱动LED显示屏也应运产生。本系统设计使用单片机MCS-51控制扫描方法实现LED点阵显示器的字符的显示,介绍了用单片机进行显示系统开发的方法,单片机软件、硬件调试技术,还有点阵显示驱动扩展的一般方法。

1.引言

1.1 研究的目的、意义

LED因其体积小,耗电量低,亮度及环保等优点而被广泛应用于公共场所的大屏显示上,LED点阵大屏可应用于户外广告,交通导航,大厅公告,比赛的多媒体实时显示等领域。本设计作品的用途正是在于实现大屏显示的核心功能,即汉字的显示,可实际应用于简单的显示系统中,如简单的排队叫号显示屏,电梯显示屏等。通过此次设计将单片机软硬件结合起来对程序进行编辑,校验,锻炼实践能力和理论联系实际的能力。

1.2 本设计所要做的工作

为了完成该设计实现,经过考虑论证,决定分为以下几个阶段进行:

(1)对课题进行全面的分析,明确系统要实现的功能,大致了解要解决的问题,制定总的设计方案;

(2)根据论证设计硬件系统并画出电路图,并根据电路图制电路板;

(3)在硬件的基础上设计软件程序;

(4)利用仿真器编译软件程序,进行调试仿真;

(5)把调试成功的程序利用烧入器烧入到芯片中去;

(6)把固化好程序的芯片插入到实际应用系统,投入到实际使用。

2.系统设计方案

2.1系统构成框图

1

3.硬件电路设计

3.1 主要器件介绍

3.1.1 LED点阵

LED点阵显示屏采用4个8*8共256个象素的点阵,通过万用表检测发光二极管的方法测试判断出该点阵的引脚分布,如图3.1所示。8*8的LED点阵为双色共阳模块,单点的工作电压为正向(Vf)=1.8v,正向电流(if)=8-10MA。静态点亮器件时(64点全亮)总电流为640mA。总电压为1.8v,总功率为1.15w.动态时取决于扫描频率(1/8或1/16秒),单点瞬间电流可达80-160mA。

2

图3.1

点阵LED扫描法介绍

点阵LED一般采用扫描式显示,实际运用分为三种方式:

(1)点扫描

(2)行扫描

(3)列扫描

若使用第一种方式,其扫描频率必须大于16*64=1024HZ,周期小于1MS即可。若使用第二和第三种方式,则频率必须大于16*8=128HZ,周期小于7.8MS即可符合视觉暂留要求。此外一次驱动一列或一行(8颗LED)时需外加驱动电路提高电流,否则LED亮度会不足。

我们把行列总线接在单片机的IO口,然后把上面分析到的扫描代码送人总线,就可以得到显示的汉字了。但是若将LED点阵的行列端口全部直接接入AT89S52单片机,则需要使用32条IO口,这样会造成IO资源的耗尽,系统也再无扩充的余地。因此,我们在实际应用中只是将LED点阵的16条行线直接接在P2口,至于列选扫描信号则是由4-16线译码器74HC154来选择控制,这样一来列选控制只使用了单片机的4个IO口,节约了很多IO资源,为单片机系统扩充使用功能提供了条件。

汉字扫描显示的基本过程是这样的:通电后由于电阻R1,电容C1的作用,使单片机的RST复位脚电平先高后低,从而达到复位;之后,在C2,C3,X1以及单片机内部时钟电路的作用下,单片机AT89 S52按照设定的程序在接口输出与内部汉字对应的代码电平送至LED点阵的行选线,同时在P1.0,P1. 1,P1.2,P1.3接口输出列选扫描信号,从而选中相应的象素LED发光,并利用人眼的视觉暂留特性合成整个汉字的显示。

3.1.2锁存器74LS373

74ls373是常用的地址锁存器芯片,它实质是一个是带三态缓冲输出的8D触发器,在单片机系统中为了扩展外部存储器,通常需要一块74ls373芯片,其内部结构图如图3.2所示。

3

图3.2 74ls373内部结构图

(1).1脚是输出使能(OE),是低电平有效,当1脚是高电平时,不管输入3、4、7、8、13、14、17、18如何,也不管11脚(锁存控制端,G)如何,输出2(Q0)、5(Q1)、6(Q2)、9(Q3)、12(Q4)15(Q5)、16(Q6)、19(Q7)全部呈现高阻状态(或者叫浮空状态);

(2).当1脚是低电平时,只要11脚(锁存控制端,G)上出现一个下降沿,输出2(Q0)、5(Q1)、6(Q2)、9(Q3)、12(Q4)、15(Q5)、16(Q6)、19(Q7)立即呈现输入脚3、4、7、8、13、14、17、18的状态.锁存端LE 由高变低时,输出端8 位信息被锁存,直到LE 端再次有效。当三态门使能信号OE为低电平时,三态门导通,允许Q0~Q7输出,OE为高电平时,输出悬空。当74LS373用作地址锁存器时,应使OE为低电平,此时锁存使能端C为高电平时,输出Q0~Q7 状态与输入端D1~D7状态相同;当C发生负的跳变时,输入端D0~D7 数据锁入Q0~Q7。51单片机的ALE信号可以直接与74LS373的C连接。

3.1.3 译码器74HC154

74HC154为4线—16线译码器,其管脚图如图3.3所示:

图3.3 74HC154管脚图

其逻辑图如图3.4所示:

4

5

图3.4 74HC154逻辑图

其功能表如表3.1所示

:

说明: H —高电平 L —低电平 X —任意 表3.1 74HC154功能表

3.2硬件设计思想及电路图

3.2.1硬件设计思想

由单片机进行处理,并将行列信号分别通过显示驱动输入点阵大屏,控制点阵的显示。

(1)单片机:采用AT89S52单片机芯片作为中控,控制LED点阵显示。

(2)显示:考虑到标准地显示一个汉字至少需要16*16LED点阵屏,而我们也只需要实现大屏显示的基本功能,并不需要太大的显示屏,因此决定采用16x16 LED点阵屏显示汉字。

(3)显示驱动:考虑到设计所需端口较多的问题,为减少资源占用,使用74HC154 4~16译码器作为列驱动芯片,采用74HC373串入并出8位锁存器作行驱动芯片。但由于两种芯片的最大输出电流均不够大(虽然74HC373输出电流已经较大了),为让LED显示亮度够强,采用PNP型三极管来进行电流的放大,同时为保护芯片,我们又采用1K电阻来进行限流。

3.2.2硬件电路图

本设计16X16系统的制作主要在于扩展用户I/O口,最终系统实现的关键在于扫描电路的扩展及程序的编写。系统I/O口的扩展是采用了4-16译码器74HC154来实现的,74HC154作为16*16系统的列扫描脉冲产生电路,其地址线连接到AT89S52的P1口的低4位上。利用P2口为8个行数据端口传送数据。由于P口的驱动力不强,因此在P2的每个输出端都加上三极管,以加大驱动电流,提高点阵的显示亮度。设计原理图如图3.5所示:

6

AT89S52单片机P1口与74HC154的输入端(A,B,C,D)连接,74HC154的16个输出端与16×16LED的列线相连,P2口与行线相连。由于单片机端口输出的电流较小,不足以驱动LED。故在LED的每个列线上加上一个三极管,对电流进行放大,如图3.6。通过74HC154对16×16LED进行逐列扫描,选中一列时通过P2口选中列即点亮行上的LED,快速的逐列扫描即可实现文字信息显示。

由上可知,可采用逐列扫描的方法实现LED的字符显示。

图3.8列驱动电路与行驱动电路图

图3.9 点阵显示电路图

4.软件设计

4.1汉字的点阵显示原理及字库代码获取方法

我们先以简单的汉字显示为例,每一个字由16行16列的点阵组成显示。即国标汉字库中的每一个字均由256点阵来表示。我们可以把每一个点理解为一个象素,而把每一个字的字形理解为一幅图像。事实上这个汉字屏不仅可以显示汉字,也可以显示在256象素范围内的任何图形。如用8位的AT89S52单片机控制,由于单片机的总线为8位,一个字需要拆分为2个部分,如图4.1所示。

9

为了弄清楚汉字的点阵组成规律,首先通过列扫描方法获取汉字的代码。汉字可拆分为上部和下部,上部由8×16点阵组成,下部也由8×16点阵组成。通过列扫描方法首先显示左上角的第1列的上半部分,显示汉字“龙”时,P2.4点亮,由上往下排列,为:P2.0灭,P2.1灭,P2.2灭P2.3灭,P2.4亮,P2.5灭,P2.6灭,P2.7灭。即二进制00001000,转换为十六进制为08h。上半部一列完成后,继续扫描下半部的一列,为了方便,我们仍设计成由上往下扫描,从图4.1可以看到,这一列全部为不亮,即为00000000,十六进制则为00h。依照这个方法扫描16列,一共扫描32个8位,可以得出汉字“龙”的扫描代码为:

00H,08H,08H,08H,08H,08H,0FFH,08H

0FH,48H,28H,08H,08H,18H,08H,00H

00H,00H,02H,06H,30H,0C4H,04H,08H

0FCH,24H,44H,84H,04H,04H,3CH,00H

由这个原理可以看出,无论显示何种字体或图像,都可以用这个方法来分析出他的扫描代码从而显示在屏幕上。本系统是设计龙岩学院字体的显示,使用这个方法可以分析出龙岩学院这几个字的代码。

4.2程序流程图

软件程序主要由开始、初始化、主程序、字库组成。其中主程序和子程序的流程图如图4-2和图4-3所示。

10

图4-2 主程序流程图

11

12

4.3程序清单:

COLUMN EQU P1 ;列扫描信号输出端口

ROW EQU P2 ;显示信号输出端口

LATCH_H EQU P3.0 ;上锁存信号输出端口

LATCH_L EQU P3.1 ;下锁存信号输出端口

SCANCODE EQU 0 ;扫描信号

SPEED EQU 10 ;0.5s延迟

S_TIME_H EQU 0FDH ;2.5ms扫描时间

S_TIME_L EQU 0D0H ;2.5ms扫描时间

ORG 00H ;程序从0地址开始

JMP START ;跳至START

ORG 0BH ;TIMER0中断向量

JMP TIMER0 ;跳至TIMER0中断子程序

;============================================================ START:

MOV IE,#10000010B ;设定TIMER0中断

MOV TMOD,#1 ;设定TIMER0为MODE1

MOV SP,#60H ;移开堆栈指针

SETB RS0 ;切换到RB1

MOV R0,#20H ;上面部分开始存放地址

MOV R1,#30H ;下面部分开始存放地址

MOV R2,#16 ; 扫描16列

MOV R3,#SCANCODE ;载入扫描码

CLR RS0 ;切换回RS0

MOV TH0,#S_TIME_H ;设定每列扫描时间

MOV TL0,#S_TIME_L ;设定每列扫描时间

SETB TR0 ;启动TIMER0

MOV DPTR,#TABLE ;将常数指针指向TABLE地址

MOV 41H,#4 ;4次加载字型

MOV R0,#20H ; 上面部分开始存放地址

MOV R1,#30H ;下面部分开始存放地址

;==================================================================== LOOP: CALL LOADING ;加载字型

CALL DELAY ;稍等一下

CLR C

MOV A,DPL

ADD A,#32

MOV DPL,A

MOV A,DPH

ADDC A,#0

MOV DPH,A

MOV R0,#20H ; 上面部分开始存放地址

MOV R1,#30H

13

DJNZ 41H,LOOP ;跳至LOOP形成一个循环(一次写1字)

JMP START ;跳至START形成一个循环

;==================================================================== LOADING: PUSH ACC ;存储ACC

PUSH PSW ;存储PSW

MOV R2,#16 ;加载各16笔数据

MOV R3,#0 ;间距

MOV R4,#10H ;间距

LOAD_1: MOV A,R3 ;将间距放入ACC

MOVC A,@A+DPTR ;读入数据

MOV @R0,A ;将上面部分数据存入存储器

INC R0 ;指向下一个地址

INC R3 ;指向下一个地址,相对DPTR地址加1、

MOV A,R4 ;将间距放入ACC

MOVC A,@A+DPTR ;读入数据

MOV @R1,A ;将上面部分数据存入存储器

INC R1 ;指向下一个地址

INC R4 ;指向下一个地址

DJNZ R2,LOAD_1 ;跳至LOAD_1形成一个循环(1上字节1下字节) POP PSW ;取回PSW

POP ACC ;取回ACC资料

RET

;==================================================================== DELAY: MOV R7,#SPEED

D2: MOV R6,#200

D1: MOV R5,#250

DJNZ R5,$

DJNZ R6,D1

DJNZ R7,D2

RET

;==================================================================== DELAY1: MOV R7,#1

D22: MOV R6,#1

D11: MOV R5,#100

DJNZ R5,$

DJNZ R6,D11

DJNZ R7,D22

RET

TIMER0: CLR TR0 ;关闭TIMER0

PUSH ACC ;存储ACC

SETB RS0 ;切换到RB1

MOV A,R3 ;载入扫描码

MOV COLUMN,A ;输出扫描码(显示一列)

INC R3 ;下一个扫描码

MOV A,@R0 ;取出显示信号

;====================================================================

14

;使用共阳极式LED阵列,则加入下一行指令

;

;==================================================================== CPL A

MOV ROW,A ;输出显示信号

SETB LATCH_H ;打开锁存器

NOP

CLR LATCH_H ;关闭锁存器

INC R0

MOV A,@R1 ;取出显示信号

;==================================================================== ;使用共阳极式LED阵列,则加入下一行指令

;;==================================================================== CPL A

MOV ROW,A ;输出显示信号

SETB LATCH_L ;打开锁存器

NOP

CLR LATCH_L ;关闭锁存器

INC R1

CALL DELAY1

MOV A,#0FFH

MOV P2,A

DJNZ R2,NEXT_C ;未超过16行则跳至NEXT_C

MOV R2,#16 ;从新开始扫描

MOV R0,#20H ;从第一列开始

MOV R1,#30H ;从第一列开始

NEXT_C: MOV TH0,#S_TIME_H ;设定每列扫描时间

MOV TL0,#S_TIME_L ;设定每列扫描时间

SETB TR0 ;启动TIMER0

CLR RS0 ;切换回RB0

POP ACC ;取回ACC

RETI

TABLE:

DB 00H,10H,10H,10H,10H,10H,0FFH,10H

DB 0F0H,12H,1CH,0D0H,10H,10H,10H,00H

DB 00H,40H,20H,10H,0CH,03H,10H,08H

DB 3FH,42H,41H,40H,40H,40H,70H,00H

DB 00H,40H,5EH,50H,50H,0D0H,50H,5FH

DB 50H,50H,50H,50H,5EH,40H,40H,00H

DB 10H,08H,04H,02H,7FH,22H,22H,22H

DB 22H,22H,22H,22H,7EH,00H,00H,00H

15

DB 40H,30H,10H,12H,5CH,54H,50H,51H

DB 5EH,0D4H,50H,18H,57H,32H,10H,00H

DB 00H,02H,02H,02H,02H,02H,42H,82H

DB 7FH,02H,02H,02H,02H,02H,02H,00H

DB 0FEH,02H,32H,4AH,86H,0CH,24H,24H

DB 25H,26H,24H,24H,24H,0CH,04H,00H

DB 0FFH,00H,02H,04H,83H,41H,31H,0FH

DB 01H,01H,7FH,81H,81H,81H,0F1H,00H

END

5.设计结果

在实际应用中,16*16的点阵LED上,依次显示“龙”、“岩”、“学”、“院”四个字,达到预期效果。虽然本设计只使用了16×16 LED点阵,电路简单,但是已经包涵了LED显示屏的电路基本原理,只要扩展单片机的IO接口,并增加一些LED点阵和相关芯片,就能设计出更大面积、更多花样的LED 显示屏。因此本文对同类设计具有一定的理论和实践参考价值。

6.论文小结

在本次设计中,电路连线很多,焊接有一定的难度。特别是译码器74HC154要焊接的线非常之多,还好焊接过程比较细心,这块芯片工作很正常。不过在调试的过程,也的确遇到了一个小问题。当我编简单的程序进行扫描时,发现有一列不亮。心想会不会是哪个芯片接错了,再认真观察了一下,发现其他的行和列都工作正常。由此,我初步估测是LED没接好。回头检查了一遍,发现问题的确出在LED 的管脚上,有两个焊点忘了连起来。连好以后,重新调了一遍。还好,成功了,硬件部分圆满完成。看来焊接要认真、认真、再认真,来不得半点的含糊。否则,要花很多的时间来检查复杂的电路,得不偿失。另外一个问题是扫描的频率太快,以至让人看不清楚字。在增大了帧延时常数之后,情况得到改善。

16

本文来源:https://www.bwwdw.com/article/7spl.html

Top