分享

小规模彩色LED阵列显示控制器的设计

 共同成长888 2014-11-01

小规模彩色LED阵列显示控制器的设计

小规模彩色LED阵列显示控制器的设计

摘  要

LED(Light Emitting Diodes)显示技术指将光电、计算机以及控制等相关内容综合于一体的新技术。它与传统的广告宣传紧密结合成一种新的媒体宣传工具,广泛应用于展览中心、金融市场、体育场馆、机场、码头、车站等公共场所的信息显示和广告宣传。LED显示系统主要由显示模块、控制器以及完成文字录入和显示模式选择的计算机三个部分组成。该系统既可显示中文、英文,也可显示用户指定的图形符号。

本文阐明了用单片机控制双色显示屏的方法,对LED显示模块单元如何进行行列信号控制及信号传输中的驱动问题进行了研究。讨论了单片机控制系统中关键的数据处理以及发送等问题。设计以16×64点阵屏为例介绍了整套LED点阵汉字显示系统的实现方法和原理,用KEILC51对单片机进行编程,实现了单片机与微机的通讯。并使LED屏的显示实现了固定和平移的变换功能。

关键词:发光二极管;显示屏;单片机;扫描


 


1  绪论

LED(Light Emitting Diode,发光二极管)显示屏是利用发光二极管点阵模块或像素单元组成的平面式显示屏幕。由于它具有色彩鲜艳、亮度高、寿命长、工作稳定可靠等优点,在许多行业都得到了广泛的应用,如在车站、码头、商场、银行等公共场所将LED显示屏用于信息发布。显示屏的优点还在于播放的内容信息量大,实时性强等。由8×8 LED点阵拼成的显示屏有同步和异步之分,同步控制显示屏由计算机作为主控器,异步控制显示屏的主控器可采用单片机。单片机控制的双色显示屏由于结构简单,由于成本低廉,深受人们的喜爱,本文将对此进行讨论。

本设计为双色LED显示屏,因为两种颜色的显示控制原理一样,所以文中不作特别说明。显示单色时,只接通一种颜色。在显示双色时,将两种颜色同时点亮,并送出相同的控制数据就能实现。本文重点对显示屏的控制原理作研究设计,而不过多的强调色彩变换。

1.1 LED概述

LED显示屏是由单颗的LED灯组成的,LED的性能特性是影响显示屏显示效果的一个重要因素,所以在这里简单介绍一下LED的相关知识。

1.1.1 LED的结构及发光原理

LED是一种能够将电能转化为可见光的半导体器件,它不是采用白炽灯钨丝发光与节能灯三基色粉发光的原理,而采用电场发光。它的基本结构是一块电致发光的半导体材料,置于一个有引线的架子上,然后四周用环氧树脂密封,起到保护内部芯线的作用,所以LED的抗震性能好。50年前人们已经了解半导体材料可产生光线的基本知识,第一个商用二极管产生于1960年。下面是LED 的简易封装外形结构图。

图1-1 LED示意图

发光二极管的核心部分是由P型半导体和N型半导体组成的晶片,在P型半导体和N型半导体之间有一个过渡层,称为P-N结。在某些半导体材料的PN结中,注入的少数载流子与多数载流子复合时会把多余的能量以光的形式释放出来,从而把电能直接转换为光能。PN结加反向电压,少数载流子难以注入,故不发光。这种利用注入式电致发光原理制作的二极管叫发光二极管,通称LED。当它处于正向工作状态时(即两端加上正向电压),电流从LED阳极流向阴极时,半导体晶体就发出从紫外到红外不同颜色的光线,光的强弱与电流有关。

1.1.2 LED光源的特点

LED光源的特点非常明显,寿命长、光效高、无辐射与低功耗。LED的光谱几乎全部集中于可见光频段,其发光效率可达80-90%。将LED与普通白炽灯、螺旋节能灯及T5三基色荧光灯进行对比,结果显示:普通白炽灯的光效为12lm/W,寿命小于2000小时,螺旋节能灯的光效为60lm/W,寿命小于8000小时,T5荧光灯则为96lm/W,寿命大约为10000小时,而直径为5毫米的白光LED为20~28lm/W,寿命可大于100000小时。有人还预测,未来的LED寿命上限将无穷大。具体表现在以下几方面:

(1)电压:LED使用低压电源,供电电压在6-24V之间,根据产品不同而异,所以它是一个比使用高压电源更安全的电源,特别适用于公共场所。

(2)效能:消耗能量较同光效的白炽灯减少80% 。

(3)适用性:很小,每个单元LED小片是3-5mm的正方形,所以可以制备成各种形状的器件,并且适合于易变的环境。

(4)稳定性:10万小时,光衰为初始的50% 。

(5)响应时间:其白炽灯的响应时间为毫秒级,LED灯的响应时间为纳秒级。

(6)对环境污染:无有害金属汞。

(7)颜色:改变电流可以变色,发光二极管方便地通过化学修饰方法,调整材料的能带结构和带隙,实现红、黄、绿、兰、橙多色发光。如小电流时为红色的LED,随着电流的增加,可以依次变为橙色,黄色,最后为绿色。

(8)价格:LED的价格比较昂贵,较之于白炽灯,几只LED的价格就可以与一只白炽灯的价格相当,而通常每组信号灯需由上300-500只LED构成。

1.2 LED显示屏的现状

随着社会文化的不断发展,人们的消费标准不断改变,户外灯箱广告更是扮演着越来越重要的宣传角色,不论是汽车站,火车站,股市交易市场,还是学校都离不开它,然而传统的霓虹灯广告牌不论是在显示效果、耗电量还是可修改性上都无法满足当前社会的需求,传统的霓虹灯广告亟待改进。

