《電子技術(shù)應(yīng)用》
您所在的位置:首頁 > 其他 > 業(yè)界動態(tài) > μC/GUI在MSG19264液晶上的移植

μC/GUI在MSG19264液晶上的移植

2008-08-11
作者:劉 濱 王 琦 劉麗麗

??? 摘 要: 介紹在MSP430F149單片機上移植μC/GUI" title="C/GUI">C/GUI到MSG19264液晶的過程,,詳細闡述了μC/GUI移植的原理以及在移植中應(yīng)注意的事項,。
??? 關(guān)鍵詞: μC/GUI? MSG19264? 移植? MSP430F149

?

??? μC/GUI是美國Micrium公司出品的一款針對嵌入式系統(tǒng)的優(yōu)秀圖形軟件,。與μC/OS一樣,μC/GUI具有源碼公開,、可移植,、可裁減、穩(wěn)定性和可靠性高的特點[1],。采用μC/GUI,,開發(fā)人員可以很方便地在液晶上顯示文本、曲線,、圖形以及各種窗口對象如按鈕,、編輯框,、滑動條等,可完全產(chǎn)生類似于Windows的顯示效果" title="顯示效果">顯示效果,。另外,,μC/GUI提供了在VC下的仿真庫,這使得用戶完全可以在Windows下仿真μC/GUI的各種效果,。
??? 采用μC/GUI,可以大大降低嵌入式系統(tǒng)中顯示設(shè)計的難度,,但μC/GUI的使用需針對不同的液晶編寫相應(yīng)的驅(qū)動程序才能實現(xiàn),。本文通過移植μC/GUI到MSG19264液晶的過程,介紹了μC/GUI移植的原理以及移植中應(yīng)注意的事項,。
1 開發(fā)工具和運行環(huán)境
??? 為了實現(xiàn)μC/GUI的移植,,選用MSP430F149。MSP430F149是一款16位超低功耗單片機,,具有強大的處理能力(RISC結(jié)構(gòu),、125ns的指令周期)和豐富的片內(nèi)外設(shè)(如硬件乘法器、ADC,、定時器,、看門狗等)。它內(nèi)部具有2KB的RAM和60KB的FLASH,,能基本滿足μC/GUI運行的需要[2],。
??? 軟件開發(fā)環(huán)境采用IAR公司的集成開發(fā)環(huán)境IAR EW430 2.10A。相對于較早的EW430 1.26A版本,,2.10版本在各個方面有了較大改進,,尤其是項目管理和調(diào)試上有了較大的改動,這使得移植μC/GUI更加方便,。
2 μC/GUI移植
??? μC/GUI針對不同的液晶控制器提供了多種驅(qū)動程序,,如KS0713、SED1335,、T6963等控制器都有對應(yīng)的液晶驅(qū)動程序,。但在很多情況下,用戶采用的液晶,,μC/GUI并沒有提供其對應(yīng)的驅(qū)動程序,,需自己著手編寫特定液晶的驅(qū)動程序。
2.1 液晶顯示器工作原理
??? 為了能編寫正確的液晶驅(qū)動程序,,了解相應(yīng)液晶的顯示原理非常重要,。本文采用的MSG19264液晶為192×64點陣單色液晶,其中包含一個行驅(qū)動器KS0107B和三個列驅(qū)動器" title="列驅(qū)動器">列驅(qū)動器KS0108B, 每個列驅(qū)動器KS0108B對應(yīng)一塊64×64的液晶[3],。
??? MSG19264液晶的控制線為R/W,、RS,、CSA、CSB和LCDEN,,數(shù)據(jù)線為D0~D7,。RS用于指示當前的操作是數(shù)據(jù)還是寄存器,R/W用于表明當前是讀還是寫,,CSA,、CSB用于選擇相應(yīng)的列驅(qū)動器(其選擇關(guān)系可見圖1)。RS和R/W的功能可見表1,,液晶顯示器的讀寫時序見圖2,。

?

?

?

?


