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

發(fā)布時(shí)間:2010-11-16 16:15    發(fā)布者:eetech
關(guān)鍵詞: GUI , MSG19264 , μC , 液晶 , 移植
介紹在MSP430F149單片機上移植,μC/CUI到MSC19264液晶的過(guò)程, 詳細闡述了,μC/GUI移植的原理以及在移植中應注意的事項。

μC/GUI是美國Micrium公司出品的一款針對嵌入式系統的優(yōu)秀圖形軟件。與μC/OS一樣,μC/GUI具有源碼公開(kāi)、可移植、可裁減、穩定性和可靠性高的特點(diǎn)。采用μC/GUI,開(kāi)發(fā)人員可以很方便地在液晶上顯示文本、曲線(xiàn)、圖形以及各種窗口對象如按鈕、編輯框、滑動(dòng)條等,可完全產(chǎn)生類(lèi)似于Windows的顯示效果。另外,μC/GUI提供了在VC下的仿真庫,這使得用戶(hù)完全可以在Windows下仿真μC/GUI的各種效果。  

采用μC/GUI,可以大大降低嵌入式系統中顯示設計的難度,但μC/GUI的使用需針對不同的液晶編寫(xiě)相應的驅動(dòng)程序才能實(shí)現。本文通過(guò)移植μC/GUI到MSGl9264液晶的過(guò)程,介紹了μC/GUI移植的原理以及移植中應注意的事項。  

1 開(kāi)發(fā)工具和運行環(huán)境  

為了實(shí)現μC/GUI的移植,選用MSP430F149。MSP430F149是一款16位超低功耗單片機,具有強大的處理能力(RISC結構、125ns的指令周期)和豐富的片內外設(如硬件乘法器、ADC、定時(shí)器、看門(mén)狗等)。 它內部具有2KB的RAM和60KB的FLASH,能基本滿(mǎn)足μC/GUI運行的需要。  

軟件開(kāi)發(fā)環(huán)境采用IAR公司的集成開(kāi)發(fā)環(huán)境IAR EW430 2.10A。相對于較早的EW430 1.26A版本,2.10版本在各個(gè)方面有了較大改進(jìn),尤其是項目管理和調試上有了較大的改動(dòng),這使得移植μC/GUI更加方便。





2 μC/GUI移植  

μc/GUI針對不同的液晶控制器提供了多種驅動(dòng)程序,如KS0713、SEDl335、T6963等控制器都有對應的液晶驅動(dòng)程序。但在很多情況下,用戶(hù)采用的液晶,μC/GUI并沒(méi)有提供其對應的驅動(dòng)程序,需自己著(zhù)手編寫(xiě)特定液晶的驅動(dòng)程序。  

2.1 液晶顯示器工作原理  

為了能編寫(xiě)正確的液晶驅動(dòng)程序,了解相應液晶的顯示原理非常重要。本文采用的MSGl9264液晶為192x64點(diǎn)陣單色液晶,其中包含一個(gè)行驅動(dòng)器KS0107B和三個(gè)列驅動(dòng)器KS0108B,每個(gè)列驅動(dòng)器KS0108B對應一塊64x64的液晶。  

MSGl9264液晶的控制線(xiàn)為R/W、RS、CSA、CSB和LCDEN,數據線(xiàn)為D0"D7。RS用于指示當前的操作是數據還是寄存器,R/W用于表明當前是讀還是寫(xiě),CSA、CSB用于選擇相應的列驅動(dòng)器(其選擇關(guān)系可見(jiàn)圖1)。RS和R/W的功能可見(jiàn)表1,液晶顯示器的讀寫(xiě)時(shí)序見(jiàn)圖2。  

MSGl9264模塊一共提供7種指令(由RW、RS及數據總線(xiàn)電子決定),用于對該模塊狀態(tài)及顯示進(jìn)行控制。這7種指令包括顯示開(kāi)關(guān)控制、設起始行、設起始列、設頁(yè)地址、讀狀態(tài)、讀/寫(xiě)顯示內容。通過(guò)這些指令的組合,可以控制液晶顯示各種圖形。





2.2 μC/GUI結構  