由于单片机技术的不断发展和高亮度LED发光管的出现使得大屏幕高亮度LED电子广告屏成为可能,与传统的霓虹灯广告在显示效果以及可修改性上都有着无法比拟的优势,而且单片机的日益平民化以及LED技术的不断创新,使得高亮度高清晰的LED点阵广告牌与传统霓虹灯广告牌的成本日益接近。另外,SMT技术的飞速发展,开关电源的大规模使用,使其无论在体积上还是在可靠性上都比传统的霓虹灯广告有明显的优势,为其在特殊领域的应用奠定了基础。

这种新兴的大屏幕显示技术成为众人目光的焦点。与传统的显示设备相比,首先,LED 显示屏色彩丰富,3基色的发光管的可以显示全彩色,显示显示方式变化多样(文字、图形、动画、视频、电视画面等)、亮度高,是集光电子技术、微电子技术、计算机技术、信息处理技术于一体的高技术产品,可用来显示文字、计算机屏幕同步的图形。其次,LED 显示屏的象素采用LED发光二极管,将多个发光二极管以序列的形式构成LED显示阵列,这种显示屏具有耗电省、成本低、亮度清晰度高、寿命长等优点,而且 LED 显示屏以其受空间限制较小,并可以根据用户要求设计屏的大小,具有全彩色效果,视角大,是信息传播设施划时代的产品。再次,LED 显示屏应用广泛,金融证券、银行利率、商业广告、文化娱乐等方面,显示效果清晰稳定,越来越多的地方开始使用LED电子显示屏,有巨大的社会效益和经济效益。它以其超大画面、超宽视觉、灵活多变的显示方式等独居一格的优势,是目前国际上使用广泛的显示系统。

1.3 本设计的应用及意义

本文所设计的LED显示屏是小规模的点阵显示屏,每次可静态显示四个国标汉字,可动态显示多个文字,可显示256像素内的简单图形。在实际中可用于广告牌显示,也可作为公共场合的提醒显示等。

通过本设计,主要了解显示控制模块的各个组成部分和驱动电路的原理与设计,以及驱动芯片的控制和软件编程。大的显示屏都是由许多的小模块组装而成,如果弄明白了单个模块的显示控制原理,这将对设计组装大的显示屏起到积极的指导意义。

1.4 设计主要工作

(1)介绍显示系统的各个组成部分,各个元器件的管脚定义和工作原理。

(2)介绍点阵的显示控制原理。

(3)介绍硬件原理图的设计。

(4)给出显示系统的软件设计。

(5)通过设计,在显示屏上显示像素在16×64范围内的图文。实现文字的分幕静态显示和移动显示。

2  系统总体方案

本章围绕系统的总体设计,介绍系统组成框图、主控芯片单片机的内部硬件资源和接口设置,以及整个显示控制系统所用到的其它元器件的介绍。

2.1 系统总体规划

本设计的LED点阵显示系统主要实现的功能是中英文汉字静态和动态显示以及一些简单的图形显示。作为下位机的单片机系统通过RS-232串行口接收有上位机即PC机传入的显示信息和控制信号。该数据经过处理后,写入显示用的器件的RAM中进行储存。在显示系统正常运行后,系统将RAM中的显示内容和控制信息送入LED显示屏体进行显示,通过各个发光二极管的亮灭来实现完整信息显示。整个系统由硬件和软件两大部分组成。硬件电路大致上可以分成单片机系统及外围电路、列驱动电路和行驱动电路以及LED点阵阵列三大部分。

整个系统的基本框图如下:

图2-1 系统框图

(1)PC机部分

PC机部分是在一个软件平台上(本设计的软件平台是KEILC51),实现软件的编译,生成单片机的可执行文件。同时完成通讯端口的软件设置,使程序能正确的写入单片机。PC部分还要完成对文字字模的提取。

(2)单片机部分

单片机部分的工作流程入下:51单片机利用自身所具有的串行通信口,接收PC机传送下来的串行数据,然后将接收到的数据通过并行口输出,送到各驱动芯片。实现对各驱动芯片的控制和数据输入。本设计使用的单片机为ATMEL公司生产的AT89C51。

(3)驱动电路设计

驱动部分分为行驱动和列驱动。行驱动提供显示模块的行扫描信号,列驱动提供显示数据。

常用的显示驱动方式有三种:

(1)串行控制驱动,这种方式的好处是单元内的线路连接简单,给印刷电路板的设计带来方便,减少了布线的密度,方便以后的制作与调试,而且相对提高了每个单元的可靠性。

(2)并行控制驱动,将显示数据通过并行(一般为8位)方式送入驱动电路,这样的好处是:相对于串行控制而言,数据的刷新速度快,在处理同等数量的数据时,对处理速度要求可以大大降低,从而提高了系统的稳定性,但也正因为“并行”使单元内的数据线路的连接更加复杂,布线后的排错难度大大增加。

(3)采用专用集成电路(ASIC)直接驱动,由于这种专用集成电路是集行控制、列控制和外围驱动于一体,使系统的稳定性更为可靠,特别适合户外的大型或者超大型显示屏。因为这种类型的显示屏对图像显示要求高,不仅要保证图像的一致性,而且要保证图像的稳定、高亮。

本次设计的显示屏仅为16行×64列,更适合采用串行控制这种方式,这样做既省去了并行控制驱动在硬件制作过程中复杂的布线,又因为没有采用专用集成电路在一定程度上降低了整个系统的成本。

本设计的行驱动部分用两块74HC138芯片的级联来控制,列驱动用16片74HC595芯片来控制。行驱和列驱的控制信号都由单片机的并行口提供。

(4)显示模块

显示模块是显示图文的载体。它由16个8×8的LED矩阵模块组成,分为上下两部分,每部分的行控制信号分别相连,同一列两模块的列线相连。

2.2 单片机通讯设置及串行口介绍

