摘 要: 以USB2.0接口芯片CY7C68013A为核心,分别采用74HC138和74HC595构成行列控制电路驱动16×64 LED显示屏,实现高速、动态的显示图文信息。详细介绍了硬件电路、固件程序和应用程序的设计。实验结果表明,通过调用不同的字库,本系统可以动态地显示HZK16中的汉字、ASC16中的字符和对应尺寸的自定义图片。
关键词: USB; LED; 图文显示
LED显示屏可以动态地显示各种文字和图形图像,具有亮度高、功耗低、寿命长和性能稳定等优点,正受到广泛的重视并得到迅速的发展[1]。本系统的LED显示屏采用异步控制方式,即在PC上编辑好图文,通过USB总线传入LED屏,实现脱机自动播放。
USB自提出以来便得到各PC、PC外设和芯片制造厂商的广泛支持。USB最大的特点是支持即插即用和热插拔,允许多达127个外设同时连接至PC的一个USB接口上。目前,USB接口主要有USB1.1和USB2.0两种。本系统采用USB2.0接口,支持速率最高达480 Mb/s,实现数据高速传输。
本系统由硬件和软件组成,硬件包括USB2.0接口芯片外围电路和LED屏控制电路;软件包括固件程序和应用软件,其中,固件程序与系统硬件紧密相关,二者配合控制LED点阵的亮灭。由于设备CPU运行速度较慢且内存较小,因此固件程序应尽量简单。USB设备与PC的通信以及复杂的运算(如图文字模的提取等)都交由运行在PC的应用软件来实现。本系统采用了Cypress公司提供的通用驱动程序,也可用相关驱动程序开发工具自行定制。
1 硬件设计
1.1 接口芯片选择和外围电路
USB接口芯片大致可以分为单独运作的USB接口芯片、内含USB单元的微处理器和特定的接口转换芯片3类。其中,前两种芯片需要自行开发驱动程序,接口转换芯片可以利用虚拟串口等驱动程序缩短开发周期,但数据传输速率较低。与第二种芯片相比,第一种芯片的开发者需要面对应用和如何使用USB2.0两方面的工作,开发周期长,硬件集成度较低。
本系统采用内含USB单元的微处理器CY7C68013A,其优点是集成了USB2.0收发器、智能SIE、增强的8051微控制器和可编程的外围接口,数据传输率达到56 MB/s,可以硬件处理USB1.1和USB2.0协议,从而减少开发时间、确保USB的兼容性、提高硬件的集成度和可靠性[2]。
由于CY7C68013的集成度高,所以它的外围电路比较简单,主要有供电电路、串行I2C总线电路以及复位和唤醒电路。
串行I2C总线电路图1所示。其中,SDA和SCL分别为I2C总线的数据线和时钟线,因为是OC输出,所以需经2.2 kΩ上拉电阻接电源[4]。SDA接选择开关SW2,这是因为在固件程序调试初期,需要多次修改,可将编译好的HEX文件下载到CY7C68013A中的RAM中, 数据断电消失,调试比较方便,此时SW2处于断开位置;到后期,固件程序调试完毕,可将I2C文件固化在EEPROM中,利用I2C上电后自动从EEPROM中读入进行枚举,此时SW2处于图1所示位置,即接通。另外,EEPROM是电可擦除的,SW2与专用固件配合可以利用PC擦除已有数据,重新编程,提高了硬件的利用率。由于芯片已经将I2C总线集成,且采用的是24LC64(8 KB)的EEPROM,因此相应的地址线A2~A0为001。
1.2 LED屏驱动电路
LED显示屏可以采用点扫描、行扫描或列扫描[1]。本系统选用行扫描,即显示屏是一行一行地被点亮。虽然每次都只有一行亮,但由于人眼视觉暂留效应,看到的仍然是全屏稳定的图像。本系统需要分时驱动16行和64列LED点阵,若采用I/O口直接驱动的方法比较简单,但需要大量的I/O口。由于控制芯片 的I/O口个数有限,也考虑到今后扩展的需要,显示屏的行驱动选用3线-8线译码器74HC138,列驱动选用8 bit串行输入转并行输出移位寄存器芯片74HC595。这样就可以采用很少的I/O口控制尽量多的行和列。
行驱动由2片74HC138级联组成,共16个并行数据输出端,分别控制点阵模块的16个同名行。列驱动由8片74HC595组成,共64个输出端,分别控制点阵模块的同名列。部分电路如图2所示。
行驱动:U2为低位片,U3为高位片,A3~A0为4 bit译码输入端。列驱动: 4片74HC595一组,共两组。以第一组为例,DS1为串行数据输入端;第1片的Q7与第2片的DS连接,第2片的Q7与第3片的DS连接,以此类推至第4片。由于I/O口的驱动能力有限,列驱动采用了PNP型晶体管。晶体管发射极接电源,集电极接LED阳极,基极经限流电阻接74HC595输出端,这样利用晶体管的电流放大作用,仅需提供几毫安的驱动电流就可控制对应LED的亮灭了。
以显示第一行为例,首先,CY7C68013A将行驱动使能端置0,输出”0000”到行驱动的译码输入端。此时选通低位片,而高位片不工作,输出16 bit二进制为0xFFFE,使得第一行LED的阴极为低电平,其他行LED的阴极均为高电平。然后,CY7C68013A在SH_CP端产生64个连续的时钟脉冲上升沿,将本行对应的图文字模依次送入8个列移位寄存器中,并锁存在锁存器中,再在ST_CP端产生1个时钟脉冲上升沿,将字模并行输出到对应的64根列控制引脚线上,若该列的LED阳极为高电平,则对应的LED被点亮;若该列的LED阳极为低电平,则对应的LED为暗。同理,依次选择第2~16行,点亮对应的LED并循环,此时显示屏就会显示相应的图文。
2 软件设计
2.1 固件程序设计
固件程序是指运行在设备CPU中的程序,只有在该程序运行时,外设才能被称为具有给定功能的外部设备[2]。CY7C68013A开发包提供了固件程序框架和固件函数库[2],在Keil C51环境下编写,降低了开发难度,缩短了开发周期。本系统固件程序流程图如图3所示。
USB设备上电/复位后,工作分配器函数TD_Init()完成系统的初始化,主要包括对CY7C68013A 的I/O口和EP2端口、74HC138和74HC595的使能端的初始化。然后通过调用工作分配器函数TD_Poll()启动采样,判断是否有EP2OUT中断发生。若有中断发生,则首先判断EP2FIFOBUF[0],若等于0x00,则调用静态显示函数displaystatic(),将PC通过USB总线传来的数据放在EP2OUTBUF[1]~EP2OUTBUF[128]中,根据这些数据依次驱动LED显示屏的行和列,更新LED显示;若不等于0x00则调用对应的动态显示子函数,目前包括上下左右移动,今后还可以根据需要增加相应的效果函数。若没有中断发生,则继续等待,同时保持LED屏的显示。其中静态显示函数displaystatic()部分程序如下:
for(n=1;n<=16;n++)
{ chooseraw_138(n);//选择行
chooseline_5951(EP2FIFOBUF[i], EP2FIFOBUF[i+1]);
//第1个字模
chooseline_5951(EP2FIFOBUF[i+32],EP2FIFOBUF[i+
33]); //第2个字模
chooseline_5952(EP2FIFOBUF[i+64],EP2FIFOBUF[i+
65]); //第3个字模
chooseline_5952(EP2FIFOBUF[i+96],EP2FIFOBUF[i+
97]); //第4个字模
stcp1=0;stcp2=0; stcp1=1;stcp2=1;
//产生1个时钟脉冲上升沿
……}
2.2 应用软件设计
本系统涉及与USB通信的问题,因此采用了动态链接库(DLL)和应用程序相结合的方式编写应用软件。动态链接库通过调用相应的API函数,利用驱动程序建立与底层硬件的通信,应用程序为用户提供一个直观的软件界面方便操作[3]。本系统部分应用程序流程图如图4所示。
初始化后,调用DLL函数OPEN()打开USB设备。若要显示ASC16或HZK16字库中的文字,则首先判断首字节的ASCII码qh,若qh<128则以只读方式打开ASC16,代入式子offset=qh×16+1,根据offset(字库中字模的起始地址)将16 bit字模数据读入内存;若qh≥128,则接着读取第2个字节的ASCII码wh,打开HZK16,代入式子offset=(94×(qh-0xa0-1)+(wh-0xa0-1))×32,根据offset将32 bit字模数据读入内存。然后在软件界面上显示文字点阵,同时调用DLL函数OUTPUT()将处理好的字模数据以点阵信息的形式通过USB总线发送至下位机显示。若要显示自定义的图形(图中未画出),可以用鼠标左键单击的形式在软件界面上直接设计图形,或是读取自定义图文库ZDK16,将处理好的字模数据发送给下位机显示。最后调用DLL函数CLOSE()关闭USB设备。
本文设计的LED动态图文显示系统符合USB2.0协议标准,LED显示屏为16×64条屏(2块16×32条屏级联)它可以方便地与同类条屏级联组成更大的LED显示屏。通过调用不同的字库,本系统可以动态显示各种图文信息,显示效果如图5所示。
参考文献
[1] 诸昌钤.LED 显示屏系统原理及工程技术[M].成都: 电子科技大学出版社,2000.
[2] 许永和.EZ-USB FX系列单片机USB外围设备设计与应用[M]. 北京:北京航空航天大学出版社,2002.
[3] 张立科.Windows API程序设计参考大全[M].北京:人民邮电出版社, 2006.
[4] EZ-USB FX2 CY68013 Technical Reference Manual[DB/OL].Cypress Semiconductor 2001.