基于AVR的VGA顯示和激光打印系統(tǒng)
摘要:用ATMEGA128單片機(jī)結(jié)合CPLD實(shí)現(xiàn)了對(duì)VGA顯示器和激光打印機(jī)的控制,完成了在VGA顯示器上實(shí)時(shí)顯示字符和圖形的功能,并控制激光打印機(jī)實(shí)現(xiàn)了屏幕信息的打印輸出。本設(shè)計(jì)克服了單片機(jī)系統(tǒng)顯示和打印功能薄弱的缺點(diǎn),為擴(kuò)大其應(yīng)用范圍奠定了基礎(chǔ),同時(shí)也為其他嵌入式系統(tǒng)的信息輸出提供了一種解決方案。
關(guān)鍵詞:VGA控制器;PCL命令語言;激光打??;CPLD
隨著集成電路制造技術(shù)的不斷發(fā)展,MCU、ARM、DSP等微控制器、微處理器的性能急劇提高,但是輸出功能,尤其是顯示和打印功能仍然比較薄弱,與PC機(jī)相比有較大的差距。輸出功能薄弱的缺點(diǎn),限制了其應(yīng)用范圍的擴(kuò)大。ATmega128是美國Atmel公司生產(chǎn)RISC 結(jié)構(gòu)的高性能MCU芯片,含有ADC、I2C、SPI、PWM等多種資源 [1]。本論文以ATMEGA128單片機(jī)為例,結(jié)合CPLD和高速SRAM,介紹在VGA顯示器上顯示字符、圖形信息和控制激光打印機(jī)打印輸出屏幕信息的方法。本設(shè)計(jì)克服了單片機(jī)系統(tǒng)信息輸出功能薄弱的缺點(diǎn), 為單片機(jī)和其他嵌入式系統(tǒng)的信息輸出提供了一個(gè)解決方案,使得其應(yīng)用范圍更加廣闊。系統(tǒng)結(jié)構(gòu)如圖1所示。
1 VGA顯示控制器的實(shí)現(xiàn)
PC機(jī)在VGA的顯示器(通常包括CRT和液晶顯示器)上的信息顯示是通過顯卡完成的。單片機(jī)在VGA顯示器上顯示信息同樣需要類似的模塊來輔助,因此我們?cè)O(shè)計(jì)了和顯卡功能相似的VGA顯示控制器來輔助ATMEGA128單片機(jī)在VGA顯示器上顯示信息。下面介紹640×480分辨率、59.9HZ刷新率的通用VGA顯示控制器的設(shè)計(jì)方法,并說明微控制器、微處理器如何在VGA接口的顯示器上顯示信息。
1.1 VGA時(shí)序產(chǎn)生模塊的設(shè)計(jì)
要實(shí)現(xiàn)VGA顯示控制器的功能,首先需要了解VGA信號(hào)的參數(shù)和時(shí)序。圖2所示為640×480分辨率、59.9HZ刷新率的VGA時(shí)序圖[2]。根據(jù)VGA時(shí)序圖,本論文研究并實(shí)現(xiàn)了VGA顯示控制器,所用硬件為Altera公司的EPM7128 CPLD和ISSI公司的高速SRAM。EPM7128的作用是通過編程產(chǎn)生VGA顯示所需的時(shí)序信號(hào),并協(xié)助微控制器實(shí)現(xiàn)對(duì)顯存的讀寫操作。高速SRAM的作用是存儲(chǔ)需要顯示的數(shù)據(jù)信息,其讀寫周期為8ns,滿足顯示器刷新時(shí)對(duì)顯存進(jìn)行快速讀寫的時(shí)間要求。設(shè)計(jì)中用一個(gè)bit代表一個(gè)象素,640×480分辨率需要37.5K字節(jié)的顯存。象素時(shí)鐘頻率的選擇與VGA監(jiān)視器的刷新頻率和分辨率相關(guān),59.9HZ刷新率時(shí),象素時(shí)鐘頻率為25.175MHZ,其計(jì)算公式為:時(shí)鐘頻率=(行象素?cái)?shù)+行消隱點(diǎn)數(shù))×(一場行數(shù)+消隱行數(shù))×刷新率。
根據(jù)VGA信號(hào)的要求,用VHDL語言對(duì)EPM7128芯片編程實(shí)現(xiàn)VGA時(shí)序產(chǎn)生模塊。VGA時(shí)序產(chǎn)生模塊包括:每行的象素?cái)?shù)目計(jì)數(shù)器h_cnt、每場的行數(shù)目計(jì)數(shù)器v_cnt、行同步信號(hào)hs產(chǎn)生模塊、場同步信號(hào)vs產(chǎn)生模塊、消隱信號(hào)blank產(chǎn)生模塊和并行輸入串行輸出模塊等。其中, h_cnt的最大計(jì)數(shù)值是799, v_cnt的最計(jì)數(shù)值是是524。行同步信號(hào)產(chǎn)生模塊根據(jù)h_cnt的計(jì)數(shù)值來產(chǎn)生行同步信號(hào)hs;場同步信號(hào)產(chǎn)生模塊根據(jù)v_cnt的計(jì)數(shù)值來產(chǎn)生場同步信號(hào)vs。消隱信號(hào)產(chǎn)生模塊根據(jù)h_cnt的計(jì)數(shù)值在行同步期間、行消隱前肩和行消隱后肩,把消隱信號(hào)blank置為低電平;根據(jù)v_cnt的計(jì)數(shù)值在每一場的場同步期間、場消隱前肩和場消隱后肩,把消隱信號(hào)blank置為低電平;其余時(shí)間消隱信號(hào)blank為高電平,表示此時(shí)為有效顯示期。并行輸入串行輸出模塊在有效顯示期間從sram顯存中并行讀入數(shù)據(jù),串行輸出的顯示器的紅、綠、藍(lán)信號(hào)線上。對(duì)該程序編譯成功后用MaxplussII軟件進(jìn)行波形仿真,以驗(yàn)證設(shè)計(jì)的合理與否。最后設(shè)計(jì)完成的時(shí)序波形仿真如圖3所示。
圖 3 VGA顯示控制器時(shí)序仿真圖
從仿真波形圖種可以看到每一顯示行的時(shí)間為800個(gè)象素時(shí)鐘周期,每場包括525行。行同步脈沖的寬度為96個(gè)象素時(shí)鐘周期,場同步脈沖的寬度為2行。在行同步信號(hào)hs的行同步期間及其前肩和后肩,消隱信號(hào)blank為低電平,表示消隱期。在場同步信號(hào)vs的場同步期間及其前肩和后肩,消隱信號(hào)blank同樣為低電平,表示消隱期。仿真結(jié)果符合VGA標(biāo)準(zhǔn)時(shí)序,項(xiàng)目實(shí)際應(yīng)用也證明了此結(jié)果的正確性。
1.2 VGA顯示底層函數(shù)的編寫
要在屏幕上顯示信息,除VGA顯示控制器之外,還需要并在ATMEGA128單片機(jī)上設(shè)計(jì)底層繪圖函數(shù)并建立字符庫。通常編寫畫線、畫圓函數(shù)時(shí),確定一個(gè)點(diǎn)是否在直線或圓上,需要乘、除法和開方運(yùn)算,而畫線、畫圓函數(shù)調(diào)用最為頻繁,因此計(jì)算量將大到難以接受的程度,極大降低系統(tǒng)的性能。為了克服上述缺點(diǎn),在編寫底層繪圖函數(shù)時(shí)采用了圖形學(xué)上的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--; } } } |
2 激光打印機(jī)的控制
激光打印機(jī)是目前最常用輸出設(shè)備之一,和熱敏、噴墨打印機(jī)相比具有顯著的優(yōu)點(diǎn),下面介紹用ATMEGA128微控制器直接控制激光打印機(jī)打印VGA顯示器屏幕內(nèi)容的方法。要控制打印機(jī)必須了解打印機(jī)命令語言。打印機(jī)語言指的是控制打印機(jī)工作的命令,它控制打印機(jī)如何組織被打印的文檔,打印機(jī)按照這些命令來處理打印數(shù)據(jù),并最終準(zhǔn)確的打印出文字與圖像。
2.1 PCL打印機(jī)命令語言
PCL打印機(jī)命令語言是世界上應(yīng)用最為廣泛的標(biāo)準(zhǔn)打印機(jī)命令語言,由惠普公司開發(fā),支持文字、點(diǎn)陣圖像和矢量圖形的打印。PCL命令由2個(gè)以上的字符組成,總是以控制字符ESC開始,用符合EC 表示,其ASCII碼為27,所以PCL命令又被
圖 4 中點(diǎn)畫圓法示意圖 |
“兩字符”命令序列的格式如下:EC X,其中符號(hào)X代表ASCII碼48~126的字符,即ASCII字符表中“0” 和“~”之間的字符。符號(hào)X指示打印機(jī)需要進(jìn)行的操作,例如命令“EC E”是打印機(jī)復(fù)位命令,命令“EC g”把紙張的左邊距和上邊距復(fù)位成默認(rèn)值。“參數(shù)化”命令序列格式如下:EC X y z1 # z2 # z3 ... # Zn[data] ,其中EC為起始字符,X是參數(shù)化字符,代表ASCII碼33~47之間字符,其作用是指明該序列是“參數(shù)化”序列;y為組字符,代表ASCII碼96~126之間字符,用來指定待執(zhí)行的操作屬于什么組;#是數(shù)值域,其范圍從-32767到65535;z i是本命令的參數(shù),代表ASCII碼從96~126之間字符,該參數(shù)用于組合的“參數(shù)化”序列,非組合序列則不用,其作用是指定前面的數(shù)值域所用的參數(shù);Zn是結(jié)束字符,表示“參數(shù)化”命令序列結(jié)束;[data] 是傳送到打印機(jī)的待打印數(shù)據(jù),用8個(gè)bit表示,即為0~255之間任意數(shù)據(jù)。下面兩例分別是非組合的“參數(shù)化”命令序列和組合的“參數(shù)化”命令序:
1 2
1是非組合序列,不含參數(shù)。2是組合序列,由序列EC &l1O 和 EC&l2A組合而成,其中小寫的字符“o”是該序列的參數(shù)[4]。各種命令序列的詳細(xì)說明見參考文獻(xiàn)[4]。
2.2 打印屏幕
ATMEGA128單片機(jī)的IO口和激光打印機(jī)的并口由如下信號(hào)連接: Strobe、Busy、GND、D0~D7共11根信號(hào)線。其中D0~D7是數(shù)據(jù)線,單片機(jī)通過數(shù)據(jù)線把控制打印機(jī)的PCL命令和待打印數(shù)據(jù)傳送到打印機(jī);Busy信號(hào)線指示打印機(jī)狀態(tài)是否繁忙;Strobe 信號(hào)線是選通控制線,單片機(jī)在Strobe 信號(hào)線上輸出一個(gè)低電平脈沖即可把D0~D7上的數(shù)據(jù)寫人打印機(jī)。在論文的第一部分曾經(jīng)提到,VGA顯示器所顯示的內(nèi)容存儲(chǔ)在SRAM顯存中,每一個(gè)bit代表一個(gè)象素,因此打印屏幕就是把顯存中的數(shù)據(jù)打印出來。ATMEGA128單片機(jī)首先發(fā)送PCL語言的打印機(jī)設(shè)置命令,對(duì)打印進(jìn)行設(shè)置,然后即可傳送打印數(shù)據(jù)。其步驟如下:1、發(fā)打印機(jī)復(fù)位命令;2、發(fā)設(shè)置紙張大小命令;3、發(fā)設(shè)置打印的起始位置命令;4、發(fā)設(shè)置分辨率命令;5、發(fā)設(shè)置打印機(jī)為點(diǎn)陣圖形模式命令;5、傳送要打印的數(shù)據(jù);6、發(fā)結(jié)束圖形模式命令;7、發(fā)換頁指令,打印當(dāng)前頁。下面是ATMEGA128單片機(jī)對(duì)HP LASERJET6L激光打印機(jī)發(fā)送PCL命令,并控制打印機(jī)打印輸出VGA屏幕信息的例程:
void print()
{unsigned int M; unsigned char i;
unsigned char xdata *p;p=NVRS;
out(27);out('E');//打印機(jī)復(fù)位
out(27); pprint("&l26A");// 設(shè)置紙張為A4
out(27); pprint("*p210X");// '設(shè)置本頁打印的X坐標(biāo)起始位置
out(27); pprint("*p400Y");// '設(shè)置本頁打印的Y坐標(biāo)起始位置
out(27); pprint("*t100R");// '設(shè)置分辨率
out(27); pprint("*r1A");// '設(shè)置圖形模式開始
for(M=0;M<480;M++) //傳送要打印的圖形數(shù)據(jù)
{ out(27); pprint("*b80W");
…………
out(27); pprint("*rC"); // '圖形模式結(jié)束
out(255); out(12);//'本頁結(jié)束,執(zhí)行打印
}
結(jié)論:
本文的創(chuàng)新點(diǎn)是用ATMEGA128單片機(jī)結(jié)合CPLD實(shí)現(xiàn)了對(duì)VGA顯示器和激光打印機(jī)的控制,使單片機(jī)可以在VGA接口的顯示器上顯示圖形、文字信息,并控制激光打印機(jī)把VGA屏幕上的信息打印輸出。本設(shè)計(jì)克服了單片機(jī)控制系統(tǒng)的信息顯示和打印功能薄弱的缺點(diǎn),使其在發(fā)揮控制功能優(yōu)勢的基礎(chǔ)上,還具有了實(shí)用的顯示和打印功能,為擴(kuò)大其應(yīng)用范圍奠定了基礎(chǔ)。此外,本設(shè)計(jì)中用到的ATMEGA128的接口為GPIO口和Intel格式的標(biāo)準(zhǔn)總線,因此可以方便得移植到其他類型的芯片中,為其它系統(tǒng)的信息顯示和打印提供了參考方案,本設(shè)計(jì)已經(jīng)成功移植到了TMS320C6713 DSP芯片上[5]。
參考文獻(xiàn)
[1] Atmel. 8-bit AVR Microcontroller with 128K Bytes In-System Programmable Flash2001
[2] 曹允. 基于FPGA的VGA時(shí)序彩條信號(hào)實(shí)現(xiàn)方 法及其應(yīng)用. 電子技術(shù)應(yīng)用.Vol.28 No.7 2002
[3] 孫家廣等. 計(jì)算機(jī)圖形學(xué). 清華大學(xué)出版社, 2002
[4] 惠普公司. PCL5 Printer Language Technical Reference Manual First Edition. 1992
[5] 何明星等. Max7000系列可編程器件在DSP系統(tǒng)設(shè)計(jì)中應(yīng)用 微計(jì)算機(jī)信息2003年19卷6期25-26頁