单片机的通讯方式有两种:并行和串行。并行通讯是指数据的N个位同时发送和接收。串行通讯是指数据一位一位的按顺序发送和接收。本设计是利用单片机的串行通讯来实现的,其串行口是一个可编程的全双工串行通讯接口,它可以作为UART(通用异步收发器),也可作为同步移位寄存器。在使用时需要对串行口进行一些设置。

2.2.1 内部寄存器的设置

单片机通过引脚RXD串行数据接收端(P3.0)和引脚TXD串行数据发送端(P3.1)与外界通信的。在串行口内部有两个物理上独立的接收、发送缓冲器SBUF,它们占用同一地址99 H,可同时发送、接收数据。发送缓冲器只能写入,不能读出;接收缓冲器只能读出,不能写入。串行发送与接收的速率与移位时钟同步。

单片机串行口的编程是对串行控制寄存器SCON的控制。SCON是一个特殊功能寄存器,用以设定串行口的工作方式、接收/发送控制以及设置状态标志。其格式为:

表2-1  SCON各位定义

7

6

5

4

3

2

1

0

SM0

SM1

SM2

REN

TB8

RB8

TI

RI

 SM1、SM0:串行口工作方式选择位,其定义如下表所示。

表2-2 串行口工作方式

SM0/SM1

工作方式

功能

波特率

00

方式0

8位移位寄存器

Fosc/12

01

方式1

10位UART

可选

10

方式2

11位UART

Fosc/64或Fosc/32

11

方式3

11位UART

可选

SM2:多机通信控制位,主要用于方式2和方式3。当接收机的SM2=1时可以利用收到的RB8来控制是否激活RI(RB8=0时不激活RI,收到的信息丢弃;RB8=1时收到的数据进入SBUF,并激活RI,进而在中断服务中将数据从SBUF读走)。当SM2=0时,不论收到的RB8为0和1,均可以使收到的数据进入SBUF,并激活RI(即此时RB8不具有控制RI激活的功能)。通过控制SM2,可以实现多机通信。

在方式0时,SM2必须是0。在方式1时,若SM2=1,则只有接收到有效停止位时,RI才置1。

REN:接收允许控制位。若用软件置REN=1,则启动串行口接收数据;若用软件置REN=0,则禁止接收。

TB8:在方式2和方式3中,是发送数据的第九位,可以用软件规定其作用。可以作为数据的奇偶校验位,或在多机通信中,作为地址帧/数据帧的标志位。在方式0和方式1中,该位未使用。

RB8:在方式2和方式3中,是接收数据的第九位,作为奇偶校验位或地址帧/数据帧的标志位。在方式1时,若SM2=0,则RB8是接收到的停止位。在方式0中不使用RB8。

TI:发送中断标志位。在方式0时,当串行发送第8位数据结束时,或在其他方式,串行发送停止位的开始时,由内部硬件使TI置1,向CPU发中断申请。在中断服务程序中,必须用软件将其清0。以此取消中断申请。

RI:接收中断标志位。在方式0时,当串行发送第8位数据结束时,或在其他方式,串行发送停止位的开始时,由内部硬件使TI置1,向CPU发中断申请。在中断服务程序中,也必须用软件将其清0,以此取消中断申请。

2.2.2 单片机的串行口工作方式0介绍

单片机串行口共有四种工作方式,在本设计中,用到的是方式0。下面对单片机的工作方式0作简要介绍。

方式0时,串行口为8位同步移位寄存器输入输出方式,多用于外接移位寄存器以扩展I/O口,波特率固定为fosc/12,其中fosc为时钟频率。在方式0中,串行端口作为输出时,只要向串行缓冲器SBUF写入一个字节数据后,串行端口就把此8位数据以固定的波特率,从RXD引脚逐位输出,低位在前,高位在后。此时,TXD输出频率为fosc/12的同步移位脉冲。数据发送前,中断标志TI还必须置0,8位数据发送完后,TI自动置1。如果还要发送,必须用软件件将TI清0。当串口端以方式0作为输入时,RXD为数据输入端,TXD仍为同步信号输出端,输出频率为fosc/12的同步移位脉冲,使外部数据逐位移入RXD。当接收到8位数据后,中断标志RI置1。如果还要接收,必须用软件将RI清0。在本设计中,串行端口作为数据输出使用。

方式0输出:

方式0输入:

图2-2  方式0输入输出

 本设计中,串口工作在方式0下,由RXD 输出列显示时需要的数据,由TXD 输出数据传输的同步移位时钟脉冲。每8个移位时钟脉冲过后,RXD 也传输完一个8位数据,然后TI 自动置1,再通过软件将TI清0,继续传输下一个8位数据。

2.3 主要元器件介绍

本设计主要用到的元件有单片机AT89C51、8×8 LED点阵显示模块、74HC595、74HC138和S8550。

(1)单片机AT89C51

LED点阵显示系统的控制核心为单片机,扫描显示﹑数据传送以及各个驱动信号都由单片机产生并由其I/O口输出。本设计采用的控制芯片为单片机AT89C51,它是美国ATMEL公司生产的低电压,高性能CMOS 8位机,片内含有4KB的可反复擦写的只读程序存储器(PEROM)和128B的随机存取数据存储器(RAM)。芯片内部集成了通用的8位中央处理器(CPU)和FLASH存储单元,全面兼容标准的MCS-51指令系统。

AT89C51是一个低功耗高性能单片机,共有40个引脚,其中包括32个外部双向输入/输出口,同时内含两个外部中断口,两个16位可编程定时/计数器,两个全双工的串行通信口。AT89C51可以按照常规方法进行编程,也可以在线编程。由于其将通用的微处理器和Flash内存结合在一起,故可反复擦写。

图2-3为AT89C51的引脚图。

图2-3  AT89C51的引脚定义

(2)8×8 LED点阵显示模块

由于LED 点阵和LED数码管一样有共阴和共阳之分,在设计驱动与扫描电路时就有所不同。例如,在驱动共阳级点阵时,扫描信号应为高电平有效;在驱动共阴级点阵时,扫描信号就应该为低电平有效。

