1.1 LED显示屏概述
LED 显示屏从八十年代后期在全球迅速兴起,在短短的十几年中,技术、产业都取得了长足的进步,已发展成为重要的现代信息发布媒体手段,在证券交易、金融、交通、体育、广告等领域得到广泛应用,随着社会信息化的进程,LED显示屏在信息显示领域的应用愈加广阔。本章对LED 显示屏的技术和产业的发展予以介绍。 1.1.1 LED及LED发光材料的特点
在某些半导体材料的PN结中,注入的少数载流子与多数载流子复合时会把多余的能量以光的形式释放出来,从而把电能直接转换为光能。PN结加反向电压,少数载流子难以注入,故不发光。这种利用注入式电致发光原理制作的二极管叫发光二极管,通称LED。
LED的发光颜色和发光效率与制作LED的材料和工艺有关,目前广泛使用的有红、绿、蓝三种。把红色和绿色的LED放在一起作为一个象素制作的显示屏叫双色屏或彩色屏;把红、绿、蓝三种LED管放在一起作为一个象素的显示屏叫三色屏或全彩屏。
1968年HP公司就生产出红色的LED发光灯(波长660nm),而后陆续出现了可用于显示屏的黄绿(波长570nm),蓝(波长470nm)及纯绿(波长525nm),但目前由于高亮度的蓝色及纯绿色半导体晶片制造技术主要掌握在日本,美国等少数公司手中,造成价格比较昂贵。 应用于显示屏的LED发光材料有以下几种形式:
1、LED发光灯(或称单灯)
一般由单个LED晶片,反光碗,金属阳极,金属阴极构成,外包具有透光聚光能力的环氧树脂外壳。可用一个或多个(不同颜色的)单灯构成一个基本像素,由于亮度高,多用于户外显示屏。
2、 LED点阵模块
由若干晶片构成发光矩阵,用环氧树脂封装于塑料壳内。适合行列扫描驱动,容易构成高密度的显示屏,多用于户内显示屏。
3、 贴片式LED发光灯(或称SMD LED)
就是LED发光灯以贴焊形式的封装,可用于户内全彩色显示屏,可实现单点维护,
1
有效克服马赛克现象 1.1.3 LED显示屏的分类
1、使用环境分为户内、户外及半户外
户内屏面积一般从不到1平米到十几平米,点密度较高,在非阳光直射或灯光照明环境使用,观看距离在几米以外,屏体不具备密封防水能力。户外屏面积一般从几平米到几十甚至上百平米,点密度较稀,可在阳光直射条件下使用,观看距离在几十米以外,屏体具有良好的防风抗雨及防雷能力。半户外屏介于户外及户内两者之间,具有较高的发光亮度,可在非阳光直射户外下使用,屏体有一定的密封,一般在屋檐下或橱窗内。
2、颜色分为单色、双基色、三基色
单色是指显示屏只有一种颜色的发光材料,多为单红色,在某些特殊场合也可用黄绿色(例如殡仪馆)。双基色屏一般由红色和黄绿色发光材料构成。三基色屏分为全彩色(full color),由红色,黄绿色(波长570nm),蓝色构成及真彩色(nature color),由红色,纯绿色(波长525nm),蓝色构成。
3、控制或使用方式分同步和异步
同步方式是指LED显示屏的工作方式基本等同于电脑的监视器,它以至少30场/秒的更新速率点点对应地实时映射电脑监视器上的图像,通常具有多灰度的颜色显示能力,可达到多媒体的宣传广告效果。
异步方式是指LED屏具有存储及自动播放的能力,在PC机上编辑好的文字及无灰度图片通过串口或其他网络接口传入LED屏,然后由LED屏脱机自动播放,一般没有多灰度显示能力,主要用于显示文字信息,可以多屏联网。
4、像素密度或像素直径划分
∮3.0mm 60000像素/平米,∮3.75mm 44100像素/平米,∮5.0mm 17200像素/平米 1.1.4 LED显示屏的发展阶段
发光二极管(Lighted Electronic Diode)作为显示器材早期仅应用于仪器仪表等低亮度领域,随着半导体材料技术的不断发展,亮度逐渐提高,稳定性及寿命逐渐延长,色彩逐渐丰富,迅速进入大屏幕工程显示领域。尤其在体育场馆等场合的应用,因其超高亮度,色彩鲜艳,长寿稳定,已成一统天下之势。而近几年LED显示材料的产量迅猛增长,成本迅速下降,使其进入户内高密度大屏幕市场成为可能。LED大屏幕的发展呈
2
现如下几个发展阶段:
1、第一代单色LED显示屏
以单红色为基色,显示文字及简单图案为主,主要用于通知通告及客流引导系统。 2、第二代双基色多灰度显示屏
以红色及黄绿色为基色,因没有蓝色,只能称其为伪彩色,可以显示多灰度图像及视频,目前在国内广泛应用于电信,银行,税务,医院,政府机构等场合,主要显示标语,公益广告及形象宣传信息。
3、第三代全彩色(full color)多灰度显示屏
以红色,蓝色及黄绿色为基色,可以显示较为真实的图像,目前正在逐渐替代上一代产品。
4、第四代 真彩色(true color)多灰度显示屏
以红色,蓝色及纯绿色为基色,可以真实再现自然界的一切色彩(在色坐标上甚至超过了自然色彩范围)。可以显示各种视频图像及彩色广告,其艳丽的色彩,鲜亮的高亮度,细腻的对比度,在宣传广告领域应用具有极好的视觉震撼力。它具有高亮度,不受环境亮度影响,厚度薄,占用场地小,色彩鲜艳丰富,视角宽,可以在宽敞的厅堂环境应用,没有拼接图像损失。
1.2 本文LED点阵显示屏设计的内容及技术指标 1.2.1设计内容
1、显示方式的确定 2、驱动电路设计
3、控制器件选择及控制方式
4、软件设计,包括上位机及下位机程序设计 5、通信方式的设计 6、PCB的设计制作等 1.2.2技术指标
分辨率:128x32 颜色:红绿双基色
3
驱动时钟:1.843199MHz 场频:65Hz 行频:1040Hz 尺寸:608mm×152mm 接口:标准USART 显存:1792B 1.3 本文章节安排
本文分成四章,各章主要内容安排如下:
第一章 绪论,综述了LED点阵显示屏构成、分类、发展情况,并介绍本文LED点阵显示屏设计的主要工作和技术指标。
第二章 显示的总体设计,首先介绍了显示屏点阵的显示原理,接着介绍点阵的特点,确定系统的总体框图,并通过实验验证的方法确定了本次设计屏幕显示所采用的扫描方式和扫描频率。
第三章 硬件电路设计,主要详述了列锁存电路和行扫描驱动电路,以及控制电路的设计。
第四章 软件程序设计,主要描述了上下位机的程序设计方法,及其实现,下位主要介绍了各种动态显示方式的实现方法,上位机主要是串口通讯软件的实现办法。
4
2 显示屏的总体设计
2.1显示屏的显示原理
由n行m列LED(通常由8x8LED点阵模块拼接组成的)点阵屏,按一定的规律点亮其中的一部分LED,便可以显示特定的图形或文字(如图2.1所示)。
显示屏中的每一个像素,也叫像筒,就是点阵中的一个发光点,它可分为单色,双基色,三基色三种。单色(如红色或绿色),则可以显示单色或者灰度的图像或文字。双基色屏除了可以显示单色的功能外,还可以通过控制像点的亮度制成伪彩屏,而三基色屏则
图2.1 点阵显示示意图
可以通过对每个像筒中的三种光源进行256级灰度调节,从而实现真彩屏显示。
LED点阵显示屏由数量众多的LED组成,如室内屏常用的∮3.75mm(像筒直径3.75毫米)的显示屏一平方米就有44100像素。如此庞大的数量,如果用静态显示,将需要大量的锁存器和地址译码等硬件电路,而且需要消耗巨大的电能。比如每个LED的显示电流为3mA的话,假如由5伏电源供电,则一平方米真彩屏的耗电功率最高达到44100*3*3*5/1000=1984.1W(全屏所有LED都亮),相应电源要提供的电流约为400安培,而如果采用动态的扫描显示,笔者通过实验验证利用1/16行扫描,50Hz的场频时每个LED的驱动电流为10mA时其亮度跟静态的3mA相当。这时电源提供的最大电流为44100*10*3/16/1000A=8.25A。也就是说静态显示的耗电量大约为动态显示耗电量的40多倍。基于以上两个原因LED点阵显示屏一般都采用动态的扫描显示。每一时刻只点亮显示屏中一行或者几行LED,利用人眼的视觉暂停效应,通过快速扫描,使屏幕看起来所有行是同时显示的。其原理类似于电视机扫描显示原理。 2.2显示屏设计的实现方法 2.2.1 LED 点阵模块特性
LED点阵显示屏幕除非特殊用途,如需要高亮,大直径像点等等,一般不用分立的发光二极管组成,而是用现成的LED点阵集成块排列而成。目前市面上能买到的有5×8、8×8、16×16等规格,像素直径为φ3.0、φ3.7、φ4.8、φ5.0、φ8.0、ph8、ph10、
5
ph16、ph20等。5×8点阵一般用于英文和数字显示。而8×8和16×16一般用于组成显示屏。高的集成度可以简化电路设计,但价格也高。目前8x8点阵用得最多,LED8x8点阵有单色(红,绿,黄)、双基色(一般为红绿两色)和三基色(红绿蓝三色)可选。笔者从市场上了解到8*8单基色和双基色模块的价格基本一样,一般都是24引脚(单基色有8个空引脚),引脚排列比较规则;单色模块也有16引脚的,但引脚排列不规则。基于以上原因,并从设计的从实际出发,同时由于是比较小的室内屏,故选用φ3.7的红绿双基色模块。
买回来的LED点阵模块,需要测定它的封装(包括尺寸和引脚排列),和电器特性。 首先可以查它的电子技术文档,得出红绿双色LED8x8的封装及引脚排列如图2.2所示,接着用万用表调到二极管测试档进行引脚排列验证。当万用表的红笔黑笔分别接触到LED的正负极的时候,对应的LED会发光。经测试引脚与图2.2所示一致。
图2.2双基色8*8点阵原理与引脚图
其中“▲”代表红色发光芯,“△”代表绿色发光芯。
6
图2.3点阵的外观
图2.3是LED8×8点阵的外观图,下面对点阵的电器特性进行验证。图2.4和图2.5
图2.4红色LED的电器特性图
分别是点阵中红色LED和绿色LED的伏安特性和亮度电流特性图由图可以看出亮度电流特性两种灯基本上一样,不同的是绿灯的导通电压比红灯高,而且绿灯随电压的增大电流增大不及红灯快。
图2.5绿LED的电器特性图
7
表2.1通过实验测试的了作品所采用的LED点阵模块两种颜色的LED在不同电流下的正向压降。可以看出与技术文档的特性曲线基本一致流。
表2.1 LED点阵电流与正向压降关系 电流(mA) 绿色LED正向压降(V) 红色LED正向压降(V)
2.0 1.94 1.85
3.0 1.97 1.86
5.0 2.00 1.90
8.0 2.05 1.93
12.0 2.11 1.97
25.0 2.20 2.00
2.2.2 系统的总体实现方法
要实现128x32的显示屏,首先得算出整屏所需的8x8LED点阵模块数,计算方法是N=(128x32)/(8x8)=64片。我们把LED点阵里同一行的所有LED的正极相连,每一行引出一条行线;把同一列的所有LED的负极相连,每一列引出一条列线。如图2.6所示。列线的数据取自列锁存电路,行线与扫描电路相连。
显示的时候,单片机从显示存储器里取出某一行的显示数据,并把数据写入列锁存电路;同时,通过扫描驱动电路把LED点阵里该行的行线电平拉高。此时该行的LED按存储器里的数据低电平的点亮,高电平的不亮,而其他所有行都不亮。点亮该行一小段时间(如700微秒)之后,单片机从显示数据存储器里取出下一行数据,以同样的方式控制显示下一行的LED。再过一个极短的时间,再显示下一行。直到最末一行再从第一行开始扫描显示。如此周而复始不断循环,只要扫描的频率足够的高,由于人眼的视觉暂停效应,看起来就好像是所有行都是同时点亮的,因此就可以看到一个稳定的画面。
图2.6 系统的总体结构图
8
显示屏系统中,单片机控制器通过串行接口与个人电脑相连接,用于实时更新显示屏的内容,还可以控制显示屏的显示方式,只占用PC的一个串行口。扩展RAM用来作为显示屏的显存。可以制作双缓存来提高存取的速度。其它扩展可连接包括时钟芯片,温度传感器,语音芯片等,将系统制成集视听一体化的多功能屏。
下面通过一个简单的例子来说明显示屏是如何显示信息的。在单色显示的情况下,用二进制码表示显示数据,二进制码的每一位对应显示屏幕上的一个点,‘1’表示亮,‘0’表示不亮,如图2.7所示。
图2.7 显示点和数据的对应关系
可以看到显示存储器里的数据是如何与显示屏幕显示的图形或文字相对应的。哪点阵上的‘0’或‘1’是怎样获得的呢?原来是先把某一行字模信息写到列锁存器,再对该行进行选通驱动。
在双色或三色的情况下,每种颜色的显示原理和单色显示原理相同。还有如果给列锁存器写入的是PWM调制信号的话,则可以实现灰度调节,从而可以实现真彩屏。 2.2.3行扫描方式及扫描频率的确定
LED显示屏幕基本上采用动态的行扫描方式,大多数采用1/8、1/16、1/32等1/n扫描,n一般为2的整数几次幂。即在一个扫描周期里(形成一帧画面),有n行轮流点亮。
采用哪一种扫描方式,主要考虑因素有硬件和显示效果两方面。对于显示器件来说,人们最关注的就是它的显示效果如何,如亮度,对比度,稳定性(有无闪烁)和价格,而价格直接与设计所需的成本,即与硬件相关了。对于单色或双色屏我们最关心的是它的稳定性了,也就是说有无闪烁了。而作为一名设计者,我们还要关心它的设计成本。我们知道采用动太扫描方式显示的器件,其原理都是利用人眼的视觉惰性,当屏幕的的帧频率大于某一数值之后,通常大于25。就感觉像是静止的一样,形成稳定的画面,对于LED显示屏由于点距比较大,而且实际扫描时间比行扫描周期还要短(在一个行扫描周
9
期里部分时间用于装入并锁存数据信息),所以要达到稳定的显示画面通常要更大的帧频率,通常在50Hz以上,而且屏幕越大需要的场频就越高。
结合本文显示屏的设计实际,笔者用16x16点阵模拟16x256(相当于32x128)进行验证,发现在50Hz时显示屏基本无闪烁,有趣的是不同颜色的闪烁程度也不同,绿灯的闪烁比红的要明显一些,通过查找相关资料也核实这种现象,理论基础是人眼对不同颜色的色彩敏感度不同。同时资料显示不同人对闪烁的敏感程度也不一样。基于本文所要设计的尺寸比16x16大很多,故拟定用65Hz的场频(帧频)。在1/32和1/32以上的扫描方式下,要达到合适的亮度所需要的脉冲电流过大,而且也给控制器提出了很高的要求,因此本设计不予采用。
显示屏所需列锁存器与扫描方式成正比,也就是说采用1/16将比1/8的扫描方式省一半的锁存器,下面计算本设计采用1/8所需要的列驱动芯片(拟定用TB62706,每片能驱动16位)数量将达到
N= 32行×128列×2颜色/16位/16=64片 (2.1)
芯片数目过多,大大提高了成本,如果用1/16,则只需32片的列驱动芯片,而在行扫描方面1/8与1/16两种方式的差别只在前者用一个4-8译码器而后者用一个4-16译码器后者前者用8个I/O口而后者用了16个O/口,还有8个驱动管。这相对与列驱动锁存器来说成本低了很多,因此不宜采用1/8或者1/8以下的扫描方式。考虑上述问题,笔者决定采用1/16扫描的显示方式。同时可以计算出,行扫描频率为:
f=16行×65帧=1040Hz (2.2)
10
3 硬件电路设计
3.1行扫描驱动电路设计
行扫描驱动电路包括两部分,扫描部分与驱动部分,扫描部分用于产生选通的顺序脉冲序列,驱动部分主要考虑选择能够提供合适电流的驱动管。 3.1.1 行扫描电路方案的选择
行扫描电路(也叫行选电路)用来产生一个如下图3.1所示的顺序脉冲,驱动某一行管,作为点亮一行的信号。按照逐行扫描的方式,当全部列信号准备就绪后,控制列信号锁存器输出,相应的行信号应同时跟上。因采用点阵的行为共阳极,所以行选的作用就是为待点亮行提供电源。顺序脉冲可以又多种电路产生,常用有串入并出移位器,如74HC164;串入并出锁存器,如74HC595;3-8译码器74HC138或4-16译码器74HC154。下面就这几种方法组成的电路进行讨论,并选出本设计的采用方案。
图3.1 驱动行管用的顺序脉冲
11
讨论时我们主要考虑电路占用系统资源的情况,简洁性,成本这几方面。下面列举了几种电路方案,图3.2为采用8位移位寄存器方法的行选电路。该电路中MR为74HC164的清零信号,LS为串行行选信号,LCLK为行选同步时钟。74HC164的输出经反相器控制驱动管的导通与截止,从而分别控制第一至第十六行与电源的接通。
图3.2 又74HC164构成的行选电路
该电路只用了3个I/O口,数据的写入只用了一条指令,不占用显示时间,只是所需器件多了些。使电路相对复杂,成本提高。
图3.3为利用了两片串入并出芯片74HC595串联组成了顺序脉冲的电路。电路的优点是简洁,占用I/O口少,其原理是系统运行的时候,单片机发生了一个时钟信号驱动74HC95,并每16个时钟周期定时把串行输入口的电平拉低,于是在Q1~Q16产生了所需的1/16顺序脉冲。
图3.3 74HC595构成的行选电路
12
由前面的表述行选是紧跟在列锁存准备就绪之后的,也就是说在在每一个行扫描周期里,从把信号锁存到列锁存器到行管的驱动输出这段时间LED是不点亮的,这段时间越短对显示屏的显示亮度更有利。所以应该尽量缩短这段时间,显然用了两片串入并出芯片74HC595串联组成了顺序脉冲的电路会占用一定量的显示时间,所以一般不予采用。
图3.4为4-16译码器构成的行选电路,该电路直接由I/O口控制,只需两条指令操作就能实现行选,不占用显示时间,电路简洁,可以采用这种电路,不过由两个3-8译码器74HC138构成的相当于一个74HC154的行选电路也够简洁,而且成本比较低,所以本设计采用由两个3-8译码器74HC138构成行选电路[12],其原理图如图3.5所示。
图3.4 74HC164构成的行选电
图3.5 两个74HC138构成的行选电路
3.1.2行驱动管的选择
驱动管的选择一般从两个因素考虑,一是响应时间,一是驱动电流。由于系统的扫描频率(行频率)一般不大于10K,从响应时间上来说一般驱动管都能满足要求。从驱动电流看,系统每次驱动两行,每行有128个红色的LED和128个绿色的LED,每个瞬间电流是10mA(实验验证的结果)。因此列驱动管所需的最大驱动电流是
ILmax=10×128×2×2=5120(mA) (3.1)
13
考察了LED显示屏所采用的几款产品,目前行驱动管大部分使用P沟道MOS管或PNP达林顿管。使用频率最高的是TIP127、SI4953、SI4957 等几个产品。对上述几个产品的选择主要考虑因素有持续电流驱动能力和瞬间电流驱动能力。虽然LED显示屏用的是瞬时电流驱动,但考虑到调试期间可能产生持续电流驱动,为安全起见,设计时考虑用持续电流做驱动标准要求。表3.1是对使用最多的TIP127与SI4953[9]的驱动性能进行比较。
表3.1 TIP127与SI4953的电流性能
由表3.1可以看出SI4953的持续驱动能力比TIP127小一倍多,但是每个SI4953里面有两个管,如果一个驱动红色一个驱动绿色,即每个MOS管提供的驱动电流为5120/2=2560mA,还是完全符合要求的,另一个考虑因素就是管的封装形式了,图3.6是两种管的封装形式。由于电路板的面积限制,采用TO-220FP封装的TIP127体积很大,不予采用。因此选择了封装有两个P沟道MOS管的SI4953作为列驱动管。
图3.6 TIP127与SI4953的封装
3.2列锁存驱动电路设计
14
列锁存电路的设计主要解决每一行数据在显示的时候的锁存问题。目前LED显示屏一般都采用若干个串入并出芯片串联而成。原理简单,电路简洁,容易控制。本设计也选用这样的方法,其原理如图所示。
3.2.1列驱动芯片选择
图3.7 行锁存的原理图
LED显示屏主要是由发光二极管LED及其驱动芯片组成的显示单元拼接而成的大尺寸平面显示器。驱动芯片性能的好坏对 LED显示屏的显示质量起着至关重要的作用。近年来,随着LED市场的蓬勃发展,许多有实力的 IC厂商,包括日本的东芝(TOSHIBA)、索尼(SONY),美国的德州仪器(TI),台湾的聚积(MBI)和点晶科技(SITI)等,开始生产LED专用驱动芯片。
LED驱动芯片可分为通用芯片和专用芯片两种。所谓的通用芯片,其芯片本身并非专门为LED而设计,而是一些具有LED显示屏部分逻辑功能的逻辑芯片(如串入并出移位寄存器74HC595)。通用芯片一般用于LED显示屏的低档产品,如户内的单色屏,双色屏等。最常用的通用芯片是74HC595,74HC595具有 8 位锁存、串 2 并移位寄存器和三态输出。每路最大可输出35mA的电流(非恒流)。专用芯片是指按照LED发光特性而设计专门用于LED显示屏的驱动芯片。LED是电流特性器件,即在饱和导通的前提下,其亮度随着电流的变化而变化,而不是靠调节其两端的电压而变化。因此专用芯片一个最大的优点就是提供恒流源。恒流源可以保证LED的稳定驱动,消减LED的闪烁现象,是LED显示屏显示高品质画面的前提。有些专用芯片还针对不同行业的要求增加了一些特殊的功能,如亮度调节、错误检测等。
目前LED恒流芯片主要分为三个档次。第一档次是具有灰度机制的芯片,这类芯片内部具有PWM机构,可以根据输入的数据产生灰度,更易形成深层次灰度,达到高品质画面。第二档次是具有LOD,TSD、亮度调节功能的芯片,这些芯片由于有了附加功能而更适用于特定场合,如用于可变情报板,具有侦测LED 错误功能。第三档为不
15
带任何附加功能的恒流源芯片,此类芯片只为LED提供高精度的恒流源,保证屏体显示画面的质量良好。恒流源输出路数主要有 8(8 位源)和16(16位源)两种规格,现在16位源基本上占主流:如TCL5921,TB62706/TB62726,MBI5026/MBI5016等。16位源芯片主要优势在于减少了芯片尺寸,便于LED驱动板(PCB)布线,特别是对于点间距较小的PCB更是有利。目前TB系列芯片在国内占有率最高,MBI(聚积科技)的MBI5026/MBI5016分别与东芝的TB62726/TB62706引脚及功能完全兼容,除了恒流源外部设定电阻阻值稍有不同外,基本上都可直接代换使用。该产品的价格比东芝的要低10~20%,是中档显示屏不错的选择。
为了保证显示屏的显示显示效果,同时使驱动电路更加简洁,本设计采用MBI(聚积科技)公司生产的MBI5026/MBI6016芯片。采用MBI5026/MBI6016有如下优点:
1、恒流输出,保证了画面的稳定
2、恒流输出达到16路,减少了驱动芯片的数目 3、SSOP24-P封装,体积小,节省了电路板空间 4、货源充足,价格合理
3.2.2 MBI5026/MBI6016原理和列驱动电路实现[11]
MBI5026/MBI6016是一个有16路恒流源输出的串行输入,并行输出的LED专用驱动芯片。其内部结构如图3.8所示。它主要包括以下两部分:由D型触发器串联成的串入并出电路和集电极开路输出恒流电路。
图3.8 MBI5016引脚图
MBI5026/MBI5016每路恒流源的输出电流是5~90mA。MBI5016输出电流稳定度达
图3.9 MBI5016内部结构图
16
到6%。最高工作频率达到25MHz。
图3.10为TB62706/62726数据手册提供的典型运用电路该电路也适用于MBI5016/5026。
其中,VLED是供电电压,用VCE表示行驱动管的导通压降,设计中用的集成P沟道MOS管,其导通压降在0.05V以下。用VF 表示LED的
正向导通压降,在前文中有实验测定的数据。VO是MBI5016/5026恒流输出的输出电压。数据手册描述,VO一般正常运行时为 0.4~0.7伏,当VLED 比较大而输出电流较小时,VO可以大到4~5伏。整个MBI5016能够承当的最大功耗温度25 ℃时1.3W,85℃时为0.67W,式3.2计算出当每个恒流输出为10mA,功耗为0.67W对应的Vo值。
Vo=0.67W(功耗)÷[10mA×16(16个输出口)]=4.1875V (3.2) 上述几个电压的关系为
VLED =VCE +VF+Vo (3.3) 其中大约为VCE +VF 大约为2V,当直接连接VDD时大约为3V。显然取恒流输出为10mA的话是没有问题的,不过为了确保MBI5016工作的稳定性,一般都是 VDD串接一个稳压管,降压后才接VLED,使VLED在3~4伏之间,或者VLED直接连VDD,然后在每一个恒流输出端串接分压电阻,使Vo为一伏左右。显然采用一个稳压管,或者一两个大功率的二极管,进行分可以使电路更叫简洁,稳定。
图3.4 TB62706典型应用电路
[5]
图3.9 MBI5016的典型应用电路
17
图3.10 MBI5016输出电流与REXT关系
图3.10是MBI5016输出电流与Rext的关系,Rext为外接输出电流控制电阻,Iout与Rext关系式如图3.10所示,本设计取Iout为10mA,则Rext的计算如下式3.4所示:
Rext = (VR-EXT×15)÷IOUT =(1.26×15)÷0.01=1890Ω (3.4) 按电阻的标准系列阻值,可取最接近的2KΩ或者1.5KΩ 当选择REXT=1.5KΩ时候,
IOUT=(1.26×15 )÷1500=0.0126A=12.6mA (3.5) 此时每个LED的平均电流为IOUT/16=0.79mA,能较好的发光。因此选择REXT=1.5KΩ。
通过以上设计,最终列驱动电路的具体电路如图3.11所示(部分电路图)。
图3.11 列锁存电路图(部分)
3.3控制电路的设计
18
3.3.1控制器的选择
作为一个128x32的室内屏,8位单片机完全有能力对其进行操控。传统的MCS-51系列单片机,如果不采用外加,并入串出移位和分频电路,来提高串行的列锁存操作,直接用I/O进行列信号的锁存操作,就算使用24MHz的晶振和倍频,一条但周期的指令也要0.25微秒,而完成一次移位至少需要4个指令周期,而一次锁存要写进的位数为:128(每行)∙2行∙2色=512,所以完成一次锁存所需时间为512×4×0.25=512微秒,如上文所述,采用960Hz的行扫描,即扫描周期约为1毫秒。那么将有一半以上的时间用于数据锁存,这段时间LED没有导通,LED的占空比大大减小,从而需要更大的驱动电流。也影响了显示的效果。虽然可以采用图3.12的电路结构,增加并入串出移位器和直接使用晶振频率几分频后的时钟进行列信号的操作,这样基本不占用单片机系统资源,也不占用显示时间,但是控制部分引入很多元件,提高成本的同时也降低了系统的可靠性。本设计不予考虑。
本设计采用Atmel公司生产的8位高档AVR单片机——ATMega32作为下位机控制器。
ATMega32是一款高性能、低功耗的 8 位AVR微处理器,它有如下优点[8]:
1. 先进的RISC 结构
2. 工作于16 MHz 时性能高达16 MIPS 3. 32K 字节的系统内可编程Flash 4. 1024 字节的EEPROM 5. 2K字节的片内SRAM
6. 两个具有独立预分频器和比较器功能的8
位定时器/ 计数器
7. 一个具有预分频器、比较功能和捕捉功能的16 位定时器/ 计数器 8. 具有独立振荡器的实时计数器RTC 9. 面向字节的两线接口 10. 一个可编程的串行USART
11. 可工作于主机/从机模式的SPI 串行接口 12. 具有独立片内振荡器的可编程看门狗定时器
19
图3.12 ATMega16 引脚图
设计的时候之所以选择ATMega32来做控制器是因为很多特性适合我们设计的需要。首先,SPI 串行接口可用于列锁存数据的高速串行输出。当单片机工作在16MHz时,SPI的最高时钟频率可以达到8Mz。其次,高达2K字节的SRAM可以作为屏幕的显示存储器,免去了外接存储器的麻烦。再次它有一个可编程的USART,可用于和PC通信,使显示屏作为PC的一个外设。最后,系统内置了1024字节的EEPROM,可用于存储系统设置,当系统断电后设置信息也不会丢失。 3.3.2控制电路原理
控制系统的电路原理图如图资源分配情况如表3.13所示。
图3.13 单片机控制电路图
得益于ATmega32的优秀性能,控制单元电路比较简单,基本是单片机的最小应用系统,加电源,串行通信电路构成的。
单片机控制系统的资源分配情况如表3.2:
20
功能接口 引脚分配情况 表3.2 控制系统资源分配
行扫描接口 PC0:扫描线LA PC1:扫描线LB PC2:扫描线LC PC3:扫描线LD PC4:显示使能EN 列锁存输出 串行通讯接口 SPI接口 PB5:MOSI PB6:MISO PB7:SCK PD4:串行数据输入 PD1(TXD):串行发送 PD5:串行时钟 PD0(RXD):串行接收 PD6:数据锁存 如图3.14时序图所示,MBI5016的串行数据采集点在CLK的上升沿;/LE低电平时锁存输出数据,高电平时送出新数据[11]。由于AVR单片机内置有SPI串行通信端口,因此也可以直接用SPI来向MBI5016传送数据,而无须用软件来模拟。SPI的写进速度要比软件快一些,当然, SPI通讯端口可以进行在线下载编程,实现
图3.14MBI5016数据传输时序
控制系统在系统启动的时候,系统初始化外设及显示的指针(它指向显示数据缓存的某一行)。初始化完成之后,单片机通过SPI口,向列锁存器写入首行显示数据,同时送出一个顺序脉冲到列驱动电路,点亮该行的LED。在该行点亮1MS之后,以同样的方式点亮第二行LED。并在以后的时间里,以同样的时间间隔逐行轮流点亮其他行,实现扫描显示。
与此同时,系统不断的从并行或者串行通信端口读取命令和数据,并解析命令,修改显示存储器里的数据。
21
3.3.3与PC联机接口电路
LED显示屏和电脑的通讯方式采用了标准RS232接口,通过AVR单片机内置的USART串行通行端口与PC通信。并且通过编制上位机软件,实现对显示屏信息的实时更新。
通讯方式为8位的异步通讯。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.15 串行通信电平转换电路
4 软件程序设计
4.1 单片机显示控制程序设计
22
单片机在LED点阵汉字显示系统中主要负责数据的接收、存储和扫描显示LED三大主要功能。主程序流程图如图4.1所示。本文设计的LED点阵显示屏可以实现静止、左移、掉下、上升、翻页几种显示方式。有红色、绿色、黄色(红色与绿色同时点亮)三种颜色可选。通过移动、翻页的显示方式,从而能够显示的内容大好多倍屏幕的尺寸,其中左移是条形显示屏最常用的。显示方式和显示颜色可以由单片机控制,也可以由微机设置控制,图4.2是串行中断软件流程图,微机在传送点阵字模数据时,先传设置显示颜色,显示方式,字模文件头,最后传送点阵数据。
开始 否开始 接受中断 是 上电复位 关闭显示中断 系统初始化 更改数据信息地址 I/O口的定义及初始化 接收点阵数据信息 串行口的初始化 接收完毕 否继续接收 是
显示方式的设置 打开显示中断 打开显示中断 根据参数调用显示子程序 中断返回
图4.1 主程序流程图 图4.2 串行接收中断流程图
显示过程由单片机定时中断程序控制,动态显示流程如图4.3所示。每定时中
断一次点亮一行,定时中断时间为1ms,每中断16次,即可对整个显示屏扫描一次,完成一个屏信息的刷新,每秒显示画面数达62屏,可保证画面无闪烁感。
23
开始 n=0,无行选通 第n行的数据写入列锁存器 使第n行的驱动管导通,显示第n行 显示(延时)一段时间 n++; if(n==16) n=0;
4.1.1 编程思想
图4.3 动态显示流程
动态显示的效果是由一幅幅不同内容的屏幕画面组成的,因此在软件设计上,只要按一定的时间间隔改变显示缓冲区的内容,如左移则使显示缓冲区的点阵数据左移一列,即可实现动态移位的效果,由于显示缓冲区的所有数据左移1列需要一定的时间,不可能在两次中断间隔时间内实现这一处理过程,为此需要设置两个显示缓冲区,一个用于保存当前屏幕显示的数据,另一个用于对当前数据的处理。到达换屏时间间隔后,切换当前显示缓冲区到数据已处理的显示缓冲区,然后对另一显示缓冲区进行数据处理。为了保证动态显示正常,最重要的问题是如何分配刷新显示屏的定时时间和显示缓冲区数据处理时间,保证二者的处理时间不冲突,本文采用的方法是使显示缓冲区的数据处理在多次定时中断程序执行之间的时间间隔内完成。
数据处理时间 = (定时中断时间 — 传数据时间)* 中断次数
这样只要合理的设定中断次数就可以保证换屏间隔时间内有足够的时间处理数据。 4.1.2 “左移”效果编程
在显示屏幕比较小的情况下,为了能显示更多的内容,普遍采用的方法是移位显示,移位显示广泛应用于条型显示屏,它的特点是可以显示的内容比屏幕大、显示效果良好、
24
编程简单等。以下将以条型显示屏(16*160)的左移方式编程为例,说明左移的实现方法:
一屏的数据为320个字节,那么我们先在数据存贮区里开辟640个字节的显示缓冲区(分为两个显存),一个用以保存当前要显示的内容,另一个用以数据处理。要实现左移的效果,原理是,每隔一段时间向显示缓冲区里加入一列数据,那么怎么实现加入一列的数据呢?其实就是,第一个字节左移一位,保存于 变量A中,第二个字节右移7位,保存于变量B中,A和B变量相或,再把结果保存于A中,这样就完成了第一个字节数据的处理,一行有16个字节的数据要处理,所以我们要设一个16次循环,如此循环16次后,便处理完了一行的数据,而每个字又有16行,所以我们再16次循环里再设一个16次的外循环,如此循环16次后,整屏的数据都处理完了,我们便启动更新信号,便可以交换显存了,显示程序就显示刚才处理好了的内容,接着CPU又对另一个显存作数据处理了,处理完后再交换显示。这样便可能动态的实现左移的效果了。具体源程序见附录。
4.1.3 “上升”效果编程
上升效果适合有一定宽度的显示屏,本设计屏宽度能同时显示两行汉字,式样效果一般,为了使读者能够有时间读懂显示屏的内容,在显示屏整屏信息显示时,让它静止显示两三秒,然后才继续滚动显示。其实现的方法是:设一个16次循环,在第一次循环里,显存只取显示内容的第一行数据,放到显存的最后一行里。在第二次循环里,显存取显示内容的第一行和第二行数据,第一行数据放到显存的第15行里,第二行数据放到显存的第16行里,如此下去,循环16次之后整屏的内容都显示出来了。停顿2秒钟,接下来进行第二个16次循环,第一次循环,移出第一屏信息的第一行,将第二行信息补上第一行,依次类推,直到把第一屏第十六行信息代替第十五行后,紧接着取第二屏信息的第一行数据补上第一屏的第十六行,就这样,第一屏信息每一次循环从第一行移出一行信息,而第二屏的信息从第十六行一次补上,直到第二个16次循环完成后,第一屏信息将为第二屏信息所代替。在每更新完一屏信息后,静止显示2秒钟,就这样循环下去,直到所有信息都显示完后又从第一屏开始显示。结而退出的方法也是差不多。 4.2 PC 机方主控软件的设计
主控软件主要进行两个方面的设计:一个是对汉字字库的提取显示;另一个是与单片机的串口通讯,主控计算机对显示屏的控制显示功能主要是通过计算机的串口实现。
25
4.2.1 字模字库的提取
1、汉字的表示及编码原理
计算机用编码的方式来处理和使用字符,英文在计算机机内是用一个ASCII码来表示,而中文汉字则由两个ASCII 码表示。为了解决区位码与西文字符相混淆的问题,就规定汉字在计算机中用内码表示,内码为两个字节,而且为了保证中西文兼容,即与ASCII 码的使用不发生冲突,所以汉字的两个字节的最高位均为1 。所以汉字内码与区位码之间的关系公式为:机内码高位=区码+A0H;机内码低位=位码+A0H。只要通过某个汉字的内码就可得到该汉字的区位码,也就得到了该汉字的字模。在软件设计中选用了UCDOS 5.0汉字系统中的16×16点阵字库Hzk16作为提取汉字字模的标准字库,同时ASC16为ASCII码字模的标准字库,其中每个汉字占有32 个字节的空间,汉字在字库中位置的计算公式为:
Location = [(机内码高位-&HA1)×94 + (机内码低位-&HA1)]×32。 (4.1)
2、取字模的设计及实现 汉字点阵的提取程序是用VC++6.0实现的。其流程如图4.4所示。其中以何种方式从字库文件中读取这32 个字节也是一个关键问题。由于二进制(Binary)方式访问文兼课以直接查看文件中指定的字节,而且二进制方式也是唯一支持用户件可以直接查看
文件中指定的字节,而且二进制方式也是唯一支持用户到文件的任何位置读写任意长度数据的方法,因而以二进制方式打开汉字字库文件是最适合的。而且程序也支持西文字符的显示,显示时也让其占用一个汉字的空间,不过它的点阵16x8的,所以不足部分
26
否全部识别结束? 是 计算出所处位置 取出连续16个字节并补充16字节的零数据存入数组 将连续32 个字节存入数组 否输入汉字? 是 转换为机内码 转换成ASC[[码 开始 打开HZK16和ASC16文计算出区位码 计算出所处位置 转换成对应显示类 型所需的点阵数组 图4.4 取模流程
就补零数据。
4.2.2 串口通信软件设计及其实现
1、串口通信简介
串行通讯端口在系统控制范畴中一直占有极重要的地位,不仅没有因为时代的进步而淘汰,反而在规格上愈来愈向其极限挑战,而且它具有连接设备种类多、实际操作简单、价格便宜等许多优点。现在计算机上的串行通讯端口(RS-232)是必要配备,通常有COM1与COM2 两个信道。其它一些介绍见上文第三章的有关内容。
2、VC下的具体实现[7]
VC的串行通信对象是将RS-232 的低阶动作予以封装,其串行组件为MsComm。MSComm 作为一个串行通讯控件为程序员串口通讯编程节省了很多时间。在基于对话框的应用中加入一个MSComm控件非常简单。只需进行以下操作即可:
打开“Project->Add To Project->Components and Controls->Registered Activex Controls”,然后选择控件:Microsoft Communication Control,version 6.0插入到当前的工程中。这样就将类 CMSComm 的相关文件 mscomm.cpp 和 mscomm.h 一并加入到了工程中。编程时只需将控件对话中的 MSComm 控件拖至你的应用对话框中就OK了。
对于单文档的工程应用,如果Project中的视类是基于CFormView的,创建MSComm类的方法和基于对话框的操作没什么两样。而如果视类不是基于CFormView的,那么创建MSComm类就和创建普通的ActiveX控件相类似。
由于MsComm属性众多,现对其重要属性说明如下:
CommPort:设定或传回通讯连接端口的代号,程序必须指定所要使用的串行端口号, Settings:设定初始化参数,以字符串形式设定或传回“波特率、奇偶校验、数据位、停止位参数”四个参数,其格式为\"BBBB,P,D,S\",BBBB 为波特率,P 为奇偶校验,D 为数据位数,S 为停止位数。value 的缺省值是:\"9600,N,8,1\"
PortOpen:设定或传回通讯连接端口的状态,在使用串行端口之前必须先打开端口,使用完毕之后也必须关掉端口。
Input:返回并删除输入缓冲区的数据,是一种FIFO机制。 InputLen:指定串行口读入的字符串长度。 Output:将字符串写入传输缓冲区。
27
HandShaking:指定通讯双方采用的握手协议。
Rthreshold:设定或返回引发接收事件的字符数,默认值为0,即无论缓冲区有多少字符均不引发接收事件。
InBufferCount:返回在接收缓冲区的字符数,可以设定为0 用来清除接收缓冲区。 InputMode:设定或返回Input属性取回的数据类型 串口初始化程序如下: 3.串口初始化: m_Comm.SetCommPort(1); m_Comm.SetInputMode(1); m_Comm.SetSettings(\"9600,n,8,1\"); m_Comm.SetRThreshold(1); m_Comm.SetInputLen(0); if(!m_Comm.GetPortOpen()) { } else
AfxMessageBox(“Open The Serial m_Comm.SetPortOpen(TRUE);
Port 1 Failurre!”); m_Comm.GetInput();
3、字模信息发送软件及其操作说明
基于MFC生成的程序界面如图4.5,通讯端口使用COM1,波特率为9600,N,8,1,单片机方面的串口也应初始化为特率为9600,N,8,1。连好通讯串口线后,启动软件,
28
注意软件必须与字库Hzk16和ASC16放在同一个文件夹,否则会出错。启动软件后,在文字编辑框内输入所要显示的内容,然后点击发送即可,发送数据时,在字模信息数据之前有一个文件头,两个字节分别为55H、AAH,可用于单片机方面存放数据的内存区的首地址的设定,将字模信息存入指定的RAM区。单片机显示控制时就在指定的RAM取数据。
图4.5 数据发送软件界面
结论
本设计的主要工作在于显示方式的确定、驱动电路的设计、软件设计。由于LED
29
显示屏的在硬件上实现的原理都差不多,主要是驱动、锁存芯片以及控制器件的选择,认识到作为一种显示器件实时信息更新的重要性,作者更注重软件的设计方面,从而也忽略了硬件方面功能的扩展,同时由于手工制作大板PCB的难度大,成功率不高,成本高,故作品的显示屏部分是买模块化的半成品,拼接而成的。设计过程的很多实验验证是自己制作的一片16*16点阵,只是128*32的一部分,不过用的扫描芯片和锁存芯片都与设计提到的一致,只是行驱动管改用PNP管8550。而显示过程,数据的锁入及显示都是模拟大屏,得到满意的效果。
设计过程中,由于接触的很多都是以前没有学过的新内容,如AVR单片机,Visual Basic 6.00,Visual C++ 6.0 ,WINAVR C的编程等等,时间紧,任务重。导致实现的功能还不够,完善,比如上位机控制软件还可以添加一些功能,如显示方式的控制,显示颜色的控制,打开一个文件或一幅图片进行发送等等,而在控制单元还可以增加日历时钟芯片,温度传感器,语音芯片等功能块,扩展显示屏的内容。同时笔者也深深地体会到,LED显示屏的设计应该遵循模块化的设计方法,先制作出64*16或80*16的模块,一一调试过后再拼接成更大的屏幕,而基于ATmega32的控制显示屏可以扩展到256*256,或者更大。
30
参考文献
[1] [2] [3] [4] [5] [6] [7] [8]
Macroblock. MBI5016.pdf datasheet [M]. May-2003 V1.6.
National Semiconductor. MM74HC138.pdf [M] datasheet. January 1988.
Vishay. Siliconix . SPICE Device Model Si4953DY.pdf[M]. datasheet . 18-May-04. ATmel .Corporation. ATmega16.pdf datasheet[M] .2001.
马 潮 等. ATmega8原理及应用手册[M].北京:清华大学出版社,2003:175-180. TOSHIBA . TB62706AN/AF.pdf datasheet[M].1999:2-16. 芯 艺 ..AVR 单片机与GCC 编程V 1.1 版[Z]..2004:6-10.
《电脑编程技巧与维护》杂志社 .Visual Basic 编程技巧典型案例解析[M].中国电力出版社,2005.204-208. [9]
吴双力,崔剑,王伯岭. AVR-GCC与单片机C语言开发[M]. 北京:北京航天航空出版社,2004:65-80.
[10] 吴金平 等. Visual C++ 6.0 编程与实践[M]. 中国水利水电出版社,2005:320-350. [11] 沈文 Eagle lee 詹卫前. AVR C语言开发入门指导[M]. 北京:清华大学出版社,
2003:100-112.
[12] 马 潮. ATmega128原理与开发应用指南(上)[M]. 北京:北京航天航空出版社,
2004:44-65.
[13] http://savannah.nongnu.org/projects/avr-libc/ . avr-libc-user-manual. 9 Oct 2006.
31
致谢
本毕业设计是在陈惠珊老师亲切关怀和悉心指导下完成的。从课题的选择到项目的最终完成,陈老师都始终给予我细心的指导和不懈的支持。在此谨向陈老师致以诚挚的谢意。
在此,我要感谢一起愉快的度过四年大学生活的同学们,以及教育过我的所有老师,正是你们的支持和帮助,我才能顺利的完成学业。特别感谢我的朋友谢树群同学,他在上位机软件的编程方面,给予我不少的帮助和支持,才使我能够顺利完成本设计。
同时,我还要感谢我的父母和家人,感谢他们给予我的支持,以及无微不至的关怀和照顾。
32
附录A 部分显示演示程序代码
//串口通讯,实时更新显示程序[5]
//包含所需头文件 #include #include #define uchar unsigned char #define uint unsigned int #define BIT(x) (1<<(x)) #define NOP() asm(\"nop\") #define WDR() asm(\"wdr\") #define FREQ 4 #define SER_PORT PORTD #define SER_DAT PD4 #define SER_RCK PD6 #define SER_SCK PD5 #define EN_disp PD3 #define chinese_number 5 //一行显示的汉字数 #define chinese 32 // 汉字32字节字模 #define asc 16 // asc16字节字模 #define frame_number 59 //显示屏数 //uchar g_aSendBuf[32]; //发送数据绶冲区 //uchar g_aRecvBuf[32]; //接收数据缓冲区 volatile uint c=0 ; //显示码缓存 uchar g_aDisplayBuf[] ={}; void DelayMs(uint t) { uint i; for(i=0;i //显示 void display_line(uint num,uchar line) { uchar i; uchar j; //发送显示码缓冲区 uchar buf[2*chinese_number]; SER_PORT&=~_BV(EN_disp); PORTC=line; //写入缓存区 for(j=0;j buf[2*j]=g_aDisplayBuf[num+j*chinese]; buf[2*j+1]=g_aDisplayBuf[num+j*chinese+1]; } //送到锁存器 for(i=0;i<10;i++) { ser_out(buf[9-i]); } //锁存显示 SER_PORT&=~_BV(SER_RCK); SER_PORT|=_BV(SER_RCK); SER_PORT|=_BV(EN_disp); DelayMs(1); } //翻页显示 void display_page(void) { uchar k,l,m; uint i,n; char j; j=15; n=0; i=0; for(m=0;m } } //上移显示 void display_scroll(void) { uchar k,l,m,c,b; uint i,n; char j; j=15; n=0; i=0; for(m=0;m<59;m++) { for(k=0;k<16;k++) { for(l=0;l<20;l++) { for(b=0;b<(16-k);b++) { i=160*n+2*(k+b); display_line(i,j); j-=1; } for(c=0;c 34 { PORTA = 0x00; } DDRA = 0x00; //串行发送结束中断服务程序 PORTB = 0x00; //#pragma interrupt_handler usart_tx_isr:14 DDRB = 0xFF; //void usart_tx_isr(void) PORTC = 0x00; DDRC = 0xFF; SIGNAL(SIG_USART_TRANS) PORTD = 0x00; { DDRD = 0x00; } } void init_devices(void) { //串口通信初始化 cli(); //禁止所有中断 void usart_init(void) MCUCR = 0x00; { MCUCSR = 0x80;//禁止JTAG GICR = 0x00; UCSRB = 0x00;//禁止中断 UCSRA = 0x00; port_init(); UCSRC = BIT(URSEL) | 0x06; usart_init(); UBRRL = 0x2F; sei(); //开全局中断 UBRRH = 0x00; } UCSRB = 0xD8; //主函数 } int main(void) { //串行接收结束中断服务程序 //#pragma interrupt_handler usart_rx_isr:12 init_devices(); //void usart_rx_isr(void) DDRD=_BV(SER_DAT)|_BV(SER_SCK)|_ BV(SER_RCK)|_BV(EN_disp); SIGNAL(SIG_USART_RECV) DDRC=0XFF; { PORTC=0Xff; while(1) if(c>=32) { c=0; display_page(); g_aRecvBuf[c++]=UDR; display_scroll(); } UDR=g_aRecvBuf[c]; } 以下为固化的FLASH-ROM源程序 *****************显示控制函数display.c************* /********************************************************/ ********************* //包含所需头文件 #include #include #include 编译器:WINAVR-20070122 #include \"common.h\" 时 钟: 外部7.3728MHz #include \"timer.h\" **************************************//定义点阵信息锁存控制引脚 35 #define LED_DG PD7 #define LED_DR PD4 #define LED_STB PD6 #define LED_CLK PD5 #define LED_PORT PORTD #define LED_DDR DDRD #define LED_EN PORTD|=_BV(PD3) #define LED_DS PORTD&=~_BV(PD3) //当前缓存区标志,用于二级缓存间的切换 uchar g_Currentbuf=0; uchar g_REDbuf1[16][16]; //红色缓存区1 uchar g_REDbuf2[16][16]; //红色缓存区2 uchar g_GREENbuf1[16][16]; //绿色缓存区1 uchar g_GREENbuf2[16][16]; //绿色缓存区2 //位检索 uchar Getbit(uchar *buf,uchar bit) { uchar i,ret; i=bit/8; bit%=8; bit=7-bit; if(buf[i]&(1< void Copybits(uchar * obj,uchar * sour,uchar bitindex,uchar len) { uchar i,j,k; for(i=0;i uchar * Getmembuffer(uchar color) { uchar * p; if(g_Currentbuf) { if(color==RED) p=(uchar *)g_REDbuf1; else p=(uchar *)g_GREENbuf1; } else { if(color==RED) p=(uchar *)g_REDbuf2; else p=(uchar *)g_GREENbuf2; } return p; } //位移动bitcount位的处理 void Wordbuffershift(uchar color,uchar bitcount) { uchar i; uint tmp; uchar *buf=Getmembuffer(color); for(i=0;i<16;i++) { tmp=buf[i*10]; tmp<<=8; tmp|=buf[i*10+1]; tmp<<=bitcount; buf[i*10]=tmp/256; buf[i*10+1]=tmp%256; } } 37 //将字模信息存入缓存区 void Pushwordtobuffer(uchar row,uchar color,PGM_P worddat) { uchar i,j,k; uchar m[2]; j=row/8; k=row%8; uchar * buf=Getmembuffer(color); for(i=0;i<16;i++) { m[0]=pgm_read_byte(worddat+i*2); m[1]=pgm_read_byte(worddat+i*2+1); if(row<(80-16)) Copybits(buf+i*10+j,m,k,16); else if(row<80) Copybits(buf+i*10+j,m,k,80-row); else return; } } //清除所选缓存区 void Clearmembuffer(uchar color) { uchar i; uchar * p=Getmembuffer(color); for(i=0;i<255;i++) p[i]=0; } //扫描线选择,由PORTC的低四口控制 void Selectline(uchar line) { uchar tmp=PORTC; tmp&=0xf0; tmp|=line; PORTC=tmp; } //写一个字节到一行 void Writelinebyte(uchar green_dat,uchar red_dat) { uchar i; for(i=0;i<8;i++) { if(red_dat&0x80) LED_PORT&=~_BV(LED_DR); else LED_PORT|=_BV(LED_DR); if(green_dat&0x80) LED_PORT&=~_BV(LED_DG); else LED_PORT|=_BV(LED_DG); green_dat<<=1; red_dat<<=1; LED_PORT&=~_BV(LED_CLK); LED_PORT|=_BV(LED_CLK); } } //写一行数据 void Writelinedata(uchar *gd,uchar *rd) { uchar i; for(i=0;i<10;i++) Writelinebyte(gd[i],rd[i]); LED_PORT&=~_BV(LED_STB); LED_PORT|=_BV(LED_STB); } //定时器t0溢出中断处理,用于行扫描 SIGNAL(SIG_OVERFLOW0) { TCNT0 = 0XE7; LED_DS; static uchar line=0; if(!g_Currentbuf) Writelinedata(g_GREENbuf1[line],g_REDbuf1[l 38 ine]); else Writelinedata(g_GREENbuf2[line],g_REDbuf2[line]); Selectline(line); LED_EN; if(++line>15) line=0; } //定时器T0的初始化 void Displayinit(void) { TCCR0=0x00;//停止定时器 TCCR0=_BV(CS02);//256分频 TCNT0=0XE7;//重装初值 TIMSK|=_BV(TOIE0);//中断允许 } //切换缓存区 void Brush(void) { g_Currentbuf=!g_Currentbuf; } //清除所有的缓存区 void Clear(void) { Clearmembuffer(RED); Clearmembuffer(GREEN); Brush(); Clearmembuffer(RED); Clearmembuffer(GREEN); } //静态显示函数,从第col列开始显示FLASH-ROM指针所指的WORDCOUNT个字 void Staticdisplaywords(uchar col,PGM_P flashpionter,uchar wordcount,uchar color) { uchar i; for(i=0;i break; Pushwordtobuffer(col+(i*16),color,flashpionter+i*32); } } //左移显示处理函数 void Scrolldisplaywords(PGM_P flashpointer,uint wordcount,uchar color) { uint k,j,i; uchar m; for(i=0;i 39 Pushwordtobuffer(m+j*16,color,flashpoint } er+k*32); Clear(); } } } Waittimer(); *******************主函数*********************** /************************************ } int main(void) 主函数main.c ************************************/ { //包含所需头文件 //定义端口 #include { #define FREQ 8 //系统时钟 //flash区点阵数组 for(i=0;i<89;i++)//翻页显示 const prog_char flash_array[][32]={ { /*-- 文字: 长 --*/ /*-- 黑体12; 此字体下对应的点阵为:宽x Staticdisplaywords(0,(PGM_P)flash_array+i*160高=16x16 --*/ 0x0C,0x00,0x0C,0x18,0x0C,0x30,0x0C,0x60,0,5,RED); x0C,0xC0,0x0C,0x00,0xFF,0xFE,0xFF,0xFE, Brush(); 0x0D,0x80,0x0C,0xC0,0x0C,0x60,0x0D,0x30, DelayMs(1000); 0x0F,0x1C,0x0E,0x0C,0x0C,0x00,0x00,0x00, } Clear(); }; //左移 Scrolldisplaywords((PGM_P) //一毫秒延时 void DelayMs(uint t) flash_array,443,RED); { uint i; } for(i=0;i /***************************** Timer.c void Settimer(uint ms) *****************************/ { #include 40 } TCCR1B=0; void Waittimer(void) TIFR|=_BV(TOV1); { } loop_until_bit_is_set(TIFR,TOV1); *********************头函数*************************** //timer.h #ifndef TIMER_H #define TIMER_H void Settimer(uint ms); void Waittimer(void); #endif // //common.h #ifndef COMMON_H #define COMMON_H #define uchar unsigned char #define uint unsigned int #define RED 1 #define GREEN 2 #define YELLOW 3 void DelayMs(uint t); #endif 41 附录B 系统的电路原理图 B.1 控制部分电路图 42 B.2驱动原理和部分点阵连接电路图 43 简介: LED驱动电源是把电源供应转换为特定的电压电流以驱动LED发光的电压转换器,通常情况下:LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。而LED驱动电源的输出则大多数为可随LED正向压降值变化而改变电压的恒定电流源。 特点: 根据电网的用电规则和LED驱动电源的特性要求,在选择和设计LED驱动电源时要考虑到以下几点: 1.高可靠性 特别像LED路灯的驱动电源,装在高空,维修不方便,维修的花费也大。 2.高效率 LED是节能产品,驱动电源的效率要高。对于电源安装在灯具内的结构,尤为重要。因为LED的发光效率随着LED温度的升高而下降,所以LED的散热非常重要。电源的效率高,它的耗损功率小,在灯具内发热量就小,也就降低了灯具的温升。对延缓LED的光衰有利。 3.高功率因素 功率因素是电网对负载的要求。一般70瓦以下的用电器,没有强制性指标。虽然功率不大的单个用电器功率因素低一点对电网的影响不大,但晚上大家点灯,同类负载太集中,会对电网产生较严重的污染。对于30瓦~40瓦的LED驱动电源,据说不久的将来,也许会对功率因素方面有一定的指标要求。 4.驱动方式 现在通行的有两种:其一是一个恒压源供多个恒流源,每个恒流源单独给每路LED供电。这种方式,组合灵活,一路LED故障,不影响其他LED的工作,但成本会略高一点。另一种是直接恒流供电,LED串联或并联运行。它的优点是成本低一点,但灵活性差,还要解决某个LED故障,不影响其他LED运行的问题。这两种形式,在一段时间内并存。多路恒流输出供电方式,在成本和性能方面会较好。也许是以后的主流方向。 5.浪涌保护 LED抗浪涌的能力是比较差的,特别是抗反向电压能力。加强这方面的保护也很重要。有些LED灯装在户外,如LED路灯。由于电网负载的启甩和雷击的感应,从电网系统会侵入各种浪涌,有些浪涌会导致LED的损坏。因此LED驱动电源要有抑制浪涌的侵入,保护LED不被损坏的能力。 6.保护功能 电源除了常规的保护功能外,最好在恒流输出中增加LED温度负反馈,防止LED 44 温度过高。 7.防护方面 灯具外安装型,电源结构要防水、防潮,外壳要耐晒。 8.驱动电源的寿命要与LED的寿命相适配。 9.要符合安规和电磁兼容的要求。 随着LED的应用日益广泛,LED驱动电源的性能将越来越适合LED的要求。 45 因篇幅问题不能全部显示,请点此查看更多更全内容