随着集成电路制造技术的不断发展,MCU、ARM、DSP等微控制器、微处理器的性能急剧提高,但是输出功能,尤其是显示和打印功能仍然比较薄
弱,与PC机相比有较大的差距。输出功能薄弱的缺点,限制了其应用范围的扩大。ATmega128是美国Atmel公司生产RISC 结构的高性能MCU芯片,含有ADC、I2C、SPI、PWM等多种资源 [1]。本论文以ATMEGA128单片机为例,结合CPLD和高速SRAM,介绍在VGA显示器上显示字符、图形信息和控制激光打印机打印输出屏幕信息的方法。本设计克服了单片机系统信息输出功能薄弱的缺点, 为单片机和其他嵌入式系统的信息输出提供了一个解决方案,使得其应用范围更加广阔。系统结构如图1所示。
1 VGA显示控制器的实现
PC机在VGA的显示器(通常包括CRT和液晶显示器)上的信息显示是通过显卡完成的。单片机在VGA显示器上显示信息同样需要类似的模块来辅助,因此我们设计了和显卡功能相似的VGA显示控制器来辅助ATMEGA128单片机在VGA显示器上显示信息。下面介绍 640×480分辨率、59.9HZ刷新率的通用VGA显示控制器的设计方法,并说明微控制器、微处理器如何在VGA接口的显示器上显示信息。
1.1 VGA时序产生模块的设计
要实现VGA显示控制器的功能,首先需要了解VGA信号的参数和时序。图2所示为640×480分辨率、59.9HZ刷新率的VGA时序图[2]。根据VGA时序图,本论文研究并实现了VGA显示控制器,所用硬件为Altera公司的EPM7128 CPLD和ISSI公司的高速SRAM。EPM7128的作用是通过编程产生VGA显示所需的时序信号,并协助微控制器实现对显存的读写操作。高速 SRAM的作用是存储需要显示的数据信息,其读写周期为8ns,满足显示器刷新时对显存进行快速读写的时间要求。设计中用一个bit代表一个象素,640×480分辨率需要37.5K字节的显存。象素时钟频率的选择与VGA监视器的刷新频率和分辨率相关,59.9HZ刷新率时,象素时钟频率为 25.175MHZ,其计算公式为:时钟频率=(行象素数+行消隐点数)×(一场行数+消隐行数)×刷新率。
根据VGA信号的要求,用VHDL语言对EPM7128芯片编程实现VGA时序产生模块。VGA时序产生模块包括:每行的象素数目计数器h_cnt、每场的行数目计数器v_cnt、行同步信号hs产生模块、场同步信号vs产生模块、消隐信号blank产生模块和并行输入串行输出模块等。其中, h_cnt的最大计数值是799, v_cnt的最计数值是是524。行同步信号产生模块根据h_cnt的计数值来产生行同步信号hs;场同步信号产生模块根据v_cnt的计数值来产生场同步信号vs。消隐信号产生模块根据h_cnt的计数值在行同步期间、行消隐前肩和行消隐后肩,把消隐信号blank置为低电平;根据v_cnt的计数值在每一场的场同步期间、场消隐前肩和场消隐后肩,把消隐信号blank置为低电平;其余时间消隐信号blank为高电平,表示此时为有效显示期。并行输入串行输出模块在有效显示期间从sram显存中并行读入数据,串行输出的显示器的红、绿、蓝信号线上。对该程序编译成功后用MaxplussII软件进行波形仿真,以验证设计的合理与否。最后设计完成的时序波形仿真如图3所示。
图 3 VGA显示控制器时序仿真图
从仿真波形图种可以看到每一显示行的时间为800个象素时钟周期,每场包括525行。行同步脉冲的宽度为96个象素时钟周期,场同步脉冲的宽度为2行。在行同步信号hs的行同步期间及其前肩和后肩,消隐信号blank为低电平,表示消隐期。在场同步信号vs的场同步期间及其前肩和后肩,消隐信号 blank同样为低电平,表示消隐期。仿真结果符合VGA标准时序,项目实际应用也证明了此结果的正确性。
1.2 VGA显示底层函数的编写
要在屏幕上显示信息,除VGA显示控制器之外,还需要并在ATMEGA128单片机上设计底层绘图函数并建立字符库。通常编写画线、画圆函数时,确定一个点是否在直线或圆上,需要乘、除法和开方运算,而画线、画圆函数调用最为频繁,因此计算量将大到难以接受的程度,极大降低系统的性能。为了克服上述缺点,在编写底层绘图函数时采用了图形学上的Bresenham void circle(unsigned int x0,unsigned int y0,unsigned int r,unsigned char color)
{
register int x,y,deltax,deltay,d;
x=0;y=r;deltax=3;deltay=2-r-r;d=1-r;
while(x<=y)
{ drawpixel(x0+x,y0+y,color);
drawpixel(x0-x,y0+y,color);
drawpixel(x0-x,y0-y,color);
drawpixel(x0+x,y0-y,color);
drawpixel(x0+y,y0+x,color);
drawpixel(x0-y,y0+x,color);
drawpixel(x0-y,y0-x,color);
drawpixel(x0+y,y0-x,color);
if(d<0){
d+=deltax; deltax+=2;
x++;
}
else {
d+=(deltax+deltay);
deltax+=2;deltay+=2;
x++;y--;
}
}
}
画线算法和中点画圆法[3],通过象素逼近,采用增量计算,使得确定点是否在直线或圆上的复杂运算变为加法运算,非常适合微控制器的特点,极大得提高了绘图速度。我们从Windows系统中提取了12×12和96×96象素的0~9数字字库,16×16象素的常用ASCII字符字库。有了底层绘图函数和字符库,ATMEGA128单片机便可通过VGA显示控制器实现在屏幕任意位置显示图形或者文字信息。右面是用ICCAVR编写的ATMEGA128在VGA显示器上实现中点画圆法的例程及其实现示意图。只需用增量法找到1/8圆上的点,其它点在中心对称位置。
2 激光打印机的控制
激光打印机是目前最常用输出设备之一,和热敏、喷墨打印机相比具有显著的优点,下面介绍用ATMEGA128微控制器直接控制激光打印机打印VGA显示器屏幕内容的方法。要控制打印机必须了解打印机命令语言。打印机语言指的是控制打印机工作的命令,它控制打印机如何组织被打印的文档,打印机按照这些命令来处理打印数据,并最终准确的打印出文字与图像。
2.1 PCL打印机命令语言
PCL打印机命令语言是世界上应用最为广泛的标准打印机命令语言,由惠普公司开发,支持文字、点阵图像和矢量图形的打印。PCL命令由2个以上的字符组成,总是以控制字符ESC开始,用符合EC 表示,其ASCII码为27,所以PCL命令又被 图 4 中点画圆法示意图
称作ESC序列。当打印机接收到字符EC时,表示开始接收一条控制命令。PCL命令包括“两字符”命令序列和“参数化”命令序列两种ESC序列。
“两字符”命令序列的格式如下:EC X,其中符号X代表ASCII码48~126的字符,即ASCII字符表中“0” 和“~”之间的字符。符号X指示打印机需要进行的操作,例如命令“EC E”是打印机复位命令,命令“EC g”把纸张的左边距和上边距复位成默认值。“参数化”命令序列格式如下:EC X y z1 # z2 # z3 ... # Zn[data] ,其中EC为起始字符,X是参数化字符,代表ASCII码33~47之间字符,其作用是指明该序列是“参数化”序列;y为组字符,代表ASCII码96~126之间字符,用来指定待执行的操作属于什么组;#是数值域,其范围从-32767到65535;z i是本命令的参数,代表ASCII码从96~126之间字符,该参数用于组合的“参数化”序列,非组合序列则不用,其作用是指定前面的数值域所用的参数;Zn是结束字符,表示“参数化”命令序列结束;[data] 是传送到打印机的待打印数据,用8个bit表示,即为0~255之间任意数据。下面两例分别是非组合的“参数化”命令序列和组合的“参数化”命令序:
12
1是非组合序列,不含参数。2是组合序列,由序列EC &l1O 和 EC&l2A组合而成,其中小写的字符“o”是该序列的参数[4]。各种命令序列的详细说明见参考文献[4]。
2.2 打印屏幕
ATMEGA128单片机的IO口和激光打印机的并口由如下信号连接: Strobe、Busy、GND、D0~D7共11根信号线。其中D0~D7是数据线,单片机通过数据线把控制打印机的PCL命令和待打印数据传送到打印机;Busy信号线指示打印机状态是否繁忙;Strobe 信号线是选通控制线,单片机在Strobe 信号线上输出一个低电平脉冲即可把D0~D7上的数据写人打印机。在论文的第一部分曾经提到,VGA显示器所显示的内容存储在SRAM显存中,每一个 bit代表一个象素,因此打印屏幕就是把显存中的数据打印出来。ATMEGA128单片机首先发送PCL语言的打印机设置命令,对打印进行设置,然后即可传送打印数据。其步骤如下:1、发打印机复位命令;2、发设置纸张大小命令;3、发设置打印的起始位置命令;4、发设置分辨率命令;5、发设置打印机为点阵图形模式命令;5、传送要打印的数据;6、发结束图形模式命令;7、发换页指令,打印当前页。下面是ATMEGA128单片机对HP LASERJET6L激光打印机发送PCL命令,并控制打印机打印输出VGA屏幕信息的例程:
void print()
{unsigned int M; unsigned char i;
unsigned char xdata *p;p=NVRS;
out(27);out('E');//打印机复位
out(27); pprint("&l26A");// 设置纸张为A4
out(27); pprint("*p210X");// '设置本页打印的X坐标起始位置
out(27); pprint("*p400Y");// '设置本页打印的Y坐标起始位置
out(27); pprint("*t100R");// '设置分辨率
out(27); pprint("*r1A");// '设置图形模式开始
for(M=0;M<480;M++) //传送要打印的图形数据
{ out(27); pprint("*b80W");
…………
out(27); pprint("*rC"); // '图形模式结束
out(255); out(12);//'本页结束,执行打印
}
结论:
本文的创新点是用ATMEGA128单片机结合CPLD实现了对VGA显示器和激光打印机的控制,使单片机可以在VGA接口的显示器上显示图形、文字信息,并控制激光打印机把VGA屏幕上的信息打印输出。本设计克服了单片机控制系统的信息显示和打印功能薄弱的缺点,使其在发挥控制功能优势的基础上,还具有了实用的显示和打印功能,为扩大其应用范围奠定了基础。此外,本设计中用到的ATMEGA128的接口为GPIO口和 Intel格式的标准总线,因此可以方便得移植到其他类型的芯片中,为其它系统的信息显示和打印提供了参考方案,本设计已经成功移植到了 TMS320C6713 DSP芯片上[5]。
参考文献
[1] Atmel. 8-bit AVR Microcontroller with 128K Bytes In-System Programmable Flash2001
[2] 曹允. 基于FPGA的VGA时序彩条信号实现方 法及其应用. 电子技术应用.Vol.28 No.7 2002
[3] 孙家广等. 计算机图形学. 清华大学出版社, 2002
[4] 惠普公司. PCL5 Printer Language Technical Reference Manual First Edition. 1992
[5] 何明星等. Max7000系列可编程器件在DSP系统设计中应用 微计算机信息2003年19卷6期25-26页