在本设计中使用的LED显示模块以列为共阴极、行为共阳极。由于本设计采用的是行扫描,所以行扫描信号应为高电平有效。该模块为8×8红橙双色点阵模块,它在每一个显示点都封装了红橙两种发光二极管。模块中每一行的8个红色LED和该行的8个橙色LED的阳极连接在一起,以方便作为行驱动线。同行的不同色的LED的阴极是分开的,方便作为列驱动。在同一模块中不同行的相同列中,同一颜色的LED的阴极是连接在一起的,以便于在扫描驱动方式下工作。这样,通过行和列的选取,就能实现模块中任意LED的点亮显示。

LED模块采用双列直插式封装,其示意图如2-4。

图2-4  LED模块

上列管脚依次为低四位共阳(Common)引脚和8个红色(Red)阴极管脚,下列为高四位共阳引脚和8个橙色(Orange)阴极管脚。C后的编号代表第几行,如:C1代表第一行。R和O后的编号代表第几列,如:R1代表红色显示第一列,O1代表橙色显示第一列。

(3)74HC595

74HC595具有8位串行输入并行输出的移位寄存器和一个8位输出锁存器。  其外形封装和引脚图如下:

图2-5  74HC595外形

在595的输入侧有8个串行移位寄存器,每个移位寄存器的输出都将连接一个输出锁存器。引脚SER是串行数据的输入短。引脚SCK是移位寄存器的移位时钟脉冲,在时钟上升沿时发生移位,并将SER的下一个数据打入最低位。移位后的各位信号出现在各移位寄存器的输出端,即输出锁存器的输入端。RCK是输出锁存器的打入信号,在其上升沿时,将移位寄存器的输出打入到输出锁存器。引脚 是输出三态门的开放信号,只有当其为低时锁存器的输出才有效,否则为高阻态。 是移位寄存器的清零输入信号,当它为低电平时,移位寄存器的输出全部为零。因为芯片的RCK和RSCK是两个独立的信号,所以能够做到输入串行移位与输出锁存互不干扰。

芯片的输出端为QA-QH,QH1是串行数据输出端,在595的级联中使用,作为向下一级的级联输出。

(4)74HC138 

74HC138是3端输入8端输出的译码器。3输入端口为二进制输入,共有8种输出结果。输出端输出低电平有效,当S1为高电平, 为低电平时,译码器才处于工作状态。否则译码器被禁止,所有的输出被封锁在高电平。74LS138译码器的引脚图,逻辑图及真值表如下图2-6、图2-7所示:

图2-6  74LS138的外部引脚图以及内部原理图

输入

输出

S1

A2     A1     A0

0

X

1

1

1

1

1

1

1

1

X

1

0

0

0

0

0

0

0

0

X     X     X

X     X     X

0     0     0

0     0     1

0     1     0

0     1     1

1     0     0

1     0     1

1     1     0

1     1     1

1  1  1  1  1  1  1  1

1  1  1  1  1  1  1  1

0  1  1  1  1  1  1  1

1  0  1  1  1  1  1  1

1  1  0  1  1  1  1  1

1  1  1  0  1  1  1  1

1  1  1  1  0  1  1  1

1  1  1  1  1  0  1  1

1  1  1  1  1  1  0  1

1  1  1  1  1  1  1  0

图2-7  3线-8线译码器74HC138的真值表

由上看以看出,只要在信号输入端A,B,C输入特定组合序列,就可以在输出端输出低电压,我们正是利用这个信号来控制行电路扫描的。

(5)S8550

S8550是中频放大功率三极管, 三极管为PNP型,管脚排列顺序为:E、B、C。 即从下图中的第一脚起分别为:发射极、基极和集电极。其封装外形和管脚排列如下图:

图2-8  S8550


3  硬件设计与实现 3.1 显示控制原理

本设计由单片机控制74HC138和74HC595的输出,由138输出行选通信号,74HC595输出列选通信号。通过74HC138进行行扫描和595输出的不同数据来点亮LED模块中的LED灯,从而实现既定的显示目标。

从理论上说,不论显示图形还是文字,只要控制与组成这些图形或文字的各个点所在位置相对应的LED器件发光,就可以得到我们想要的显示结果,这种同时控制各个发光点亮灭的方法称为静态驱动显示方式。16×64的点阵共有1024个发光二极管,显然单片机没有这么多端口,如果我们采用锁存器来扩展端口,按8位的锁存器来计算,16×64的点阵需要128个锁存器。这个数字很庞大,而且成本很昂贵,我们仅仅是16×64的4个汉字点阵,在实际应用中的显示屏往往要大得多,这样在锁存器上花的成本将是一个很庞大的数字。因此在实际应用中的显示屏几乎都不采用这种设计,而采用另一种称为动态扫描的显示方法。

动态扫描的意思简单地说就是逐行轮流点亮,这样扫描驱动电路就可以实现多行(比如8行)的同名列共用一套列驱动器。具体就16×64的点阵来说,把所有同一列的发光管的阴极连在一起,再去驱动这一列LED (共阳接法),每一列先送出对应第1行发光管对应的数据并锁存,再选通第1行使其点亮一定的时间,然后熄灭;再送出第2行的数据并锁存,再选通第2行使其点亮相同的时间,然后熄灭……第16行之后,又重新点亮第1行,反复轮回。当这样轮回的速度足够快(每秒24次以上),由于人眼的视觉暂留现象,就能看到显示屏上稳定的图形了。

采用扫描方式进行显示时,每行有一个行驱动器,各行的同名列共用一个列驱动器。显示数据通常存储在单片机的程序存储器中,按8位一个字节的形式顺序排放。显示时要把一行中各列的数据都传送到相应的列驱动器上去,这就存在一个显示数据传输的问题。从控制电路到列驱动器的数据传输可以采用并行方式或串行方式。