μC/GUI的軟件體系結構如圖3所示。μC/GUI函數庫為用戶(hù)程序提供GUI接口,包含的函數有文本、數值、二維圖形、輸入設備以及各種窗口對象。其中,輸入設備可以是鍵盤(pán)、鼠標或觸摸屏;二維圖形包括圖片、直線(xiàn)、多邊形、園、橢圓、圓弧等;窗口對象包括按鈕、編輯框、進(jìn)度條、復選框等。μC/GUI函數庫可以通過(guò)GUIConf.h文件進(jìn)行配置,配置的內容包括是否采用內存設備,是否采用窗口管理器,是否支持操作系統、觸摸屏,以及配置動(dòng)態(tài)內存的大小等。  

在LCDConf.h文件中定義了與硬件有關(guān)的各種屬性,如液晶的大小、顏色以及與液晶的接口函數。而LCD驅動(dòng)文件則負責把μC/GUI的各種函數解釋成LCDConf.h文件中定義的液晶接口函數,這個(gè)文件與具體的硬件連接無(wú)關(guān)。  

μC/GUI與LCD的硬件接口通過(guò)驅動(dòng)文件把硬件接口函數轉化為L(cháng)CDConf.h中定義的LCD讀寫(xiě)函數。  

2.3 移植過(guò)程  

2.3.1 修改LCDConf.h  

LCDConf.h定義了LCD的大小、顏色,對應的LCD控制器以及與硬件連接有關(guān)的LCD讀寫(xiě)函數。按照μC/GUI的規定,底層的讀寫(xiě)LCD函數包括LCD_WRITE_A1()(即寫(xiě)LCD命令)、LCD_WRITE_A0()(寫(xiě)LCD數據)、LCD_READ_A0()(讀LCD狀態(tài))、LCD_READ_A1()(讀LCD數據)。這些函數的實(shí)現與底層硬件有關(guān),必須根據硬件連接的具體情況編寫(xiě)這些函數。





MSP430F149是一款低功耗單片機,其供電電壓為1.8"3.6V,而MSGl9264液晶為5V供電液晶,輸入高電平為3.3V。為確保與液晶的輸入電平兼容,MSP430F149的供電電壓可設置為3.6V,這樣就可以把MSP430F149與液晶直接連接而無(wú)需額外的驅動(dòng)芯片。
MSP430F149與LCD的接口電路如圖4所示。  

LCD_WRITE A1()函數的具體實(shí)現如下:  

#define LCD_WRITE_A1(Byte) //定義寫(xiě)LCD控制命令函數  
{ //參數Byte為要寫(xiě)入液晶的數據。  
P40UT:Byte; //把數據放到LCD的數據線(xiàn)上  
_NOP(); //空指令,確保能可靠地寫(xiě)入  
P1OUT%26;amp;=0xef; //LCDRS=0,表示寫(xiě)命令  
P10UTI=Ox20; //LCDEN=1  
_NOP(); //空指令  
P1OUT%26;amp;=0xcf; //LCDEN=0,把數據寫(xiě)入LCD  
顯示RAM  
_NOP();  
}  

2.3.2 編寫(xiě)LCD驅動(dòng)文件  

圖3中的μC/GUI硬件接口函數主要由表2所示函數構成。





μC/GUI提供的函數庫和各種顯示效果都是通過(guò)表2所示接口函數在LCD上實(shí)現,所以L(fǎng)CD驅動(dòng)文件的實(shí)現也就是把這些硬件接口函數的實(shí)現。 由于MSGl9264液晶與μC/GUI提供的LCDSLin較相似,所以筆者以μC/GUI提供的LCDSLin.C文件為基礎,編寫(xiě)針對MSGl9264液晶的驅動(dòng)程序。  

通過(guò)分析LCDSLin文件可以發(fā)現,液晶驅動(dòng)程序的核心是畫(huà)點(diǎn)函數,大部分硬件接口函數都可由畫(huà)點(diǎn)函數實(shí)現。因此,改造畫(huà)點(diǎn)函數及其調用函數成為移植的重點(diǎn)問(wèn)題。  

