點陣液晶屏畫豎線算法的優(yōu)化及應(yīng)用
液晶顯示屏(liquid crystal display,LCD) 因具有低功耗、體積小、重量輕、壽命長、顯示信息量大、無閃爍等諸多特點,被廣泛應(yīng)用于各種顯示領(lǐng)域。在通訊設(shè)備、家用電器、儀器儀表等產(chǎn)品中,其顯示部件也越來越多采用了各種小尺寸的液晶顯示模塊(LCD Module,LCM)。液晶顯示模塊根據(jù)顯示方式可分為段位型、字符型和點陣型三種。其中點陣液晶顯示模塊由于既能顯示字符,又能顯示各種圖形,被廣泛應(yīng)用于對圖文顯示要求相對較高的場合中。在進行圖形用戶界面設(shè)計時,矩形、圓、橢圓等都是常用的圖形元素,繪圖時都可通過調(diào)用畫點函數(shù)來實現(xiàn)。但對于單片機控制的小尺寸LCM 來說,當(dāng)繪制的圖形點數(shù)較多(如內(nèi)部填充的圖形),如采用畫點函數(shù)來繪制每個點,運行速度會比較慢。如我們根據(jù)LCM 內(nèi)部顯示存儲器結(jié)構(gòu)特點對畫豎線程序進行優(yōu)化,采用優(yōu)化的畫豎線程序來繪制這些內(nèi)部填充的基本圖形,將可以大大提高程序的運行速度。本文將以STC90C52RC 單片機控制128(列)×64(行)點陣液晶顯示模塊(TG12864B)為例,根據(jù)LCM 的存儲器結(jié)構(gòu)特點,對其畫豎線程序進行優(yōu)化,并將它應(yīng)用到繪制內(nèi)部填充的矩形、圓、橢圓等基本圖形中。
本文引用地址:http://m.butianyuan.cn/article/202205/434592.htm1 LCM與單片機接口電路設(shè)計
TG12864B 是廣州同華公司生產(chǎn)的一款無字庫的單色點陣液晶顯示模塊,控制芯片為SBN0064,支持68時序8 位并行總線,采用標(biāo)準(zhǔn)20 腳接口[1]。VDD、VSS為模塊邏輯電路電源,VEE 是模塊內(nèi)部提供的液晶驅(qū)動電壓,V0 是液晶對比度調(diào)節(jié)端,LED+、LED- 是背光電源。單片機STC90C52RC 通過I/O 方式讀寫控制TG12864B 液晶模塊,見圖1 所示。
2 LCM畫豎線算法的實現(xiàn)與優(yōu)化
我們采用的屏坐標(biāo)系:TG12864B 屏的左上角為坐標(biāo)原點(0,0),水平方向為x 軸,自左向右;垂直方向為y 軸,自上向下。TG12864B 屏上各點的亮滅由其內(nèi)置的顯示數(shù)據(jù)RAM(DDRAM) 控制。這DDRAM 的每一位數(shù)據(jù)對應(yīng)屏上一個點的亮(數(shù)據(jù)為1)和暗(數(shù)據(jù)為0)。DDRAM 與頁、列地址的對應(yīng)關(guān)系如下表1所示。
CS1=1 時,DDRAM 的列地址0-63 對應(yīng)左半屏的0-63 列;CS2=1 時,DDRAM 的列地址0-63 對應(yīng)右半屏的0-63 列。DDRAM 的頁地址為0-7,每頁8 位,共64 位,分別對應(yīng)著顯示屏的0-63 行。用戶可通過頁地址和列地址按字節(jié)讀寫DDRAM。
2.1 畫點程序
對點陣顯示屏來說,點是一切圖形的基礎(chǔ)。對單色屏來說,對它的每個像素點只有三種操作:畫點、擦除點、取反點(點由亮變暗,或由暗變亮)。根據(jù)LCM 內(nèi)部的DDRAM 結(jié)構(gòu),我們在其屏幕上描畫一個點,比如點(15,20),步驟如下:
(1)根據(jù)點的屏幕坐標(biāo)(15,20),計算出它的DDRAM 地址:左半屏(CS1=1),DDRAM 列地址為15,頁地址為2。
(2)讀出該地址對應(yīng)存儲單元(1 字節(jié))的數(shù)據(jù)。
(3)根據(jù)需要對該點的操作(畫點、擦除點、取反點),對該字節(jié)數(shù)據(jù)的對應(yīng)位(DB4 位)進行相應(yīng)的處理,獲得一個新的數(shù)據(jù)。
(4)將新數(shù)據(jù)寫回原地址的DDRAM。
按以上思路,用C 語言編寫TG12864B 的畫點函數(shù)如下。為了書寫方便,我們重新定義無符號字符數(shù)據(jù)類型為uchar。程序中用到兩個讀、寫DDRAM的底層函數(shù),聲明如下:
uchar ReadPosDat(uchar page,uchar col);
// 讀DDRAM page 頁,col 列的一字節(jié)數(shù)據(jù), 并返回
void WritePosDat(uchar page,uchar col,uchar dat);
// 將一字節(jié)數(shù)據(jù)dat 寫到DDRAM page 頁,col 列
/**************************************************
參數(shù):屏幕像素坐標(biāo)(x,y),列x(0-127),行y(0-63)
type=0: 該點填充0,擦除點
type=1: 該點填充1,畫點
type=2: 該點取反 ,取反點
**************************************************/
void draw_point(uchar x,uchar y,uchar type){ uchar dat,page;
2.2 傳統(tǒng)的畫豎線程序
直線由點構(gòu)成。給出豎線的起點和終點坐標(biāo),根據(jù)前面的畫點函數(shù)便可逐點畫出豎線,其C語言程序如下:
/**************************************************
畫豎線函數(shù)( 利用畫點函數(shù))
參數(shù):type=0, 擦除;type=1, 畫線;type=2,取反x 為水平坐標(biāo)值,y0,y1 為起點和終點的垂直坐標(biāo)值
**************************************************/
2.3 畫豎線程序的優(yōu)化
根據(jù)表1 DDRAM 與屏幕顯示位置的關(guān)系, 由DDRAM 頁地址和列地址確定的1 個字節(jié)單元對應(yīng)著屏幕的Y 軸方向的8 個像素點。在我們上面?zhèn)鹘y(tǒng)的畫豎線程序中,采用逐點描畫豎線,對同一個DDRAM 字節(jié)對應(yīng)的點,也需要重復(fù)的操作8 次:重復(fù)讀同一個DDRAM 字節(jié)8 次,計算該字節(jié)上對應(yīng)位8 次,回寫該字節(jié)8 次。顯然,這是一個巨大的冗余。其實,根據(jù)DDRAM 的結(jié)構(gòu)特點,在畫豎線時,我們通過讀、修改、寫DDRAM 1 個字節(jié)1 次,就可直接描畫出豎線上的8個點。而且,在進行畫線或擦除線操行時,除了豎線的起點和終點所在DDRAM 字節(jié),我們需要進行讀、修改、寫操作,豎線經(jīng)過的中間字節(jié),我們直接寫入全1 或全0 就可以了,這將大大提高程序的運行速度。基于以上思想,我們對畫豎線程序進行優(yōu)化,其C 語言程序如下:
/*************************************************
優(yōu)化的畫豎線函數(shù)
參數(shù):type=0, 擦除;type=1, 畫線;type=2,取反x 為水平坐標(biāo)值,y0,y1 為起始和終點的垂直坐標(biāo)值
**************************************************/
2.4 畫豎線程序的測試
對這兩種畫豎線函數(shù),輸入各種不同的運行參數(shù)(uchar x,uchar y0, uchar y1,uchar type),測量它們的運行效果和時間。
運行時間測試方法:采用電路中的STC90C52RC單片機(外接晶振12MHz)的定時器T0 進行檢測,設(shè)置T0 為16 位定時模式,一次定時50 ms,采用中斷方式工作。50 ms 以上的時間,通過統(tǒng)計中斷次數(shù)計算獲得,50 ms 以內(nèi)的時間,通過讀取定時器的計數(shù)寄存器TH0、TL0 獲得。經(jīng)過運行測試,兩種畫豎線函數(shù)均能正確畫出相應(yīng)的豎線,運行時間如表2 所示。
在以上三組測試數(shù)據(jù)中,傳統(tǒng)的畫豎線程序的運時間分別是優(yōu)化的畫豎線程序的5.7 倍、11.5 倍和9.1 倍,優(yōu)化效果顯著。
3 畫豎線程序在圖形填充中的應(yīng)用
在進行圖形用戶界面設(shè)計時,矩形、圓、橢圓等都是常用的基本圖形元素。采用優(yōu)化的畫豎線程序來繪制這些內(nèi)部填充的基本圖形,相比直接采用畫點函數(shù)(種子填充法、掃描線填充法[2])或基于畫點函數(shù)的傳統(tǒng)畫豎線程序,可以大幅地提高程序的運行速度。
3.1 畫填充矩形
給出矩形的左上角點和右下角點坐標(biāo),根據(jù)上面的畫豎線函數(shù),便可從左到右逐根豎線地繪制出填充的矩形,其C 語言程序如下:
/*************************************************
畫填充矩形函數(shù)
參數(shù):x0、y0 為矩形左上角點坐標(biāo)
x1、y1 為矩形右下角點坐標(biāo)
type=0,填充0;type=1,填充1;type=2,
取反
**************************************************/
void draw_rectangle_fill(uchar x0,uchar y0,uchar x1,uchar y1,uchar type)
{ while(x0 <= x1)// 畫填充矩形
{ imp_vline(x0,y0,y1,type);
x0 ++;
}
}
對調(diào)用傳統(tǒng)的畫豎線函數(shù)實現(xiàn)的填充矩形函數(shù)和調(diào)用優(yōu)化的畫豎線函數(shù)實現(xiàn)的填充矩形函數(shù),輸入各種不同的運行參數(shù)(uchar x0,uchar y0,uchar x1,uchar y1,uchar type),測量它們的運行效果和時間。經(jīng)過運行測試,兩種畫填充矩形函數(shù)均能正確畫出相應(yīng)的矩形,運行時間如表3 所示。
在以上三組測試數(shù)據(jù)中,采用傳統(tǒng)畫豎線函數(shù)的填充矩形程序的運行時間分別是采用優(yōu)化畫豎線函數(shù)的填充矩形程序的9.3 倍、10.0 倍、9.1 倍,優(yōu)化效果顯著。
3.2 畫填充橢圓
根據(jù)中點生成橢圓的整數(shù)型算法[3],可計算出橢圓圓心在坐標(biāo)原點的標(biāo)準(zhǔn)橢圓在第一象限上的1/4 橢圓弧的各點坐標(biāo)。再由橢圓關(guān)于X 軸和Y 軸的對稱性,便可得到其在另外3 個象限的橢圓弧坐標(biāo)。經(jīng)過平移,就可得到橢圓圓心在任意位置的橢圓弧各點坐標(biāo)。以橢圓弧關(guān)于過橢圓圓心的水平線對稱的每一對點為端點畫豎線,便能畫出內(nèi)部填充的橢圓。
對調(diào)用傳統(tǒng)的畫豎線函數(shù)實現(xiàn)的填充橢圓函數(shù)和調(diào)用優(yōu)化的畫豎線函數(shù)實現(xiàn)的填充橢圓函數(shù),輸入各種不同的運行參數(shù)(uchar x0,uchar y0,uchar a,uchar b,uchar type) ,(x0,y0)為橢圓圓心坐標(biāo),a 為橢圓長半軸,b 為橢圓短半軸。測量它們的運行效果和時間。經(jīng)過運行測試,兩種畫填充橢圓函數(shù)均能正確畫出相應(yīng)的橢圓,運行時間如表4 所示。
在以上三組測試數(shù)據(jù)中,采用傳統(tǒng)畫豎線函數(shù)的填充橢圓程序的運行時間分別是采用優(yōu)化畫豎線函數(shù)的填充橢圓程序的7.8 倍、10.0 倍、6.1 倍,優(yōu)化效果顯著。
5 結(jié)論
本文以SBN0064 控制的點陣液晶模塊TG12864B為例,根據(jù)LCM 內(nèi)部顯示存儲器結(jié)構(gòu),對畫豎線程序進行優(yōu)化,在繪制豎線、填充矩形、圓形、橢圓等常用基本圖形時,可以大幅度地提高程序的運行速度,具有較強的實用價值。以上結(jié)論,亦適用于其它采用SBN0064 或其兼容芯片( 如KS0108、S6B0108、HD61202 等)控制的12864 點陣液晶模塊。而對采用ST7920 或其兼容芯片控制的帶中文字庫的點陣液晶模塊,則可根據(jù)其內(nèi)部GDRAM 結(jié)構(gòu),對畫橫線程序進行優(yōu)化。
參考文獻:
[1] 廣州同華實業(yè)有限公司.TG12864B-01使用說明書[EB/OL].[2021-10].http://gb.tinsharp.com.
[2] 郭曉新,徐長青,楊瀛濤.計算機圖形學(xué)[M].3版.北京:機械工業(yè)出版社,2017:25-28.
[3] 張博,周麗韞,李興霞.中點生成橢圓的整數(shù)型算法[J].工程圖學(xué)學(xué)報,2011,32(1):1-4.
[4] 譚浩強.C程序設(shè)計[M].5版.北京:清華大學(xué)出版社,2017.
(本文來源于《電子產(chǎn)品世界》雜志2022年5月期)
評論