采用并行方式时,16×64的LED点阵有8列8×8的点阵,需要8×8=64个列数据输入口,而一个AT89C51只有32个I/O接口,还要同时驱动行数据,根本不够用;并且从控制电路到列驱动器的线路数量大,相应的硬件数目多,由此可以得出,当列数很多时,并行传输的方案是不可取的。

采用串行传输的方法,控制电路可以只用2根线:数据线、时钟线。将行数据一位一位传往行驱动器,在硬件方面无疑是十分经济的。但是,串行传输过程较长,数据按顺序一位一位地输出给行驱动器,只有当一行的各列数据都已传输到位之后,这一行的各列才能并行地进行显示。这样,对于一行的显示过程就可以分解成列数据准备(传输)和列数据显示两个部分。对于串行传输方式来说,列数据准备时间可能相当长,在行扫描周期确定的情况下,留给显示的时间就太少了,以致影响到LED的亮度。

为了解决串行传输中列数据准备和列数据显示的时间矛盾问题,可以采用重叠处理的方法。在显示本行数据的同时,传送下一行的数据。为了达到重叠处理的目的,列数据的显示驱动电路就需要具有锁存功能。经过上述分析,可以归纳出列驱动器电路应具备的主要功能:对数据准备来说,它应能实现串入并出的移位功能;对数据显示来说,应具有并行锁存的功能。这样,本行已准备好的数据打人并行锁存器进行显示时,串并移位寄存器就可以准备下一行的列数据,而不会影响本行的显示。

具备以上列驱动功能的集成电路有74LS(HC)595、MC14094、CD4094等。本设计采用的列驱动芯片是74HC595。下面就以74HC595为例,说明LED模块的具体点亮过程。

本设计中使用的LED模块每一行的阳极都连接在一起,每行都可以用一个行驱动器,而各行的同名列共用一个列驱动器。行驱动用74HC138来控制,列驱动用595来控制。扫描显示时,从第一行开始,按顺序依次对各行进行扫描,即将该行接高电平。同时,根据各列锁存的数据,确定相应的列驱动器是否将该列接为低电平。接上低电平的列,就在该行该列点燃相应的LED;未接通列所对应的LED就熄灭。当一行扫描时间结束后,下一行又以同样的方法进行扫描显示。全部16行扫描一次的时间称为一个扫描周期,待全部16行扫描一次后,又从第一行开始下一个周期的扫描。只要扫描周期的时间比人眼1/25秒的暂留时间短,人眼就不容易感觉出闪烁的现象,而是觉得一直都是在点亮。

例如:我们送出的行选通信号00000010(左高右低),即第二行输出是高电平。同时送出红色列选通信号11111011(左高右低),即第三列是低电平。所以,我们将点亮第二行第三列的LED。如图3-1A。若行译码器送出信号00010000(左高右低),列送出红色信号11001010(左高右低),则显示结果如图3-1B。橙色的显示原理与红色相同。

图3-1A                                   图3-1B

3.2 单片机系统及外围电路

由于LED点阵显示屏由单片机控制部分和显示驱动部分组成,单片机我选择最常见的ATMEL公司的AT89C51单片机。此单片机与MCS-51产品指令系统完全兼容,由4K字节可重擦写Flash闪速存储器,128×8字节内部RAM,32个可编程I/O口线,2个16位定时/计数器和6个中断源。并且该单片机经济实用,使用广泛。

本设计使用的是AT89C51的最小系统电路,包括:电源、时钟脉冲、复位电路和程序存储器设定电路,暂时只是显示很少的几十个汉字,不用外接存储扩展。

下图为本设计使用的单片机最小系统原理图。

图3-2  89C51的基本外部电路

3.3 行驱动电路设计

行驱动电路由两片74HC138进行级联,输出16位的行驱扫描信号。16位扫描信号输出后分别接上1K电阻作为S8550基极输入。S8550的发射极接高电平,集电极输出信号作为LED显示模块的行扫描信号接入显示模块。S8550的基极电阻可以改变,若想行驱动的电流大点,基极电阻就相应减小,反之,增大基极的电阻就可减小集电极电流输出。

3.3.1 单片机对74HC138的控制

74HC138是三端输入八端输出的二进制译码器,输出为低电平有效。输入的3位二进制代码共有8种状态,译码器将每个输入代码译成对应的一根输出线上的高、低电平信号。A3、A2、A1为输入端口,Y0~Y7是八个输出端。

74HC138有三个附加的控制端S1、。当S1=1、+=0时,译码器才出于工作状态。否则译码器被禁止,所有的输出被封锁在高电平。

由于在设计中的扫描行有16行,一块74HC138只能实现8行的扫描,故需要将两块74HC138进行级联,由此组成4线—16线译码器,将输入的4位二进制代码D3、D2、D1、D0译成16个独立的低电平信号。两片74HC138的级联方式如下:

图3-3  74HC138的级联与控制

上图中第一块74HC138的S1接高电平,第二块输入信号+与第一片相连接作为两片74HC138的使能控制信号。当使能信号为低时,两片74HC138才能工作,否则两片都不能工作。按照上图的连接,并且使能信号为低时的情况下。在D3D2D1D0输出0000到0111这八个信号时,由于D3为0,所以第二片74HC138禁止,只有第一片正常工作。当D3D2D1D0为1000到1111时,D3为高电平,所以第一片74HC138禁止工作,第二片74HC138正常工作。综合前面的两种情况,当P1.3~P1.0输出0000~1111,就能从接联后的两片74HC138的输出端依次输出的低电平信号。

3.3.2 行控制信号的产生

由于该LED模块是采用共阳极扫描的,而74HC138输出的电平是低电平有效。例:当我们要选通第一行时,74HC138输出11111110,这样第一行成了低电平,其他反而成了高电平,这与我们的想法正好相反。所以我们不能用74HC138直接产生控制信号。

