劉 宸(四川職業(yè)技術(shù)學(xué)院電子電氣工程系,四川 遂寧 629000)
基于ST7920控制器的液晶顯示波形方案研究
劉宸
(四川職業(yè)技術(shù)學(xué)院電子電氣工程系,四川遂寧629000)
文章詳細(xì)介紹了以ST7920為控制器的中小尺寸12864液晶實現(xiàn)波形顯示的多種方案,提出了兩種改進(jìn)算法,并討論各方案的優(yōu)缺點.總結(jié)出應(yīng)根據(jù)不同應(yīng)用場合的需求來選擇對應(yīng)的方案.
ST7920;12864;液晶;波形
由于LCD液晶顯示器件具有電壓低、功耗小、顯示信息量大、使用壽命長等優(yōu)點,被廣泛應(yīng)用于儀器儀表的人機(jī)交互界面.同時,在很多領(lǐng)域中使用的便攜式數(shù)字化設(shè)備越來越多以單片機(jī)為控制核心、用LCD作為顯示終端.12864點陣液晶是中小尺寸液晶的典型代表,應(yīng)用廣泛.而運用12864液晶顯示動態(tài)波形,在近幾年的電子設(shè)計大賽中有這樣的題目要求,在發(fā)明杯和創(chuàng)新創(chuàng)業(yè)大賽中的一些項目也有這樣的實際需求,比如:心率監(jiān)測儀、數(shù)控電源、甚至數(shù)字示波器等.利用液晶顯示動態(tài)波形能觀察各種不同信號的幅度隨時間變化的波形曲線,還可以用它顯示各種不同的電量,如電壓、電流、頻率、相位、幅度等.
12864液晶種類繁多,從液晶的顏色來分,有黃綠底黑字屏,藍(lán)底白字屏,灰底黑字屏等,從顯示方式來分有STN、FSTN、DFSTN等.但對于開發(fā)者而言,最重要的是液晶控制器的類型.常用的控制器有四種,每一種都有自己的特點,當(dāng)然指令也各不相同.開發(fā)者不搞明白液晶類型,肯定是無從下手.
ST7920類:這種控制器帶中文字庫,為用戶免除了編制字庫的麻煩,該控制器的液晶還支持畫圖方式.該類液晶支持68時序8位和4位并行通信以及串行通信.在電子市場中占有較大比例,但在仿真軟件PROTEUS中沒有該類液晶的仿真模型,因而不支持仿真.常見的QC12864B就屬于ST7920 類.
KS0108類:這種控制器指令簡單,但不帶字庫,需用戶自己編制字庫.支持68時序8位并行通信.支持在PROTEUS中仿真運行.
T6963C類:這種控制器帶西文字庫.有文本和圖形兩個圖層,并且支持兩個圖層的疊加顯示.支持80時序8位并行通信.
COG類:常見的控制器有S6B0724和ST7565,這兩個控制器指令兼容.支持68時序8位并行通信,80時序8位并行通信和串行通信.COG封裝類液晶的特點是結(jié)構(gòu)輕便.
其中PSB是ST7920類液晶的標(biāo)志性引腳;CS1 和 CS2是 KS0108類引腳的標(biāo)志性引腳;FS是T6963C類液晶的標(biāo)志性引腳.可以根據(jù)這些引腳來判斷液晶的類型.
實時顯示采集信號的波形,就是根據(jù)時間軸和采集值幅度在液晶上畫點和畫線,隨著時間的推移,每隔單位時間就需要顯示采集信號的一個點.顯示的點在時間軸上是連續(xù)的,但信號的幅值不一定是連續(xù)的,當(dāng)前后兩個連續(xù)時間點的幅值不連續(xù)時,為了顯示效果更優(yōu),則需要開發(fā)者人為地把這兩個點之間的空白以豎線顯示出來.
2.1KS0108控制器液晶方案
從程序的簡化來說,最好選擇KS0108控制器的液晶方案,雖然ST7920控制器的也有畫圖方式,但是用它顯示動態(tài)波形會浪費很多數(shù)據(jù)處理的時間。究其原因,是因為KS0108控制器的顯示RAM字節(jié)是縱向排列,對應(yīng)液晶點陣的列,顯示波形時,時間軸對應(yīng)液晶的128列,信號幅值對應(yīng)縱向排列的8個字節(jié),畫點程序處理就相當(dāng)簡單,算法是先定位頁(63-DATA)/8,再輸出數(shù)據(jù)0X01<<(DATA%8)即可.但缺點是采用KS0108控制器的液晶不帶字庫,顯示字符不方便,而且只能并行傳輸數(shù)據(jù),如果應(yīng)用場合的處理器引腳資源有限,則不能實現(xiàn).因此本文主要研究支持串行模式的ST7920控制器液晶方案.
收稿日期:2015-05-25
作者簡介:劉宸(1982-),男,四川遂寧人,四川職業(yè)技術(shù)學(xué)院講師.研究方向:電子系統(tǒng)設(shè)計.
2.2ST7920控制器液晶方案
2.2.1讀取舊顯示數(shù)據(jù)
ST7920控制器的液晶顯示器,顯示RAM是橫向排列的,液晶更改GDRAM只能橫向16位改,即寫數(shù)據(jù)必須橫向?qū)憙蓚€字節(jié)的數(shù)據(jù),高8位和低8位. ST7920控制器型液晶圖形顯示坐標(biāo)如圖1.
圖1 ST7920控制器型液晶圖形顯示坐標(biāo)
為了不把當(dāng)前點附近的16位數(shù)據(jù)丟失,要畫點和畫線,就必須讀取當(dāng)前點所在位置的舊顯示數(shù)據(jù),再與當(dāng)前點合成為新數(shù)據(jù).而讀取舊顯示數(shù)據(jù),大體上分兩種方案:
方案A:讀取液晶中的數(shù)據(jù),當(dāng)前點所在位置的舊顯示數(shù)據(jù)(16位).
方案B:在單片機(jī)內(nèi)存中開辟1K字節(jié)的空間(128*64/8bit=1024字節(jié)),用作虛擬LCD12864的GDRAM,所以不用讀液晶,讀的是內(nèi)存中的備份數(shù)據(jù).
ST7920繪圖時候一般都選擇在并行模式,因為繪圖時需要回讀液晶中GDRAM的數(shù)據(jù),在串行模式下,經(jīng)試驗不能回讀數(shù)據(jù).因此要選擇方案A則必須選擇并行模式.并行模式下需占用11個I/O引腳(RS、RW、E和8個引腳的并行端口),然而在串行模式下繪圖只占用 3個 I/O引腳(CS、SID和SCLK),其中CS可以直接硬件連接VCC保持高電平,則甚至只用2個I/O引腳.所以,如果應(yīng)用場合受限于I/O口資源,則應(yīng)該選擇方案B,但缺點是需要開辟1024個字節(jié)的內(nèi)存空間,增加了內(nèi)存開銷,真所謂魚與熊掌難以兼得.
方案A的缺點是:(1)采用并行模式,占用引腳資源比方案B多;(2)當(dāng)要補充畫豎線時,該列的幅度差值有N個點,則需要畫點N次,導(dǎo)致每列畫點的耗時不同.
此外還可以采用Bresenham畫線算法,畫出任意兩點間連成的直線,但對于我們這里的需求,畫波形而言,只需要畫豎線,因此還是面對同樣的缺點,即每列畫點的耗時不同。若在慢速采集的場合,采集速度慢于顯示速度,每列畫點耗時不同的影響就可以忽略不計.
2.2.2針對方案B的優(yōu)化
在特定應(yīng)用場合,比如單片機(jī)使用的是MSP430 G2553,它的RAM只有512字節(jié),或者AT89S52單片機(jī),僅有256字節(jié),根本不夠開辟1K字節(jié)內(nèi)存空間來備份數(shù)據(jù).以下針對方案B的優(yōu)化方案可以解決此問題.
方案B-1:虛擬LCD12864的GDRAM時,不需要在單片機(jī)內(nèi)存中開辟1K字節(jié)的空間,只需要存儲當(dāng)前點位置的16位寬和64行的舊顯示數(shù)據(jù),即64 行*16列/8=128字節(jié).為什么是所有行,因為豎線最多可能有64行,要輸出的數(shù)據(jù)就應(yīng)該包含所有行的數(shù)據(jù).程序中,由于要留一行顯示必要的文字,因此只剩48行供波形顯示,其程序要點是:
b=0x8000;//16位數(shù)據(jù)首位置
x&=0x70;//得到顯示的數(shù)據(jù)的首位在數(shù)組中的位置,因為液晶是在0,16,32,48,64,80,96,112列寫數(shù)據(jù),所以在這8個點開始改t[48]數(shù)據(jù),也可寫成:x=x/16;x=x*16;或者x=x>>4<<4;均可實現(xiàn),獲得數(shù)據(jù)首位置
for(i=0;i<16;i++)//t[48]為16位存儲空間,根據(jù)ad采集值數(shù)組wave[x]更改t[48]數(shù)據(jù),打點且連了兩點間的豎線
{
m=wave[x+i];n=wave[(x+i+1)%128];//得到前后兩點的高度
if(m>n){j=m;m=n;n=j;}
j=0;
while(j while(j<=n){t[j]|=b;j++;}//從小值到大值,m到n打黑點,連成豎線 while(j<48){t[j]&=~b;j++;}//高于ad值,打白點,不顯示 b>>=1;//指向16位數(shù)據(jù)的下一位 } 程序中合成數(shù)組t[48]的過程中,要改48行16位中的全部點,所以要改寫16*48次數(shù)據(jù),處理數(shù)據(jù)較多.再此基礎(chǔ)上進(jìn)一步優(yōu)化,提出以下方案. 方案B-2:先計算該點在16位數(shù)據(jù)的相對位置,根據(jù)ad值,只改寫t[48]的16位數(shù)據(jù)中的當(dāng)前這一位,改寫48行數(shù)據(jù),只改當(dāng)前點這一列.再將數(shù)組t[48]輸出.程序要點是: if(x%16==0){for(i=0;i<48;i++)t[i]=0;}//每隔16點,清空數(shù)據(jù) i=x%16;//取得相對位置 b>>=i;//指向該列 m=wave[x-1];n=wave[x];//得到前后兩點的高度 if(m>n){j=m;m=n;n=j;} j=0; while(j while(j<=n){t[j]|=b;j++;}//從小值到大值,m到n打黑點,連成豎線 while(j<48){t[j]&=~b;j++;}//打白點,不顯示 此方案改寫數(shù)組的次數(shù)是方案B-1的16分之1,速度更快,單片機(jī)處理耗時減少,但由于單片機(jī)的耗時比寫數(shù)據(jù)到液晶的耗時相對小得多,所以實際顯示效果優(yōu)化有限.但對于快速采集的場合,顯示速度慢于采集速度,此時方案B-1也有優(yōu)勢,寫當(dāng)前點時會附帶著把之前未顯示出來的點顯示出來了,而方案B-2則只改寫顯示當(dāng)前列,之前若未來得及顯示的點則無法再顯示出來.基于此,提出以下方案. 方案B-3:可以每當(dāng)夠16位點時才寫一次液晶,優(yōu)點是寫液晶的次數(shù)減少,顯示速度約為方案B-2的16倍,但缺點是觀看示波效果時會有頓挫感.程序示例: if(x%16==0)outwave(x-1);//每當(dāng)夠16位時才寫一次液晶顯示16列*48行,但也需要根據(jù)ad暫存數(shù)組wave[x]的值改16位t[48]數(shù)據(jù). 在選擇波形顯示方案時,要綜合考慮:控制器是否支持串行模式、處理器的I/O引腳資源、內(nèi)存占用量、信號頻率、AD采集速度等,所以開發(fā)者應(yīng)該根據(jù)不同應(yīng)用場合的需求結(jié)合各方案的特點來舍取,選擇對應(yīng)的方案. [1]李明生.電子測量與儀器[M].北京:電子工業(yè)出版社,2010. [2]謝興紅,林凡強,吳雄英.MSP430單片機(jī)基礎(chǔ)與實踐[M].北京:北京航天大學(xué)出版社,2008. 責(zé)任編輯:張隆輝 TN 141.9 A 1672-2094(2015)04-0158-033 結(jié)語