畫(huà)點(diǎn)函數的要求是改變液晶上任意點(diǎn)的顏色而不影響其他點(diǎn)的顏色?紤]到單片機MSP430F149的輸入電壓不能超過(guò)3.6V,筆者沒(méi)有采取讀液晶顯示器內部顯示RAM的方法,而是在MSP430F149的RAM中定義一個(gè)數組存儲LCD顯示的數據。此數組可定義為unsigned char Cache[((LCD_YSIZE+7)>>3)xLCD_XSIZE]。LCD_XSIZE、LCD_YSIZE表示液晶的大小,在LCDConf.h文件中定義?紤]到液晶的長(cháng)度可能不是8的整倍數,可定義數組大小為(LCD_YSIZE+7)>>3)xLCD_XSIZE。  

在定義了Cache的基礎上,畫(huà)點(diǎn)函數可如下實(shí)現:  

static void_SetPixel(int x,int y,LCD_PIXELINDEX c) {  
//畫(huà)點(diǎn)函數  
U8 Mask=1>3)+x%26;#215;((64+7)>>3))  
U8 CacheByte=Cache[Adrl; //獲得顯示RAM的數值  
if(c) //根據顏色修改顯示RAM的值  
CacheBytel=Mask; //對應位“置1”  
else  
CacheByte%26;amp;="Mask; //對應位清零  
LCD_WRITE(Adr,CacheByte);  
//把CacheByte寫(xiě)入液晶顯存并更改  
Cache[Adr]的值為CacheByte  
}  

函數的參數x,y代表要畫(huà)點(diǎn)的位置(x為橫坐標,y為縱坐標),參數c代表要畫(huà)點(diǎn)的顏色。在函數內部,U8為μC/GUI提供的數據格式(相當于unsigned char),Mask為屏蔽字,Adr為x,y對應顯示Cache的地址。  

以把液晶的(5,5)處點(diǎn)亮為例,此時(shí)x=5,y=5,c=1,可計算出Mask=00100000,Adr=40(表示在Cache[40]處存有(5,5)點(diǎn)的顏色值)。由于c=1,所以應把Cache[40]中對應位“置1”,這是通過(guò)CacheByte的值“或”上Mask的值00100000實(shí)現的。最后通過(guò)調用LCD_WRITE函數把得到的新CacheByte值寫(xiě)入液晶對應的地址即可點(diǎn)亮該點(diǎn)。類(lèi)似地,若要使某點(diǎn)不亮(c=0),則應該把對應位“清零”,這可以通過(guò)CacheByte%26;amp;="Mask這條命令實(shí)現。  

畫(huà)點(diǎn)函數中調用的LCD_Write函數可如下實(shí)現:  

static void LCD_Write(int Adr,U8 Byte){  
if(CacheIAdrl!=Byte){ //若寫(xiě)入值與原值不符則  
把寫(xiě)入值保存到顯示RAM中  
Cache[Adr]=Byte;  
if(LCD_Adr!=Adr){  
LCD_SETADR(Adr); //設置液晶的起始行、起始列和CSA、CSB  
}  
LCD_WRITEl(Bytc);  
}}  

由于此液晶由三塊64x64的液晶組成,LCD_SETADR函數除了設置液晶的起始行、起始列外還應根據Adr的值設置CSA和CSB的值,才能寫(xiě)到對應的液晶屏上。此外,在LCD_WRITEl()函數中通過(guò)調用LCDConf.h文件中的LCD_WRITE_A1()和LCD_WRITE_A0()實(shí)現液晶顯示。  

除了_SetPixel()函數,基本函數還包括_GetPixel()函數和XorPixel()函數。_GetPixel()函數可以返回指定點(diǎn)的顏色信息,XorPixel()則可以對指定點(diǎn)顏色取反,實(shí)現“反白”的效果。由于這兩個(gè)函數較簡(jiǎn)單,這里不再給出具體代碼。  

以函數_SetPixel()、_GetPixel()和XorPixel()為基礎,結合MSGl9264液晶的7種指令就可以實(shí)現表1所給的硬件接口函數,以此構成了LCD驅動(dòng)文件。

表1 RS和R/W的功能  

RS
R/W

功  能  

0
0
寫(xiě)命令

0
1
讀液晶狀態(tài)(主要用于判忙)

1
0
寫(xiě)液晶的顯示RAM數據

1
1
讀液晶的顯示RAM數據

3 討論  