从上面的分析我们可以知道,只要将74HC138的输出信号取反,就能实现我们的目标。当然我们可以在74HC138的输出直接加上反相器实现。但在此处,我们在74HC138的输出加上一个S8550,S8550是PNP反向放大驱动管。当信号由S8550的基极输入时,在C(集电极)极将输出与输入相反的信号。这样,不仅使74HC138的输出信号反了向,达到了输出高电平有效的目的,而且通过S8550的放大,增强了输出电流的驱动能力,使LED的亮度得到了提高。

图3-4  行控制信号产生

3.4 列驱动电路设计

设计中列驱动由74HC595来实现。每个74HC595能驱动8列,所以控制64列的LED点阵需要8个595。8个74HC595通过级联方式来对列进行驱动。

3.4.1 单片机对74HC595的控制

74HC595是串入并出的移位寄存器,单片机采用串口传输数据,由RXD 输出数据到SER,由TXD 输出同步数据移位脉冲到SRCK,由单片机的P1.7口输出74HC595的数据锁存信号。只有当锁存信号有效,即锁存信号的时钟上升沿到来时,595才输出列控制的数据。

74HC595和89C51的连接方式如下图:

图 3-5  单片机对595的控制

由于发送的是8位数据,则可以利用单片机的串口进行数据发送。让串口工作在方式0,在方式0下,8位数据通过RXD输出,低位在前高位在后。同时在RXD输出数据时,TXD输出同步的移位时钟脉冲。如上图,通过PC机将74HC595的输入数据写入单片机的SBUF区,数据由RXD引脚输出,同步移位脉冲由TXD引脚输出。当数据全部移入74HC595,此时由P1.7输出一个上升沿,将74HC595中移位寄存器的输出(移位数据)打入到输出锁存器。在实际应用中,一块74HC595是远不够的。本设计就需要16块74HC595来对双色16×64点阵进行列驱动,这就要用到74HC595的级联。

74HC595的接联方式如下图:

                            图3-6  595的级联

3.4.2 列控制信号的产生

列信号是由74HC595产生的,数据由单片机的串口(P3.0)产生,从74HC595的串行数据输入端SER输入,由QA~QH并行输出。

在这里需要注意的是,74HC595的数据是从低位向高位移位的,而单片机串口发送数据是先发低位,再发高位。所以要注意数据的对应,使74HC595输出的数据与相应的列对应正确,这样方便软件的调试。例如:由单片机串口发出的数据是11101101(左高右低),那么从74HC595并行口输出的信号是10110111。如下图所示:  

图3-7  74HC595数据的传送

3.5 LED显示模块的连接

LED显示模块是由16片8×8的小模块组成,其连接方式的电路原理图如下(由于图片太大,为了能清楚的看到连接方式,只给出了部分的连接图):

图3-8  LED 模块部分连接

3.6 电路原理图设计

在前面,分别介绍了电路各个部分的功能,通过对电路的分析,给出了各个部分电路的实现方法。只要将前面各个部分电路综合起来就是一个完整的电路原理图了。本设计的电路原理图由Protell99绘制,完整的电路原理图见附录。

3.7 硬件电路制作

介绍完整个电路的功能以及实现方法以后,下面就开始硬件电路制作。硬件电路制作是及其重要的,它是整个显示系统的载体,也是进行软件设计的依据。

本设计的硬件电路采用全手工方式焊接而成。采用单层通用板,各元件均为直插式。但考虑到连线较多,而单层板的走线通道有限,所以在制作时采用了跳线连接。

在焊接时需要注意的是,要避免虚焊和短路,焊接完一部分就必须检查一部分。下面是焊接好后的硬件电路外形图。右边的上下两排是16块列驱动芯片74HC595,中间是由16块8×8的LED 模块组成的显示屏幕。左边的小模块是由74HC138和S8550组成的行驱动电路。整个电路均是全手工焊接。

                           图3-9 硬件电路图

4  软件设计 4.1 汉字字模提取

本显示系统主要是实现汉字的显示,涉及到汉字字模的提取。这里简单介绍一下汉字的显示原理。

4.1.1 汉字的点阵显示原理

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


图4-2  16×16 汉字组成

本设计是通过行扫描来实现显示数据的。所以下面我们从行扫描的角度来分析汉字点阵的组成规律。

行扫描时,汉字分成左右两个部分,左边部分由8×16点阵组成,右边部分也由8×16点阵组成。本例通过行扫描方法首先显示左半部分第一行,然后显示右边部分第一行,当扫描完第一行后,按照第一行的扫描方式继续扫描其余行。

下面以大字为例,说明行扫描时,列显示数据的生成。

该例中,LED在列显示的数据为低电平时点亮,假设用P10-P17来控制左边部分,用P20-P27来控制右边部分。如下图,当扫描第一行左边部分时,只有P10为低电平,其余为高电平。所以P17-P10为11111110,按C语言中写为十六进制数为0xfe;扫描第一行右边部分时,所有灯都不亮。故P27-P20为11111111, 按C语言中写为十六进制数为0xff。接下来按照第一行的处理方法来得到其余的列显示数据。

依照上面的方法,行扫描16次,列一共送出32个8位显示数据,这样可以得出汉字“大”的扫描代码为:

0xfe,0xff,0xfe,0xff,0xfe,0xff,0xfe,0xff,0xfe,0xff,0x00,0x01,0xfe,0xff,0xfd,0x7f

0xfd,0x7f,0xfd,0xbf,0xfb,0xbf,0xfb,0xdf,0xf7,0xef,0xef,0xe7,0xdf,0xf1,0xbf,0xfb

图4-3“大”字字模提取

4.1.2 通过软件提取汉字字模