??? MSG19264模塊一共提供7種指令(由RW、RS及數(shù)據(jù)總線的電平?jīng)Q定),,用于對該模塊狀態(tài)及顯示進行控制,。這7種指令包括顯示開關(guān)控制、設(shè)起始行,、設(shè)起始列,、設(shè)頁地址、讀狀態(tài),、讀/寫顯示內(nèi)容,。通過這些指令的組合,可以控制液晶顯示各種圖形,。
2.2 μC/GUI結(jié)構(gòu)
??? μC/GUI的軟件體系結(jié)構(gòu)如圖3所示,。μC/GUI函數(shù)庫為用戶程序提供GUI接口,包含的函數(shù)有文本,、數(shù)值,、二維圖形、輸入設(shè)備以及各種窗口對象,。其中,,輸入設(shè)備可以是鍵盤、鼠標或觸摸屏,;二維圖形包括圖片,、直線、多邊形,、園,、橢圓、圓弧等,;窗口對象包括按鈕,、編輯框、進度條、復(fù)選框等,。μC/GUI函數(shù)庫可以通過GUIConf.h文件進行配置,,配置的內(nèi)容包括是否采用內(nèi)存設(shè)備,是否采用窗口管理器,,是否支持操作系統(tǒng),、觸摸屏,以及配置動態(tài)內(nèi)存的大小等,。

?


??? 在LCDConf.h文件中定義了與硬件有關(guān)的各種屬性,,如液晶的大小、顏色以及與液晶的接口函數(shù)" title="接口函數(shù)">接口函數(shù),。而LCD驅(qū)動文件則負責(zé)把μC/GUI的各種函數(shù)解釋成LCDConf.h文件中定義的液晶接口函數(shù),,這個文件與具體的硬件連接無關(guān)。
??? μC/GUI與LCD的硬件接口通過驅(qū)動文件把硬件接口函數(shù)轉(zhuǎn)化為LCDConf.h中定義的LCD讀寫函數(shù),。
2.3 移植過程
2.3.1修改LCDConf.h

??? LCDConf.h定義了LCD的大小、顏色,,對應(yīng)的LCD控制器以及與硬件連接有關(guān)的LCD讀寫函數(shù),。按照μC/GUI的規(guī)定,底層的讀寫LCD函數(shù)包括LCD_WRITE_A1()(即寫LCD命令),、LCD_WRITE_A0()(寫LCD數(shù)據(jù)),、LCD_READ_A0()(讀LCD狀態(tài))、LCD_READ_A1()(讀LCD數(shù)據(jù)),。這些函數(shù)的實現(xiàn)與底層硬件有關(guān),,必須根據(jù)硬件連接的具體情況編寫這些函數(shù)。
??? MSP430F149是一款低功耗單片機,,其供電電壓" title="供電電壓">供電電壓為1.8~3.6V,,而MSG19264液晶為5V供電液晶,輸入高電平為3.3V,。為確保與液晶的輸入電平兼容,,MSP430F149的供電電壓可設(shè)置為3.6V,這樣就可以把MSP430F149與液晶直接連接而無需額外的驅(qū)動芯片,。MSP430F149與LCD的接口電路如圖4所示,。

?


??? LCD_WRITE_A1()函數(shù)的具體實現(xiàn)如下:
??? #define?? LCD_WRITE_A1(Byte)?? //定義寫LCD控制命令函數(shù)
??? {?????????????????????????????????????? ? //參數(shù)Byte為要寫入液晶的數(shù)據(jù)。
??? ? ?P4OUT=Byte;??????????????? ? //把數(shù)據(jù)放到LCD的數(shù)據(jù)線上
??? ?? _NOP();???????????????????????? //空指令,,確保能可靠地寫入
??? ? ?P1OUT&=0xef;???????????????? //LCDRS=0,,表示寫命令
??? ? ?P1OUT|=0x20;????????????????? //LCDEN=1
??? ??_NOP();????????????????????????? //空指令
??? ??P1OUT&=0xcf;???????????????? //LCDEN=0,把數(shù)據(jù)寫入LCD顯示RAM
??? ?? _NOP();
??? }
2.3.2 編寫LCD驅(qū)動文件
??? 圖3中的?滋C/GUI硬件接口函數(shù)主要由表2所示函數(shù)構(gòu)成,。
??? μC/GUI提供的函數(shù)庫和各種顯示效果都是通過表2所示接口函數(shù)在LCD上實現(xiàn),,所以LCD驅(qū)動文件的實現(xiàn)也就是把這些硬件接口函數(shù)的實現(xiàn)。由于MSG19264液晶與μC/GUI提供的LCDSLin較相似,,所以筆者以μC/GUI提供的LCDSLin.C文件為基礎(chǔ),,編寫針對MSG19264液晶的驅(qū)動程序,。

?


