點陣式液晶顯示模塊相對于段碼式LCD或LED的區(qū)別在于不僅它可以顯示字符,更重要的是可以畫圖。在很多的測試類設(shè)備中,需要設(shè)備能夠?qū)崟r的顯示曲線以判斷被測設(shè)備的工作狀況,如果采用先保存數(shù)據(jù)然后送給上位機處理,會加重成本,而且很不方便,而采用段碼式LCD或LED顯然不能勝任,用點陣式圖形液晶顯示器可以方便的實現(xiàn)這些功能。
本文介紹的點陣式液晶顯示模塊是信利公司的MPG240128A1-7型,它的控制芯片是東芝公司的T6963C。
模塊的特點
T6963C是點陣式液晶圖形顯示器,可以圖形方式、字符方式、圖形和字符合成方式顯示,以及實現(xiàn)字符方式下的特征方式顯示,還可以象CAD一樣進行屏拷貝操作。本文中的液晶模塊是240×128點陣。 硬件實現(xiàn)
本液晶模塊與MCU之間的數(shù)據(jù)傳送可以通過串口方式,也可以通過并口方式來實現(xiàn),圖1是LCD模塊與MCU80C196KC的并口方式下的接口圖,其中:
D0~D7與MCU的AD0~AD7相連,用來傳送數(shù)據(jù)。
C/D可以與MCU的低位地址線相連,本例是連接AD1,用它區(qū)分送給LCD控制器的是命令(Code)還是數(shù)據(jù)(Data)。 /RESET在本圖中也與VCC電源相連,含義是不使用硬件復(fù)位。
/RD和/WR分別連接MCU的讀和寫信號。
/CE連接MCU的譯碼地址。
VO是LCD需要的負(fù)電壓。 關(guān)鍵步驟
LCD初始化
LCD初始化包括設(shè)置顯示圖形區(qū)首地址,圖形區(qū)寬度,顯示開關(guān)設(shè)置。
圖形區(qū)首地址:在點陣式液晶圖形顯示器中,LCD屏幕上的每個顯示單元對應(yīng)一個地址,從左上角開始,從左到右,從上到下。在圖形顯示方式下,顯示單元的單位是1×8點陣(即一個字節(jié)),對應(yīng)于240×128的屏幕,它有240×128×8=3840個顯示單元,一屏的地址范圍是0_3839。命令控制字是24H和42H。有關(guān)命令字請詳細(xì)參閱T6963C使用手冊。
圖形區(qū)寬度:它用來調(diào)整使用的有效顯示窗口寬度,表示每行可有效顯示的單元數(shù)。對于240×128的顯示屏,最多每行有240/8=30個顯示單元。命令控制字是43H。
顯示開關(guān)設(shè)置是將相應(yīng)的顯示方式打開,例如要顯示圖形,則將圖形方式控制位置1。命令控制字是98H。圖2是初始化流程圖。
屏讀指令
要畫出需要的圖形,則必須知道圖形每個點的坐標(biāo)值,顯然畫圖要按點控制。我們知道控制器的顯示單元是1×8點陣,也就是一次只能畫一行8個點。這似乎有矛盾,但T6963C控制器提供了屏讀指令,它可以將當(dāng)前地址所指向的顯示單元的值讀到控制器的緩沖區(qū),我們再通過數(shù)據(jù)總線讀到MCU,這樣我們把將要寫入每個單元的值與原來的值相或,那么既不會破壞原來的值,又可以將新值寫入,以實現(xiàn)我們所需要的按點控制的方式。屏讀命令控制字是E0H。
軟件實現(xiàn)
我們以正弦波為例說明具體畫圖過程。
在LCD屏幕上畫正弦波,我們可以事先按一定采樣率算出相應(yīng)的點值。然后轉(zhuǎn)換為LCD屏幕上點的坐標(biāo)值,因為這樣可以很直觀地控制將要給相應(yīng)位置顯示的信息。以240×128的屏幕為例,它的標(biāo)范圍是縱坐標(biāo)0_127,橫坐標(biāo)0~29。要在240×128的屏幕上畫兩個完整的正弦波,幅值為30(縱向30個點),每個周期采樣45個點,并帶有橫坐標(biāo)和縱坐標(biāo)。構(gòu)造正弦波表格:
TABLE_SIN[45]={ 0,4,8,12,16,19,22,25,27,29,30,30,30,29,28,26,24,21,18,14,10,6,2,-2,-6,-10,-14,-18,-21,-24,-26,-28,-29, -30,-30,-30,-29,-27,-25,-22,-19,-16,-12,-8, -4,0}
因為畫圖的顯示單元是1×8,一次畫一個點,故畫圖時寫入代碼值是80H,40H,20H,10H,08H,04H,02H,01H,并且還要將正弦波的值轉(zhuǎn)換為這幾個值中的的一個,構(gòu)造碼值表格TABLE_DOT[8]={0x80,0x40,0x20,0x10,0x08,0x04,x02,0x01}。
下面介紹坐標(biāo)轉(zhuǎn)換過程:
正弦波的幅值代表的是它離橫坐標(biāo)的距離。假設(shè)原點在LCD屏幕上的坐標(biāo)值是(1,60),則將第i個點幅值轉(zhuǎn)換為縱坐標(biāo)的值是60-TABLE_SIN[i],它的橫坐標(biāo)是i/8的商數(shù),代碼值是TABLE_DOT[i/8的余數(shù)],這樣我們調(diào)用畫圖程序就可以實現(xiàn)畫正弦波。下面是具體畫圖的幾個主要函數(shù)。
在主程序中有以下調(diào)用語句:
for(i=10;i<110;i++)/畫橫坐標(biāo)
graphic(0x80,2,i);
for(i=1;i<29;i++)/畫縱坐標(biāo)
graphic(0x0ff,i,64);
for(i=0;i<118;i++)/畫正弦波
graphic(TABLE_DOT[i%8],2+i/8,64-TABLE_SIN[i]);
下面是屏讀函數(shù),讀出給出緩沖區(qū)地址的值,并返回結(jié)果:
unsigned char pindu(x,y)
unsigned char x,y;{
unsigned char value;
w2d(x,y,0x24);
wd(0x0e0);
value=r1d();/從LCD緩沖區(qū)讀數(shù)據(jù)
return value;
}
下面是在屏幕上畫一個點的畫點函數(shù):
void graphic(code,x,y)
unsigned char code,x,y;/x坐標(biāo)0~29
{ unsigned int xy;/坐標(biāo)變換中間變量
unsigned char oo,code1;
/計算顯示RAM地址
xy=y*30+x;/240為液晶屏一行顯示的字符數(shù)
x=xy%256;
y=8+xy/256;/圖形緩沖區(qū)在高地址
w2d(x,y,0x24);/寫入LCD
code1=pindu(x,y);
code=code1;
w1d(code,0x0c0);寫入LCD}
變量說明讀者可以根據(jù)使用情況判斷,函數(shù)r1d(),w2d(),w1d()分別是從LCD緩沖區(qū)讀一個值,給緩沖區(qū)寫兩個數(shù),寫一個數(shù)函數(shù)。
筆者在給長慶油田開發(fā)的雙參數(shù)測井儀設(shè)備中,采用了本液晶模塊,里面需要畫兩個圖形,一個是要測出抽油桿油梁的受力情況,根據(jù)畫出圖形判斷油梁是否工作正常,另一個是畫出微音傳感器采樣的聲波波形來判斷油井的大概深度。整個儀器小巧方便(重量只有2公斤),具有很強的實用性。