由上面的分析可以看出,如果要人工来对每个字来提取它的字模,确实是一件比较繁琐的事,而且自己写字模也不是必要的。所以我们利用市面上的字模提取软件来直接提取就可以了。

现在市面上有很多的字模提取软件,在这里,我以 PCtoLCD2002字模提取软件为例来加以说明。

PCtoLCD2002的功能很齐全,其主要功能有

(1)生成中英文数字混合的字符串的字模数据.

(2)可选择字体,大小,并且可独立调整文字的长和宽,生成任意形状的字符。

(3)各种旋转,翻转文字功能

(4)任意调整输出点阵大小,并任意调整字符在点阵中的位置。

(5)字模数据输出可自定义各种格式,系统预设了C语言和汇编语言两种格式,并且可自己定义出新的数据输出格式;每行输出数据个数可调。

(6)支持四种取模方式:逐行(就是横向逐行取点),逐列(纵向逐列取点),行列(先横向取第一行的8个点作为第一个字节,然后纵向取第二行的8个点作为第二个字节……),列行(先纵向取第一列的前8个点作为第一个字节,然后横向取第二列的前8个点作为第二个字节……)。

(7)支持阴码(亮点为1),阳码(亮点为0)取模。

(8)支持纵向(第一位为低位),倒向(第一位为高位)取模。

(9)输出数制可选16进制或10进制。

在实际使用时,可以根据需要提取符合自己设计字模,这样就简化了自己去写字模的繁琐。

4.2 软件设计流程图

显示屏软件的主要功能是向显示屏提供显示数据,并产生各种控制信号,使屏幕按设计的要求显示。根据软件分层次设计的原理,可把显示屏的软件系统分成两大层:第一层是底层的显示驱动程序,第二层是上层的系统应用程序。显示驱动程序负责向点阵屏传送特定组合的显示数据,并负责产生行扫描信号和其它控制信号,配合完成LED显示屏的扫描显示工作。显示驱动程序由显示子程序实现;系统环境设置(初始化)由系统初始化程序完成;显示效果处理等工作,则由主程序通过调用子程序来实现。

然后显示驱动程序查询当前燃亮的行号,从显示缓存区内读取下一行的显示数据,并通过串口发送给移位寄存器。为消除在切换行显示数据的时候产生拖尾现象,驱动程序先要关闭显示屏,即消隐,等数据发送完毕后输出74HC595的锁存信号,将显示数据打入输出锁存器并锁存,然后再输出新的行号,并打开显示。图4-1为显示驱动程序(显示屏扫描函数)流程图。

图4-1 显示驱动程序流程图

4.2.1 系统主程序

系统主程序开始以后,首先是对系统环境初始化,包括设置串口,端口以及一些参数;然后以分屏效果显示“电子科大中山学院”,接着开始左跑马滚动显示“本屏由电子科技大学中山学院04电子科学与技术黄桷制作,指导教师:陈李胜。谢谢各位老师和同学!”。设置系统程序不断地循环执行上述显示效果。

系统主程序代码及注释:

#include <AT89x51.H>

#define uchar unsigned char

#define uint unsigned int

#define SPEED 1            //定义移动显示速度

#define light 2            //定义移动显示行扫描速度

sbit OE=P1^5;              // 138使能信号

sbit STC=P1^7;   

uchar col,row;             //col为位移变量,row为行变量

uint word=0;               //显示一个汉字发送的字节数

uchar code HZ[];           //移动显示汉字数组

uchar BUFF[18];            //定义移动显示数据存放缓冲空间

void loadoneline(void);    //移动显示装载数据

void delay(uchar t);       //延时函数

void sendoneline(void);    //移动显示发送数据

void out_rxd(unsigned char *d);         //静态显示数据发送

uchar two_onebyte(uchar h1,uchar h2);    //移动显示数据调整模块

unsigned char code sw[16]={0x10,0x11,0x12,0x13,0x14,0x15,

     0x16,0x17,0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f,}; /*静态行扫描的16行段码*/

unsigned char e=0;                  

/********************************************/

void main(void)

{*****参数定义*****

  SCON=0;                             //串口初始化,串口工作于工作方式0

*****调用静态显示程序*****

*****调用动态显示子程序****

 while(1)         //重复循环左移显示

   {      

     while(col<16)

      {

       for(i=0;i<SPEED;i++)         //左移速度

         {

        OE=1;                      //关138

         for(row=0;row<16;row++)   //动态16行扫描

              {

          STC=0;                   //595锁存数据

          loadoneline();

          sendoneline();

          OE=0;                     //138有效

          P2=row;                  //P2口开始发送行扫描信号             

           STC=1;                   //595输出数据

           delay(light);            //行扫描时间间隔

              }

          }                       

         col++;                    // 列数据移位指针加1

      }

         col=0;                   //重新开始移动

        word=word+32;             //移动显示下一个字

       if(word>=1024)              //移动显示完毕后,又重新开始移动显示

     word=0;

     }

 }

}

4.2.2 系统子程序

(1)静态显示子程序

for(x=0;x<=1;x++)            //显示两幕

   {

     for(k=20;k>0;k--)       //每幕静态显示时间

     {   

      for(i=1;i<=31;i+=2)    //16次列数据发送

        {

         P2=0xFF;          

         OE=1;               //关138

         for(n=m;n>=y;n--)   //发送列数据

          {

           out_rxd(&hanzi[n][i]);  //从串口输出第n个字的第i字节

          out_rxd(&hanzi[n][i-1]);   //从串口输出第n个字的第i+1字节

  

            }

           STC=0;                 

          STC=1;               //595锁存信号上升沿来到,输出列数据

          OE=0;                 //138有效

         P2=sw[e];               //输出行扫描信号

         delay(20);             //延时,等待一段时间,让这行显示的内容在人眼内产生“视觉暂留”现象

         e++;                    //行加一

         if(e==16)

         e=0;                    //扫描完16行,又重新开始扫描

       }

     }

          m=m+4;                 //显示下一幕

          y=y+4;

  };