為了能使用μC/GUI,必須調用GUI_Init()初始化。與硬件有關(guān)的初始化如CPU時(shí)鐘頻率的選擇等既可以放在GUI_Init()中,也可以單獨編寫(xiě)一個(gè)函數初始化。

表2 硬件接口函數的名稱(chēng)和功能  


函數名稱(chēng)
功 能

LCD_L0_InIt()
顯示初始化

LCD_L0_ReInIt()
重新初始化而不擦除顯示內容

LCD_L0_OFF
關(guān)顯示

LCD_L0_ON
開(kāi)顯示

LCD_L0_DrawBitmap()
畫(huà)圖

LCD_L0_DrawPixel()
以指定顏色畫(huà)點(diǎn)

LCD_L0_DrwaVline()
畫(huà)水平線(xiàn)

LCD_L0_DrwaVline()
畫(huà)垂直線(xiàn)

LCD_L0_FillRect()
填充一矩形

LCD_L0_XorPixel()
翻轉指定點(diǎn)顏色

調試時(shí)應從基本的顯示字符串開(kāi)始,逐漸增加顯示的功能和復雜度。  

由于筆者采用單色液晶, 在LCDConf.h中定義LCD_FIXEDPALETFE為1;若為彩色液晶,應根據液晶支持的顏色設置LCD_FIXEDPALETYE,具體可參考手冊。  

若使用窗口對象,則在GUI_Conf.h中定義GUI—WINSUPPORT為1。  

在GUIConf.h中定義GUI_ALLOC_SIZE為動(dòng)態(tài)內存的大小,應根據需要合理選擇。窗口對象(如按鈕)的創(chuàng )建需要申請內存,若申請不到內存則無(wú)法創(chuàng )建,相應地創(chuàng )建函數值為0?捎纱伺袛郍UI_ALLOC_SIZE已經(jīng)不能滿(mǎn)足需要,一方面可以考慮增加GUI_ALLOC_SIZE(受制于芯片內存的大小);另一方面也可以刪除不用的窗口對象,釋放內存,再創(chuàng )建新的窗口對象。  

采用內存設備能有效克服閃爍現象,獲得更快的顯示速度,但它需要額外的內存。由于MSP430F149內存較小,筆者沒(méi)有采用內存設備。

可以設置窗口對象的默認字體及顏色以獲得更好的顯示效果。在單色液晶中,簡(jiǎn)單地改變背景顏色和字體顏色即可獲得反顯效果。  

可以通過(guò)μC/GUI提供的軟件(位圖轉換器和字體轉換器)轉換需要的圖像或字體為μC/GUI格式。  

由于定義的Cache占用了大量的RAM,若從液晶讀回顯存的值則可以省去Cache占用的RAM,但同時(shí)也會(huì )降低系統運行的速度。  

在LCDConf.h文件中定義了與硬件連接有關(guān)的LCD讀寫(xiě)函數,在液晶驅動(dòng)文件中調用這些LCD讀寫(xiě)函數。這樣做的好處是使驅動(dòng)文件與硬件無(wú)關(guān),一旦一種液晶的驅動(dòng)編寫(xiě)完畢可以很方便地移植到各種系統中而只需更改LCDConf.h即可。
本文地址:http://selenalain.com/thread-39860-1-1.html     【打印本頁(yè)】

本站部分文章為轉載或網(wǎng)友發(fā)布,目的在于傳遞和分享信息,并不代表本網(wǎng)贊同其觀(guān)點(diǎn)和對其真實(shí)性負責;文章版權歸原作者及原出處所有,如涉及作品內容、版權和其它問(wèn)題,我們將根據著(zhù)作權人的要求,第一時(shí)間更正或刪除。
您需要登錄后才可以發(fā)表評論 登錄 | 立即注冊

相關(guān)視頻

關(guān)于我們  -  服務(wù)條款  -  使用指南  -  站點(diǎn)地圖  -  友情鏈接  -  聯(lián)系我們
電子工程網(wǎng) © 版權所有   京ICP備16069177號 | 京公網(wǎng)安備11010502021702
快速回復 返回頂部 返回列表
午夜高清国产拍精品福利|亚洲色精品88色婷婷七月丁香|91久久精品无码一区|99久久国语露脸精品|动漫卡通亚洲综合专区48页