??? 通過分析LCDSLin文件可以發(fā)現(xiàn),液晶驅(qū)動程序的核心是畫點函數(shù),,大部分硬件接口函數(shù)都可由畫點函數(shù)實現(xiàn),。因此,改造畫點函數(shù)及其調(diào)用函數(shù)成為移植的重點問題,。
??? 畫點函數(shù)的要求是改變液晶上任意點的顏色而不影響其他點的顏色,。考慮到單片機MSP430F149的輸入電壓不能超過3.6V,,筆者沒有采取讀液晶顯示器內(nèi)部顯示RAM的方法,,而是在MSP430F149的RAM中定義一個數(shù)組存儲LCD顯示的數(shù)據(jù)。此數(shù)組可定義為unsigned char Cache[((LCD_YSIZE +7)>>3)×LCD_XSIZE],。LCD_XSIZE ,、LCD_YSIZE表示液晶的大小,在LCDConf.h文件中定義,??紤]到液晶的長度可能不是8的整倍數(shù),可定義數(shù)組大小為(LCD_YSIZE +7)>>3)×LCD_XSIZE,。
??? 在定義了Cache的基礎(chǔ)上,,畫點函數(shù)可如下實現(xiàn):
??? static void _SetPixel(int x, int y, LCD_PIXELINDEX c) {? ???????//畫點函數(shù)
??? ?U8? Mask=1<<(y&7);????? ?//屏蔽字
?? ? int? Adr=XY2OFF(x,y);????? //由x,y的絕對位置得到Cache中的相對位置
??? //XY2OFF(x,y)可被定義為((y>>3)+x×((64+7)>>3))
???? U8? CacheByte=Cache[Adr];? //獲得顯示RAM的數(shù)值
?? ? if (c)?????????????????????? //根據(jù)顏色修改顯示RAM的值

????????? CacheByte|= Mask;? ?//對應(yīng)位“置1”
?? ? else
??? ????? CacheByte&=~Mask;??? ?//對應(yīng)位清零
???? LCD_WRITE(Adr,CacheByte);? //把CacheByte寫入液晶顯存并更改
????????? Cache[Adr]的值為CacheByte
??? }
??? 函數(shù)的參數(shù)x,y代表要畫點的位置(x為橫坐標,,y為縱坐標),,參數(shù)c代表要畫點的顏色。在函數(shù)內(nèi)部,,U8為μC/GUI提供的數(shù)據(jù)格式(相當于unsigned char),,Mask為屏蔽字,Adr為x,,y對應(yīng)顯示Cache的地址,。
??? 以把液晶的(5,5)處點亮為例,,此時x=5,,y=5,c=1,,可計算出Mask=00100000,,Adr=40(表示在Cache[40]處存有(5,5)點的顏色值),。由于c=1,,所以應(yīng)把Cache[40]中對應(yīng)位“置1”,這是通過CacheByte的值“或”上Mask的值00100000實現(xiàn)的。最后通過調(diào)用LCD_WRITE函數(shù)把得到的新CacheByte值寫入液晶對應(yīng)的地址即可點亮該點,。類似地 ,,若要使某點不亮(c=0),則應(yīng)該把對應(yīng)位“清零”,,這可以通過CacheByte&=~Mask這條命令實現(xiàn),。
??? 畫點函數(shù)中調(diào)用的LCD_Write函數(shù)可如下實現(xiàn):
??? static void LCD_Write(int Adr, U8 Byte) {??
??? if (Cache[Adr]!=Byte) {?? ?//若寫入值與原值不符則把寫入值保存到顯示RAM中
??? ??? Cache[Adr]=Byte;?????????????????
??? ??? if (LCD_Adr!=Adr) {
??? ????? LCD_SETADR(Adr); ?//設(shè)置液晶的起始行、起始列和CSA,、CSB
????????? }
??? ??? LCD_WRITE1(Byte);
??? } }
??? 由于此液晶由三塊64×64的液晶組成,, LCD_SETADR函數(shù)除了設(shè)置液晶的起始行、起始列外還應(yīng)根據(jù)Adr的值設(shè)置CSA和CSB的值,,才能寫到對應(yīng)的液晶屏上,。此外,在LCD_WRITE1()函數(shù)中通過調(diào)用LCDConf.h文件中的LCD_WRITE_A1()和LCD_WRITE_A0()實現(xiàn)液晶顯示,。
??? 除了_SetPixel()函數(shù),,基本函數(shù)還包括_GetPixel()函數(shù)和XorPixel()函數(shù)。_GetPixel()函數(shù)可以返回指定點的顏色信息,, XorPixel()則可以對指定點顏色取反,,實現(xiàn)“反白”的效果。由于這兩個函數(shù)較簡單,,這里不再給出具體代碼。
??? 以函數(shù)_SetPixel(),、_GetPixel()和XorPixel()為基礎(chǔ),,結(jié)合MSG19264液晶的7種指令就可以實現(xiàn)表1所給的硬件接口函數(shù),以此構(gòu)成了LCD驅(qū)動文件,。
3 討論
??? 為了能使用μC/GUI,,必須調(diào)用GUI_Init()初始化。與硬件有關(guān)的初始化如CPU時鐘頻率的選擇等既可以放在GUI_Init()中,,也可以單獨編寫一個函數(shù)初始化,。
??? 調(diào)試時應(yīng)從基本的顯示字符串開始,逐漸增加顯示的功能和復(fù)雜度,。
??? 由于筆者采用單色液晶,,在LCDConf.h中定義LCD_FIXEDPALETTE為1;若為彩色液晶,,應(yīng)根據(jù)液晶支持的顏色設(shè)置LCD_FIXEDPALETTE,,具體可參考手冊。
??? 若使用窗口對象,,則在GUI_Conf.h中定義GUI_WINSUPPORT為1,。
??? 在GUIConf.h中定義GUI_ALLOC_SIZE為動態(tài)內(nèi)存的大小,應(yīng)根據(jù)需要合理選擇。窗口對象(如按鈕)的創(chuàng)建需要申請內(nèi)存,,若申請不到內(nèi)存則無法創(chuàng)建,,相應(yīng)地創(chuàng)建函數(shù)值為0??捎纱伺袛郍UI_ALLOC_SIZE已經(jīng)不能滿足需要,,一方面可以考慮增加GUI_ALLOC_SIZE(受制于芯片內(nèi)存的大小),;另一方面也可以刪除不用的窗口對象,,釋放內(nèi)存,再創(chuàng)建新的窗口對象,。
?? ?采用內(nèi)存設(shè)備能有效克服閃爍現(xiàn)象,,獲得更快的顯示速度,但它需要額外的內(nèi)存,。由于MSP430F149內(nèi)存較小,,筆者沒有采用內(nèi)存設(shè)備。
??? 可以設(shè)置窗口對象的默認字體及顏色以獲得更好的顯示效果,。在單色液晶中,,簡單地改變背景顏色和字體顏色即可獲得反顯效果。
?? ?可以通過μC/GUI提供的軟件(位圖轉(zhuǎn)換器和字體轉(zhuǎn)換器)轉(zhuǎn)換需要的圖像或字體為μC/GUI格式,。
?? ?由于定義的Cache占用了大量的RAM,,若從液晶讀回顯存的值則可以省去Cache占用的RAM,但同時也會降低系統(tǒng)運行的速度,。
??? 在LCDConf.h文件中定義了與硬件連接有關(guān)的LCD讀寫函數(shù),,在液晶驅(qū)動文件中調(diào)用這些LCD讀寫函數(shù)。這樣做的好處是使驅(qū)動文件與硬件無關(guān),,一旦一種液晶的驅(qū)動編寫完畢可以很方便地移植到各種系統(tǒng)中而只需更改LCDConf.h即可,。
參考文獻
1 User's & reference manual for μC/GUI.Micrium Technologies Corporation
2 魏小龍.MSP430系列單片機接口技術(shù)及系統(tǒng)設(shè)計實例.北京:北京航空航天大學(xué)出版社,2002
3 MSG19264 reference manual.TRULY SEMICONDUCTORS?LTD.

本站內(nèi)容除特別聲明的原創(chuàng)文章之外,,轉(zhuǎn)載內(nèi)容只為傳遞更多信息,,并不代表本網(wǎng)站贊同其觀點。轉(zhuǎn)載的所有的文章,、圖片,、音/視頻文件等資料的版權(quán)歸版權(quán)所有權(quán)人所有。本站采用的非本站原創(chuàng)文章及圖片等內(nèi)容無法一一聯(lián)系確認版權(quán)者,。如涉及作品內(nèi)容,、版權(quán)和其它問題,請及時通過電子郵件或電話通知我們,,以便迅速采取適當措施,,避免給雙方造成不必要的經(jīng)濟損失,。聯(lián)系電話:010-82306118;郵箱:[email protected],。