介紹在MSP430F149單片機(jī)上移植,μC/CUI到MSCl9264液晶的過程, 詳細(xì)闡述了,μC/GUI移植的原理以及在移植中應(yīng)注意的事項(xiàng)。
μC/GUI是美國Micrium公司出品的一款針對嵌入式系統(tǒng)的優(yōu)秀圖形軟件。與μC/OS一樣,μC/GUI具有源碼公開、可移植、可裁減、穩(wěn)定性和可靠性高的特點(diǎn)[1]。采用μC/GUI,開發(fā)人員可以很方便地在液晶上顯示文本、曲線、圖形以及各種窗口對象如按鈕、編輯框、滑動(dòng)條等,可完全產(chǎn)生類似于Windows的顯示效果。另外,μC/GUI提供了在VC下的仿真庫,這使得用戶完全可以在Windows下仿真μC/GUI的各種效果。
采用μC/GUI,可以大大降低嵌入式系統(tǒng)中顯示設(shè)計(jì)的難度,但μC/GUI的使用需針對不同的液晶編寫相應(yīng)的驅(qū)動(dòng)程序才能實(shí)現(xiàn)。本文通過移植μC/GUI到MSGl9264液晶的過程,介紹了μC/GUI移植的原理以及移植中應(yīng)注意的事項(xiàng)。
1 開發(fā)工具和運(yùn)行環(huán)境
為了實(shí)現(xiàn)μC/GUI的移植,選用MSP430F149。MSP430F149是一款16位超低功耗單片機(jī),具有強(qiáng)大的處理能力(RISC結(jié)構(gòu)、125ns的指令周期)和豐富的片內(nèi)外設(shè)(如硬件乘法器、ADC、定時(shí)器、看門狗等)。 它內(nèi)部具有2KB的RAM和60KB的FLASH,能基本滿足μC/GUI運(yùn)行的需要[2]。
軟件開發(fā)環(huán)境采用IAR公司的集成開發(fā)環(huán)境IAR EW430 2.10A。相對于較早的EW430 1.26A版本,2.10版本在各個(gè)方面有了較大改進(jìn),尤其是項(xiàng)目管理和調(diào)試上有了較大的改動(dòng),這使得移植μC/GUI更加方便。
2 μC/GUI移植
μc/GUI針對不同的液晶控制器提供了多種驅(qū)動(dòng)程序,如KS0713、SEDl335、T6963等控制器都有對應(yīng)的液晶驅(qū)動(dòng)程序。但在很多情況下,用戶采用的液晶,μC/GUI并沒有提供其對應(yīng)的驅(qū)動(dòng)程序,需自己著手編寫特定液晶的驅(qū)動(dòng)程序。
2.1 液晶顯示器工作原理
為了能編寫正確的液晶驅(qū)動(dòng)程序,了解相應(yīng)液晶的顯示原理非常重要。本文采用的MSGl9264液晶為192x64點(diǎn)陣單色液晶,其中包含一個(gè)行驅(qū)動(dòng)器KS0107B和三個(gè)列驅(qū)動(dòng)器KS0108B,每個(gè)列驅(qū)動(dòng)器KS0108B對應(yīng)一塊64x64的液晶[3]。
MSGl9264液晶的控制線為R/W、RS、CSA、CSB和LCDEN,數(shù)據(jù)線為D0~D7。RS用于指示當(dāng)前的操作是數(shù)據(jù)還是寄存器,R/W用于表明當(dāng)前是讀還是寫,CSA、CSB用于選擇相應(yīng)的列驅(qū)動(dòng)器(其選擇關(guān)系可見圖1)。RS和R/W的功能可見表1,液晶顯示器的讀寫時(shí)序見圖2。
MSGl9264模塊一共提供7種指令(由RW、RS及數(shù)據(jù)總線的電子決定),用于對該模塊狀態(tài)及顯示進(jìn)行控制。這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è)備可以是鍵盤、鼠標(biāo)或觸摸屏;二維圖形包括圖片、直線、多邊形、園、橢圓、圓弧等;窗口對象包括按鈕、編輯框、進(jìn)度條、復(fù)選框等。μC/GUI函數(shù)庫可以通過GUIConf.h文件進(jìn)行配置,配置的內(nèi)容包括是否采用內(nèi)存設(shè)備,是否采用窗口管理器,是否支持操作系統(tǒng)、觸摸屏,以及配置動(dòng)態(tài)內(nèi)存的大小等。
在LCDConf.h文件中定義了與硬件有關(guān)的各種屬性,如液晶的大小、顏色以及與液晶的接口函數(shù)。而LCD驅(qū)動(dòng)文件則負(fù)責(zé)把μC/GUI的各種函數(shù)解釋成LCDConf.h文件中定義的液晶接口函數(shù),這個(gè)文件與具體的硬件連接無關(guān)。
μC/GUI與LCD的硬件接口通過驅(qū)動(dòng)文件把硬件接口函數(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ù)的實(shí)現(xiàn)與底層硬件有關(guān),必須根據(jù)硬件連接的具體情況編寫這些函數(shù)。
MSP430F149是一款低功耗單片機(jī),其供電電壓為1.8~3.6V,而MSGl9264液晶為5V供電液晶,輸入高電平為3.3V。為確保與液晶的輸入電平兼容,MSP430F149的供電電壓可設(shè)置為3.6V,這樣就可以把MSP430F149與液晶直接連接而無需額外的驅(qū)動(dòng)芯片。MSP430F149與LCD的接口電路如圖4所示。
LCD_WRITE A1()函數(shù)的具體實(shí)現(xiàn)如下:
#define LCD_WRITE_A1(Byte) //定義寫LCD控制命令函數(shù)
{ //參數(shù)Byte為要寫入液晶的數(shù)據(jù)。
P40UT:Byte; //把數(shù)據(jù)放到LCD的數(shù)據(jù)線上
_NOP(); //空指令,確保能可靠地寫入
P1OUT&=0xef; //LCDRS=0,表示寫命令
P10UTI=Ox20; //LCDEN=1
_NOP(); //空指令
P1OUT&=0xcf; //LCDEN=0,把數(shù)據(jù)寫入LCD
顯示RAM
_NOP();
}
2.3.2 編寫LCD驅(qū)動(dòng)文件
圖3中的μC/GUI硬件接口函數(shù)主要由表2所示函數(shù)構(gòu)成。
μC/GUI提供的函數(shù)庫和各種顯示效果都是通過表2所示接口函數(shù)在LCD上實(shí)現(xiàn),所以LCD驅(qū)動(dòng)文件的實(shí)現(xiàn)也就是把這些硬件接口函數(shù)的實(shí)現(xiàn)。 由于MSGl9264液晶與μC/GUI提供的LCDSLin較相似,所以筆者以μC/GUI提供的LCDSLin.C文件為基礎(chǔ),編寫針對MSGl9264液晶的驅(qū)動(dòng)程序。
通過分析LCDSLin文件可以發(fā)現(xiàn),液晶驅(qū)動(dòng)程序的核心是畫點(diǎn)函數(shù),大部分硬件接口函數(shù)都可由畫點(diǎn)函數(shù)實(shí)現(xiàn)。因此,改造畫點(diǎn)函數(shù)及其調(diào)用函數(shù)成為移植的重點(diǎn)問題。
畫點(diǎn)函數(shù)的要求是改變液晶上任意點(diǎn)的顏色而不影響其他點(diǎn)的顏色。考慮到單片機(jī)MSP430F149的輸入電壓不能超過3.6V,筆者沒有采取讀液晶顯示器內(nèi)部顯示RAM的方法,而是在MSP430F149的RAM中定義一個(gè)數(shù)組存儲(chǔ)LCD顯示的數(shù)據(jù)。此數(shù)組可定義為unsigned char Cache[((LCD_YSIZE+7)>>3)xLCD_XSIZE]。LCD_XSIZE、LCD_YSIZE表示液晶的大小,在LCDConf.h文件中定義。考慮到液晶的長度可能不是8的整倍數(shù),可定義數(shù)組大小為(LCD_YSIZE+7)>>3)xLCD_XSIZE。
在定義了Cache的基礎(chǔ)上,畫點(diǎn)函數(shù)可如下實(shí)現(xiàn):
static void_SetPixel(int x,int y,LCD_PIXELINDEX c) {
//畫點(diǎn)函數(shù)
U8 Mask=1<<(y&7); //屏蔽字
int Adr=XY20FF(x,y); //由x,y的絕對位置得到
Cache中的相對位置
//XY20FF(x,y)可被定義為((y>>3)+x×((64+7)>>3))
U8 CacheByte=Cache[Adrl; //獲得顯示RAM的數(shù)值
if(c) //根據(jù)顏色修改顯示RAM的值
CacheBytel=Mask; //對應(yīng)位“置1”
else
CacheByte&=~Mask; //對應(yīng)位清零
LCD_WRITE(Adr,CacheByte);
//把CacheByte寫入液晶顯存并更改
Cache[Adr]的值為CacheByte
}
函數(shù)的參數(shù)x,y代表要畫點(diǎn)的位置(x為橫坐標(biāo),y為縱坐標(biāo)),參數(shù)c代表要畫點(diǎn)的顏色。在函數(shù)內(nèi)部,U8為μC/GUI提供的數(shù)據(jù)格式(相當(dāng)于unsigned char),Mask為屏蔽字,Adr為x,y對應(yīng)顯示Cache的地址。
以把液晶的(5,5)處點(diǎn)亮為例,此時(shí)x=5,y=5,c=1,可計(jì)算出Mask=00100000,Adr=40(表示在Cache[40]處存有(5,5)點(diǎn)的顏色值)。由于c=1,所以應(yīng)把Cache[40]中對應(yīng)位“置1”,這是通過CacheByte的值“或”上Mask的值00100000實(shí)現(xiàn)的。最后通過調(diào)用LCD_WRITE函數(shù)把得到的新CacheByte值寫入液晶對應(yīng)的地址即可點(diǎn)亮該點(diǎn)。類似地,若要使某點(diǎn)不亮(c=0),則應(yīng)該把對應(yīng)位“清零”,這可以通過CacheByte&=~Mask這條命令實(shí)現(xiàn)。
畫點(diǎn)函數(shù)中調(diào)用的LCD_Write函數(shù)可如下實(shí)現(xiàn):
static void LCD_Write(int Adr,U8 Byte){
if(CacheIAdrl!=Byte){ //若寫入值與原值不符則
把寫入值保存到顯示RAM中
Cache[Adr]=Byte;
if(LCD_Adr!=Adr){
LCD_SETADR(Adr); //設(shè)置液晶的起始行、起始列和CSA、CSB
}
LCD_WRITEl(Bytc);
}}
由于此液晶由三塊64x64的液晶組成,LCD_SETADR函數(shù)除了設(shè)置液晶的起始行、起始列外還應(yīng)根據(jù)Adr的值設(shè)置CSA和CSB的值,才能寫到對應(yīng)的液晶屏上。此外,在LCD_WRITEl()函數(shù)中通過調(diào)用LCDConf.h文件中的LCD_WRITE_A1()和LCD_WRITE_A0()實(shí)現(xiàn)液晶顯示。
除了_SetPixel()函數(shù),基本函數(shù)還包括_GetPixel()函數(shù)和XorPixel()函數(shù)。_GetPixel()函數(shù)可以返回指定點(diǎn)的顏色信息,XorPixel()則可以對指定點(diǎn)顏色取反,實(shí)現(xiàn)“反白”的效果。由于這兩個(gè)函數(shù)較簡單,這里不再給出具體代碼。
以函數(shù)_SetPixel()、_GetPixel()和XorPixel()為基礎(chǔ),結(jié)合MSGl9264液晶的7種指令就可以實(shí)現(xiàn)表1所給的硬件接口函數(shù),以此構(gòu)成了LCD驅(qū)動(dòng)文件。
表1 RS和R/W的功能
RS | R/W | 功 能 |
0 | 0 | 寫命令 |
0 | 1 | 讀液晶狀態(tài)(主要用于判忙) |
1 | 0 | 寫液晶的顯示RAM數(shù)據(jù) |
1 | 1 | 讀液晶的顯示RAM數(shù)據(jù) |
3 討論
為了能使用μC/GUI,必須調(diào)用GUI_Init()初始化。與硬件有關(guān)的初始化如CPU時(shí)鐘頻率的選擇等既可以放在GUI_Init()中,也可以單獨(dú)編寫一個(gè)函數(shù)初始化。
表2 硬件接口函數(shù)的名稱和功能
函數(shù)名稱 | 功 能 |
LCD_L0_InIt() | 顯示初始化 |
LCD_L0_ReInIt() | 重新初始化而不擦除顯示內(nèi)容 |
LCD_L0_OFF | 關(guān)顯示 |
LCD_L0_ON | 開顯示 |
LCD_L0_DrawBitmap() | 畫圖 |
LCD_L0_DrawPixel() | 以指定顏色畫點(diǎn) |
LCD_L0_DrwaVline() | 畫水平線 |
LCD_L0_DrwaVline() | 畫垂直線 |
LCD_L0_FillRect() | 填充一矩形 |
LCD_L0_XorPixel() | 翻轉(zhuǎn)指定點(diǎn)顏色 |
調(diào)試時(shí)應(yīng)從基本的顯示字符串開始,逐漸增加顯示的功能和復(fù)雜度。
由于筆者采用單色液晶, 在LCDConf.h中定義LCD_FIXEDPALETFE為1;若為彩色液晶,應(yīng)根據(jù)液晶支持的顏色設(shè)置LCD_FIXEDPALETYE,具體可參考手冊。
若使用窗口對象,則在GUI_Conf.h中定義GUI—WINSUPPORT為1。
在GUIConf.h中定義GUI_ALLOC_SIZE為動(dòng)態(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è)置窗口對象的默認(rèn)字體及顏色以獲得更好的顯示效果。在單色液晶中,簡單地改變背景顏色和字體顏色即可獲得反顯效果。
可以通過μC/GUI提供的軟件(位圖轉(zhuǎn)換器和字體轉(zhuǎn)換器)轉(zhuǎn)換需要的圖像或字體為μC/GUI格式。
由于定義的Cache占用了大量的RAM,若從液晶讀回顯存的值則可以省去Cache占用的RAM,但同時(shí)也會(huì)降低系統(tǒng)運(yùn)行的速度。
在LCDConf.h文件中定義了與硬件連接有關(guān)的LCD讀寫函數(shù),在液晶驅(qū)動(dòng)文件中調(diào)用這些LCD讀寫函數(shù)。這樣做的好處是使驅(qū)動(dòng)文件與硬件無關(guān),一旦一種液晶的驅(qū)動(dòng)編寫完畢可以很方便地移植到各種系統(tǒng)中而只需更改LCDConf.h即可。
- μC/G(5221)
相關(guān)推薦
430也要GUI之一: 多級文本菜單開源
51液晶程序移植到AVR上就不亮了
GUI_DrawArc函數(shù)在液晶屏上顯示的是一個(gè)圓
GUI界面系統(tǒng)的移植過程怎么實(shí)現(xiàn)?
Gui移植完后顯示出了問題
在OMAP5912開發(fā)板上怎么移植MiniGUI?
在STM32上移植UCGUI+emWin出現(xiàn)錯(cuò)誤
在STM32上移植UCOSII和UCGUI,觸摸屏光標(biāo)不隨觸點(diǎn)移動(dòng)
在ZC706上運(yùn)行Qt GUI時(shí)黑屏
在嵌入式平臺(tái)上怎么實(shí)現(xiàn)μC/GUI的移植?
移植GUI時(shí)出現(xiàn)錯(cuò)誤
LittlevGL在AT32上的移植說明
Nucleus PLUS在S3C2410A上的移植過程和方法是什么?
OS和GUI移植GUI_X_uCOS報(bào)如下錯(cuò)誤,請問是什么原因
STemWin移植報(bào)錯(cuò):Error: L6218E: Undefined symbol GUI_TOUCH_X_ActivateX (referred from gui_touch_driveranalog.o).
UC/GUI 移植好的案列分享
emwin的移植gui項(xiàng)目不能顯示
jz2440在uboot上移植
mini板的ucos/GUI如何移植
stm32 移植ucGUI
stm32f407zgt6上移植emwin怪問題
uC/GUI在ARM內(nèi)核S3C44B0X怎么實(shí)現(xiàn)移植?
uC/GUI在單片機(jī)系統(tǒng)上的移植
ucgui移植初始化后黑屏
ucosii,gui移植中哪里沒有定義嗎?
μC/OS-II在P89V51RD2上是怎樣實(shí)現(xiàn)移植的?
μC/OS-Ⅱ在LPC2106上的移植
μc/GUI是什么?μc/GUI的移植方法有哪些?
μCGUI移植到AT91RM9200的過程及接口設(shè)計(jì)
μClinux在S3C4510B上的移植
【mk_欣馳】emWin移植筆記——STemWin5.22在STM32F103上的移植步驟(帶觸摸,無操作系統(tǒng))
【mk_欣馳】emWin移植筆記——觸摸屏方向與液晶顯示方向不一致問題解決
【原創(chuàng)】基于stm32的uC/GUI移植手冊(無os) —— 可做移植...
【野火啟明6M5開發(fā)板體驗(yàn)】移植ILI9488液晶驅(qū)動(dòng)及LVGL
為什么CubeProgrammer在GUI上無法工作呢?
為什么cubeprogrammer在Linux上使用GUI安裝程序!?
之前使用的C6713,想把程序移植到C6747上,求指點(diǎn)移植方法
什么是uC/GUI?uC/GUI應(yīng)用實(shí)例有哪些?
關(guān)于μC/GUI和μC/OS的移植問題???
哪里可以找到UCOS和GUI的資料?
基于STM32的uCGUI移植
如何在S3C240上移植MiniGUI?
如何實(shí)現(xiàn)μC/OS-II在AT89C51上的移植?
如何選擇GUI上的類型?
嵌入式圖形系統(tǒng)μc/GUI移植開發(fā)方案
怎樣將GUI移植到小熊派開發(fā)板上
新唐N9H20 GUI emWin移植過程上篇
無法在GUI上找到ST25R3911B和mifare經(jīng)典配套
有開源GUI LittlevGL移植分享的嗎
請問屏和GUI的接口程序ili9320_ucgui.c如何修改?
超輕量小型開源GUI、有效代碼四千行左右、極易移植
uC/GUI在MCS51系列單片機(jī)系統(tǒng)上移植的仿真實(shí)現(xiàn)

基于S3C44B0X的UC/GUI的移植研究

uC/GUI在單片機(jī)系統(tǒng)上的移植

嵌入式圖形系統(tǒng)μc/GUI的移植和開發(fā)


uC_OS_與uC_GUI在Cortex_M3上的移植研究與實(shí)現(xiàn)

基于uC_OS_與uC_GUI在Cortex_M3上的移植研究與實(shí)現(xiàn)

uC/GUI在S3C44B0X的移植及其在數(shù)據(jù)顯示系統(tǒng)中的應(yīng)用

基于STM32平臺(tái)的μC/OS-II上的μC/GUI移植過程解析


進(jìn)行TFT LCD顯示實(shí)驗(yàn)GUI移植完成和4.3電容屏的詳細(xì)資料合集

使用UCGUI移植戰(zhàn)艦板子GUI移植完成和3.5電阻屏的工程文件免費(fèi)下載

uC和GUI在Cortex-M3內(nèi)核上的移植

CAT-PFSMTH9264 CAT-PFSMTH9264 汽車接頭
實(shí)戰(zhàn)貼:開源GUI LittlevGL在MCU上的移植

GUI-Guider生成工程移植MCU

評論