(2)移动显示子程序

uchar two_onebyte(uchar h1,uchar h2)            //移动显示数据调整模块

{

 uchar temp,tempcol;

 if(col<8)                             //输出8位二进制数

 tempcol=col;

 else

 tempcol=col-8;                              

 temp=(h1>>tempcol)|(h2<<(8-tempcol));//h1左移tempcol 位后和h2右移8- tempcol相或,取出移位后的数据

 temp=255-temp;

 return temp;

}

void loadoneline(void)               //把字模移入数组的子函数;

{

  uchar s;

 for(s=0;s<9;s++)                          //s为要显示的数字+1(8位数据移出时,要移动9次)

   {

   BUFF[2*s]=HZ[word+32*s+2*row];        

   BUFF[2*s+1]=HZ[word+1+32*s+2*row];

   }

}

void send(void)                   //发送一行的子函数;

{  char s;uchar inc;

 if(col<8)

inc=0;

else

inc=1;

    for(s=0+inc;s<=15+inc;s++)       //s=2*要显示的数字-1;

   {

SBUF=two_onebyte(BUFF[s],BUFF[s+1]);

      while(!TI);                    //等待数据发送完毕;

      TI=0;                          //为下次发送做准备;

   }

}

(3)延时与串口发送子程序

void delay(uchar t)                 //延时模块 ;

{ uchar i,j;

  for(j=0;j<t;j++)

   {

for(i=0;i<20;i++);                  //延迟时间为20×t;

}                     

}

void out_rxd(unsigned char *d)     //从串口发送数据;

{

    SBUF=*d;                       //数据存入缓冲区发送;

     while(TI==0);                 //等待发送完毕;

      TI=0;                       //为下次发送做准备;

 }

4.3 基于Proteus 的单片机可视化仿真 4.3.1 Proteus 简介

   Proteus软件是来自英国Labcenter electronics公司的EDA工具软件,Proteus软件有十多年的历史,在全球广泛使用,除了其具有和其它EDA工具一样的原理布图、PCB自动或人工布线及电路仿真的功能外,其革命性的功能是,他的电路仿真是互动的,针对微处理器的应用,还可以直接在基于原理图的虚拟原型上编程,并实现软件源码级的实时调试,如有显示及输出,还能看到运行后输入输出的效果,配合系统配置的虚拟仪器如示波器、逻辑分析仪等。

在本设计中,运用Proteus软件来调试程序,避免了反复对单片机的程序烧写和调试时对硬件的损伤。在Proteus 环境下,通过原理图的设计和编写,几乎可以达到完全和硬件电路一致的效果。如果软件在Proteus 环境下能通过,那么在相应的硬件电路下就不会有说明大的问题了。更重要的是,我们可以看到显示效果,可以实时的改变我们的程序,来达到我们的显示目标。所以说,在软硬件调试时,使用Proteus 软件将起到事半功倍的效果。

                             图4-2 Proteus 下的电路原理图
4.3.2 Proteus 仿真效果
本设计的调试过程先在Proteus软件上通过,然后再和实际的硬件相结合,进行整体调试。下面是在Proteus软件上的调试过程和结果。

首先在Proteus软件下按照实际电路画好原理图,如图4-2。在画图时,使用了和实际所用元件相同功能的元件,如用反向器代替了S8550,这不影响我们的调试结果。

图4-3是加载HEX文件的示意图。首先然后在KEIL 软件编译好程序,程序中应按照原理图中的布线要求对各信号进行定义,单片机输出口和138以及595的控制信号必须一一对应。在KEIL下编译程序,排除程序的语法错误。编译完后生成HEX 文件,然后在Proteus 软件下加载到单片机就可进行仿真了。下面是加载HEX文件的示意图。

图4-3 在Proteus原理图下加载HEX文件

   下面是仿真效果图。

图4-4 仿真效果

 通过不断的仿真,我们可以方便的修改程序的错误和不当之处,这不仅使我们可以看到最终显示效果,更重要的是为我们在实际的硬件上调试起到了很好的指导作用在实际硬件调试时,只要硬件电路没有问题,软件方面几乎不用修改,就能达到较好的效果。

5  结  论

本文通过设计单片机控制单色LED显示屏的方法,对LED显示模块单元如何进行行列信号控制及信号传输中的驱动问题进行了研究。介绍了硬件的原理以及连接的方法,软件的设计流程以及部分代码,并在附录1给出了完整的电路图,经焊接并调试后可以正常显示汉字、图片信息,并且可动态显示。

硬件部分的设计保证了点阵的正常工作。列驱动电路中的74HC595实现了串入并出,并且带有锁存和移位的功能;行驱动电路使用了3-8线译码器74HC138加S8550驱动,因为如果用单片机直接连接LED点阵,引脚不够,同时驱动能力也不行,而用了这个译码器,可以节省引脚,并且方便做大屏幕的时候扩展。

软件部分的设计跟硬件完美配合实现汉字、图形的显示。通过LED点阵显示原理,我们知道只要合理的安排行选信号以及列信号同时导通的组合顺序就可以显示任何的图形、文字。软件的设计就是完成将汉字点阵数据通过一些特殊的算法调整,得到跟LED点阵相对应的数据,并将这些数据以及控制信号传送到LED点阵屏,来实现分屏扫描显示以及左移扫描显示的效果。

在设计中,由于采用的是手工焊接,在布线时就比较麻烦,不能象印制电路版那样方便,所以在显示时,采用单色显示。因为红橙两种颜色的显示控制原理是一样的,如果将两种颜色同时点亮,并送出相同的信号,就将显示彩色效果。

当然,没有什么是完美无缺的,对于文中存在的不足和疏漏之处,请大家见谅,并给于指正,谢谢!


附录

附图1电路原理图:

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多