2 显示原理及控制方式分析2.1 LED点阵模块结构八十年代以来出现了组合型LED点阵显示器模块,以发光二极管为像素,它用高亮度发光二极管芯阵列组合后,环氧树脂和塑模封装而成这种一体化封装的点阵LED模块,具有高亮度、引脚少、视角大、寿命长、耐湿、耐冷热、耐腐蚀等特点LED点阵规模常见的有44、48、57、58、88、1616等等根据像素颜色的数目可分为单色、双基色、三基色等像素颜色不同,所显示的文字、图象等内容的颜色也不同单色点阵只能显示固定色彩如红、绿、黄等单色,双基色和三基色点阵显示内容的颜色由像素内不同颜色发光二极管点亮组合方式决定,如红绿都亮时可显示黄色,如果按照脉冲方式控制二极管的点亮时间,则可实现256或更高级灰度显示,即可实现真彩色显示图2.1示出最常见的88单色LED点阵显示器的内部电路结构和外型规格,其它型号点阵的结构与引脚可试验获得 图2.1 88单色LED模块内部电路LED点阵显示器单块使用时,既可代替数码管显示数字,也可显示各种中西文字及符号.如5x7点阵显示器用于显示西文字母.58点阵显示器用于显示中西文,8x8点阵可以用于显示简单的中文文字,也可用于简单图形显示。
用多块点阵显示器组合则可构成大屏幕显示器,但这类实用装置常通过PC机或单片机控制驱动2.2 LED 动态显示原理 LED点阵显示系统中各模块的显示方式: 有静态和动态显示两种静态显示原理简单、控制方便,但硬件接线复杂,在实际应用中一般采用动态显示方式,动态显示采用扫描的方式工作,由峰值较大的窄脉冲电压驱动,从上到下逐次不断地对显示屏的各行进行选通,同时又向各列送出表示图形或文字信息的列数据信号,反复循环以上操作,就可显示各种图形或文字信息点阵式LED汉字广告屏绝大部分是采用动态扫描显示方式,这种显示方式巧妙地利用了人眼的视觉暂留特性将连续的几帧画面高速的循环显示,只要帧速率高于24帧/秒,人眼看起来就是一个完整的,相对静止的画面最典型的例子就是电影放映机在电子领域中,因为这种动态扫描显示方式极大的缩减了发光单元的信号线数量,因此在LED显示技术中被广泛使用以88点阵模块为例,说明一下其使用方法及控制过程图2.1中,红色水平线Y0、Y1……Y7叫做行线,接内部发光二极管的阳极,每一行8个LED的阳极都接在本行的行线上相邻两行线间绝缘同样,蓝色竖直线X0、X1……X7叫做列线,接内部每列8个LED的阴极,相邻两列线间绝缘。
在这种形式的LED点阵模块中,若在某行线上施加高电平(用“1”表示),在某列线上施加低电平(用“0”表示)则行线和列线的交叉点处的LED就会有电流流过而发光比如,Y7为1,X0为0,则右下角的LED点亮再如Y0为1,X0到X7均为0,则最上面一行8个LED全点亮现描述一下用动态扫描显示的方式,显示字符“B”的过程其过程如图2.2图2.2 用动态扫描显示字符“B”的过程假设X,Y为两个8位宽的字节型数据,X的每位对应LED模块的8根列线X7-X0,同样Y的每位对应LED模块的8根行线Y7-Y0在这个示例中,Y叫行扫描线,行扫描线在每个时刻只有一根线为“1”即有效行选通电平,X叫列数据线,其内容就是点阵化的字模数据的体现下面用伪代码描述动态显示的过程1).Y=0x01,X=0xFF,如图 2.2第一帧;(2).Y=0x02,X=0x87,如图 2.2第二帧;(3).Y=0x04,X=0xBB,如图 2.2第三帧;(4).Y=0x08,X=0xBB,如图 2.2第四帧;(5).Y=0x10,X=0x87,如图 2.2第五帧;(6).Y=0x20,X=0xBB,如图 2.2第六帧;(7).Y=0x40,X=0xBB,如图 2.2第七帧;(8).Y=0x80,X=0x87,如图 2.2第八帧;(9).跳到第(1)步循环。
如果高速地进行(1)到(9)的循环,且两个步骤间的间隔时间小于1/24秒,由于视觉暂留LED显示屏上将呈现出一个完整的“B”字符这就是动态扫描的原理只不过实际运用的时候,列线和行线通常不止8位,还要根据列线和行线的数量来决定是用行线或列线来做扫描线例如0601条屏(每行6个汉字,共1行),行线有16根,列线有96根如果用列线来做扫描线,则每列LED在每96次循环扫描中只可能亮一次,则其发光视觉平均亮度为直流亮度的1/96如果用行线来做扫描线,则每16次循环,每行LED就能亮一次,其发光视觉平均亮度为直流情况下的1/16可见,用行线做扫描线,因为其发光周期的占空比较大,其视觉亮度是用列线做扫描线的6倍因而发光效率比前者高在实际运用的时候,还要在每两帧之间加上合适的延时,以使人眼能清晰的看见发光在帧切换的时候还要加入余辉消除处理比如先将扫描线全部设置为无效电平,送下一行的列数据后再选通扫描线,避免出现尾影3.1 显示单元的考虑显示一个简体汉字,至少需要1616点阵来描述为了在较远距离处获得清晰的视觉效果,本设计采用4个88点阵,像素直径5mm的LED模块拼接成1616点阵的LED阵列这样每个1616汉字能够获得1212cm的显示尺寸,因此在50米处仍能清晰阅读。
3.7 总体电路结构及工作原理3.7.1 硬件电路框图通过前面对各种方案的比较与分析,初步构建硬件系统框图如图3.1图3.1 LED显示屏硬件框图在图3.1中,X0、X1—Xn为显示单元每个显示单元由一个1616点阵的LED模块和一个16位宽的移位锁存器(串行—并行转换器)构成所有显示单元的16根行线均连接到公共的行扫描驱动电路而每个显示单元的列数据则由16位移位锁存器并行输出口提供中央微处理器MCU负责与所有外围设备的协调通信,以及各种算法的处理MCU用通用I/O口来驱动行扫描驱动电路用通用I/O口模拟同步串行接口以实现和列数据锁存器(移位锁存器)之间的单向通信MCU通过内部集成的SPI接口和字库芯片进行双向通信PC机(上位机)的RS-232C电平经过转换后,通过UART接口与MCU进行双向通信电源则为各个模块提供稳定的电压以及足够的电流3.7.2 工作原理单片机上电后就检测单片机P3.2脚(DownLoad)的电平,如果按住LED显示屏上的“DownLoad”键开机,则单片机P3.2脚被强制拉为低电平,显示屏被引导进入下载模式这时单片机把UART异步串行口初始化为“方式一”工作,波特率为115200bps。
之后不断检测从UART传入的数据,如果连续接收到的两字节数据与程序中约定的两字节数据帧同步码(0xA0,0xFA)相同则判定下载命令合法,真正进入下载流程设置两字节同步码是为了降低误码干扰的概率进入下载流程后,擦除连续从0x2600地址开始的5个E2PROM扇区,每个扇区512字节然后连续接收上位机发出的7字节设置数据,并从E2PROM第一个扇区首地址0x2600开始依次存放这样,第一个扇区就保存了上位机对下位机的所有设置数据,包括刷新率,移动速度,显示模式以及总共需要显示的字符数等等保存好以上7字节的设置数据后,紧接着连续地接收上位机发出的不大于2048个内码数据,并依次保存在第二个E2PROM扇区中因为第二到第五扇区是连续编址的,所以第二扇区存满后会自动存放在第三扇区,以次类推汉字内码的数据量由上位机确定当单片机接收到下载结束符0x8F时,执行软件复位,强迫程序在AP区从头运行这时若仍然按住“DownLoad”键,则再一次进入下载模式如果开机的时候不按下“DownLoad”键,则单片机程序被引导进入显示模式进入显示模式后,首先把单片机的SPI接口初始化为“空闲低电平/上升沿驱动”模式,为读写字库芯片作准备。
在单片机内部的扩展数据存储器(xdata区)中开辟192字节(1536位)动态显示缓冲区Display_Buffer和32字节的字模数据缓存区Temp_Buffer,两个缓存区编址连续Display_Buffer中的一位与LED的一个点阵一一对应详细对应关系见章节5.3.1——显示缓存技术与映射关系)经过这样的映射处理,使字符在显示中的移动算法变得简单灵活,不论进行何种显示效果处理,只需要对Display_Buffer进行操作遵循结构化的程序设计思路把单片机的在显示模式的所有工作量分为以下三个任务: 一.扫描显示任务:扫描显示任务负责把Display_Buffer中的数据依次发送到列驱动器74HC595,并按严格的时序高电平选通十六根行扫描线(Y0—Y15),使每一列数据对应着一个行线状态二.移动处理任务:移动处理任务负责完成显示字符逐点阵向左移动的算法处理,这是最基本的显示效果其它大部分显示效果如左移六字暂停,全屏定格显示等都是以逐位左移为基础对显示字符的移动,实质上是对显示缓冲区Display_Buffer内数据的移动该算法是将Display_Buffer和Temp_Buffer中的数据首尾相接地左移一位,并不断把Temp_Buffer移入Display_Buffe。
三.字符更新任务:在单片机的xdata区开辟了32字节的字模数据缓存区Temp_Buffer该缓存区与Display_Buffer编址连续当调用字符更新任务时,程序从E2PROM内码区指定位置读取相邻两字节的汉字内码数据并通过一定的算法,把内码数据变换为该内码对应汉字的字模数据在字库芯片中的地址单片机通过SPI接口,向字库芯片发送读命令和地址,字库芯片返回连续32字节的全角汉字字模数据或16字节的ASCII半角字模数据这些字模数据就存储在32字节的字模数据缓存区中字模数据缓存区Temp_Buffer中的数据可通过调用移动处理任务而逐位转移至动态显示缓冲区Display_Buffer中三个任务彼此独立,又相互联系下面用实际的C51程序来说明一下如何实现简单的左移显示效果void Dis_Mode_1(void)//左移显示效果{ unsigned char i,j,k; unsigned int n; unsigned int strings; while(1)//所有显示效果都是无限循环 { for(n=0;n< CNT;n+=2)// CNT是字符总数,每字符内码2字节,所以以2步进 { strings =EEPROM_read (ADDR_GB2312+n); //从EEPROM中读取内码高字节 strings<<=8; //左移8位以合成16位数据 strings +=EEPROM_read (ADDR_GB2312+n+1); //从EEPROM中读取内码低字节 k=Load_Next_Charctor(strings);//调用更新字符任务,半角返回8全角返回16 for(i=0;i