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