---------下面談?wù)剈CGUI的移植------------------------------------------------------------------------------------------------------------------
參考uCGUI中文手冊
1:首先通過網(wǎng)絡(luò)上相關(guān)資料的介紹,大致清楚UCGUI的整個(gè)框架與需要移植的地方。
2:結(jié)合uCGUI中文手冊與自己的開發(fā)板具體進(jìn)行移植。
///////////////////////////////////////
1:指針光標(biāo)輸入設(shè)備(觸摸屏)
指針光標(biāo)輸入設(shè)備包括鼠標(biāo)和觸摸屏。 它們共用一組通用的指針光標(biāo)輸入設(shè)備(PID)函數(shù)使得鼠標(biāo)和觸摸屏能同時(shí)起作用。 該函數(shù)一般由視窗管理器自動(dòng)地調(diào)用,如前所述的那樣,起刷新顯示屏的作用。 如果視窗管理器未使用,你的應(yīng)用程序要負(fù)責(zé)調(diào)用PID 函數(shù)。
//////////////////////////////下面的內(nèi)容是整理自網(wǎng)絡(luò)//////////////////////////////////////////
0:準(zhǔn)備工作
在移植之前,首先要了解在網(wǎng)上下的UCGUI 3.90源碼包,且需要先寫好裸機(jī)下成功驅(qū)動(dòng)LCD的驅(qū)動(dòng)代碼。
1)“tool文件夾” 基本都是字體和模板查看之類的.
2)“sample文件夾” 是實(shí)例代碼和模版配置頭文件,如跟操作系統(tǒng)有關(guān)的GUI_X或者一些模板
3)“Start文件夾” 是uCGUI的源代碼包
Config,配置文件;
GUI/AntiAlias,抗鋸齒支持;
GUI/ConvertMono,用于B/W(黑白兩色)及灰度顯示的色彩轉(zhuǎn)換程序;
GUI/ConvertColor,用于彩色顯示的色彩轉(zhuǎn)換的程序;
GUI/Core ??C/GUI,內(nèi)核文件;
GUI/Font,字體文件;
GUI/LCDDriver,LCD 驅(qū)動(dòng);
GUI/Mendev,存儲(chǔ)器件支持;
GUI/Touch,觸摸屏支持;
GUI/Widget,視窗控件庫;
GUI/WM,視窗管理器;
1: 定義/修改GUIConf.h、LCDConf.h 、GUITouchConf.h
GUIConf.h : μc/GUI功能模塊、動(dòng)態(tài)存儲(chǔ)空間(用于內(nèi)存設(shè)備和窗口對象)大小、默認(rèn)字體設(shè)置等 基本GUI預(yù)定 義控制的定義
在圖形接口的配置文件GUIconf.h 的默認(rèn)設(shè)置中,窗口
管理、存儲(chǔ)器支持、觸摸屏等功能被屏蔽。默認(rèn)字體設(shè)置為
GUI_Font6x8。uC/GUI 同樣支持漢字的顯示,使用生成漢字
字庫的軟件,可以將Windows 操作系統(tǒng)內(nèi)的任何字體字庫轉(zhuǎn)
換漢字字庫文件,也可以根據(jù)實(shí)際顯示的需要,將所需顯示
的漢字建立一個(gè)自定義字庫,添加到uC/GUI 中。文中選用
的漢字字庫文件為hzk16s.c(16×16 點(diǎn)陣的宋體漢字字庫),
uC/GUI 便支持16×16 點(diǎn)陣宋體漢字的顯示。
#define GUI_OS (1) //多任務(wù)
#define GUI_SUPPORT_TOUCH (0) //觸摸
#define GUI_SUPPORT_UNICODE (1) //Unicode支持
#define GUI_DEFAULT_FONT &GUI_Font6x8 //GUI默認(rèn)字體
#define GUI_ALLOC_SIZE 5000 //動(dòng)態(tài)內(nèi)存的大小
#define GUI_WINSUPPORT 1 //窗口控件支持
#define GUI_SUPPORT_MEMDEV 1 //支持內(nèi)存設(shè)備
#define GUI_SUPPORT_AA 1
LCDConf.h:LCD大小、控制器類別、總線寬度、顏色選取等LCD參數(shù)控制文件
#define LCD_XSIZE (160) //配置TFT的水平分辨率
#define LCD_YSIZE (128) //配置TFT的垂直分辨率
#define LCD_CONTROLLER (54124) //TFT控制器的名稱
#define LCD_BITSPERPIXEL (16) //每個(gè)像素的位數(shù)
#define LCD_FIXEDPALETTE (565) //調(diào)色板格式
#define LCD_SWAP_RB (0) //紅藍(lán)反色交換
#define LCD_INIT_CONTROLLER() TFT_Init() ; //此處需要定義的是你的TFT初始化函數(shù)
GUITouchConf.h:配備觸摸屏,根據(jù)觸摸屏及其控制芯片編制以下幾個(gè)函數(shù)
void TOUCH_X_ActivateX (void);// 準(zhǔn)備Y軸數(shù)據(jù)測量
void TOUCH_X_ActivateY (void);// 準(zhǔn)備X軸數(shù)據(jù)測量
int TOUCH_X_MeasureX(void); // 根據(jù)AD轉(zhuǎn)換結(jié)果返回X的值
int TOUCH_X_MeasureY(void); // 根據(jù)AD轉(zhuǎn)換結(jié)果返回Y的值
以上幾個(gè)函數(shù)在GUI_TOUCH_Exec()會(huì)被調(diào)用。
GUI/CORE/LCD_ConfDefaults.h文件內(nèi)可以找到所有囊括LCD配制默認(rèn)選項(xiàng),包括LCD屏個(gè)數(shù),控制器個(gè)數(shù) ,調(diào)色板,屏幕反向設(shè)置等眾多配制選項(xiàng)。
2:LCD配置內(nèi)容與驅(qū)動(dòng)接口
對于自帶控制器的LCD液晶屏,通過LCDConf.h文件中的總線接口和寄存器接口對硬件接口進(jìn)行配置與定義;
對于片上已經(jīng)集成了LCD控制器的控制器,通過對片內(nèi)LCD控制器的寄存器設(shè)置來配置LCD各接口信號;
一般LCD的接口信息配置包括VFRAME幀同步信號,VLINE線同步脈沖信號,VCLK象素時(shí)鐘信號,VM信號和數(shù)據(jù)位不等的象素點(diǎn)數(shù)據(jù)輸出信號。
3:LCD驅(qū)動(dòng)底層實(shí)現(xiàn)
LCD驅(qū)動(dòng)編程的實(shí)質(zhì)是液晶屏上的點(diǎn)對應(yīng)的顯存編程,最底層調(diào)用函數(shù)為畫點(diǎn)函數(shù),用戶可根據(jù)LCD屏的驅(qū)動(dòng)控制器的實(shí)際情況(通過總線接口、寄存器接口或LCD控制器的寄存器來操作)來實(shí)現(xiàn)底層驅(qū)動(dòng)。
_SetPixel(),_GetPixel(),XorPixel()為最底層直接對顯存操作函數(shù)。
uc/GUI提供部分控制器驅(qū)動(dòng),文件為GUI/LCDDriver/LCDSLin.c,如sed1335,T6963等簡單LCD控制器。核心函數(shù)為LCD_Write(). _SetPixel()調(diào)用LCD_Write()寫顯存。
uC/GUI 的圖形庫應(yīng)用程序、漢字顯示、窗口等功能的實(shí)
現(xiàn),都建立在底層的LCD 驅(qū)動(dòng)和畫點(diǎn)功能的基礎(chǔ)上,uC/GUI
的移植,必須先完成 LCD 的驅(qū)動(dòng),以及畫點(diǎn)、線等基本功
能?刂破鱐FT3224 在驅(qū)動(dòng)液晶顯示時(shí),只需設(shè)置好顯示的
行列坐標(biāo),向顯示寄存器寫入顯示數(shù)據(jù),便實(shí)現(xiàn)顯示功能,
而無需計(jì)算顯示存儲(chǔ)器和顯示區(qū)域的地址
畫點(diǎn)程序如下:
static void _SetPixel(int x, int y, LCD_PIXELINDEX c)
{
Y_ADDR = y;
X_ADDR = x;
CMD = ((x/256)<<2) | (y/256); //控制寄存器CMD 存放行列坐標(biāo)的高位數(shù)據(jù)
DAT = c; //數(shù)據(jù)寄存器DAT
}
讓GUI能夠找到你的LCD驅(qū)動(dòng),修改LCDDriver。
在編寫你的TFT底層驅(qū)動(dòng)程序的時(shí)候,一定不能忘記編寫這兩個(gè)函數(shù):設(shè)置一個(gè)像素和獲取一個(gè)像素的顏 色,因?yàn)楹竺婧芏郩CGUI和你的TFT驅(qū)動(dòng)關(guān)聯(lián)起來需要這兩個(gè)函數(shù)為前提。以我的TFT為例:
void LCD_SetPixel(unsigned short x, unsigned short y, unsigned short color)
{
}
unsigned short LCD_GetPixel(unsigned short x, unsigned short y)
{
}
uC/GUI 的驗(yàn)證程序如下:
…
GUI_SetColor(GUI_WHITE); //設(shè)置前景色為白色
LCD_L0_DrawHLine(0,100,100); //繪制水平直線
GUI_InitLUT(); //初始化調(diào)色板
GUI_DrawBitmap(&bm2,0,0); //繪制位圖,位圖文件為2.c
GUI_SetFont(&GUI_FontHZ_Song_16);//設(shè)置當(dāng)前字體16×16 宋體
GUI_DispStringAt("uC/GUI 移植實(shí)現(xiàn)",10,40); //顯示漢字
…
這兩個(gè)函數(shù)寫好,并測試可以正常顯示后,接下來需要修改TFT與UCGUI關(guān)聯(lián)的函數(shù)(在一個(gè)C文件下(我的是ili9320_ucgui.c),建議大家在移植GCGUI之前最好下載個(gè)別人移植好的例程,對著修改這樣難度降低很多):
int LCD_L0_Init(void)
{
TFT_Init();
return 0;
}
這個(gè)函數(shù),是GCGUI初始化TFT需要調(diào)用的,里面的函數(shù)就是你TFT底層驅(qū)動(dòng)的初始化函數(shù)。
void LCD_L0_SetPixelIndex(int x, int y, int PixelIndex)
{
LCD_SetPixel(x,y,PixelIndex);
}
unsigned int LCD_L0_GetPixelIndex(int x, int y)
{
return LCD_GetPixel(x,y);
}
上面兩個(gè)函數(shù)是其他函數(shù)的最基本元素,其他函數(shù)比如畫線、點(diǎn)、圓都需要調(diào)用改函數(shù)。里面的LCD_SetPixel(x,y,PixelIndex)、LCD_GetPixel(x,y);就是你TFT底層驅(qū)動(dòng)設(shè)置像素和獲取像素的兩個(gè)函數(shù)。
緊接著把該ili9320_ucgui.c文件下其他函數(shù)修改一下(凡是遇到設(shè)置像素和獲取像素的地方用以上兩個(gè)函數(shù)代替。)
接著,修改另一個(gè)C文件(ili9320_api.c)這里修改很簡單,僅僅也是將設(shè)置像素和獲取像素的函數(shù)替換掉自己定義的即可。
4:GUI_X文件夾內(nèi)包括有與硬件聯(lián)系緊密的文件
GUI_X文件夾下:
GUI_X.C——無操作系統(tǒng)情況
GUI_X_embOS.c——嵌入式操作系統(tǒng)
GUI_X_ucos.c——UCOS環(huán)境下
GUI_X.c包括大部分與硬件的關(guān)聯(lián)函數(shù),如定時(shí)器的初始化和觸摸屏相關(guān)函數(shù)。
uc/GUI與操作系統(tǒng)掛接的核心是定時(shí)器的設(shè)置和掛接。
uc/GUI是通過延時(shí)函數(shù)GUI_Delay()調(diào)用GUI_X_Delay,再調(diào)用GUI_Exec()處理窗口部件中的回調(diào)函數(shù)進(jìn)行重繪。在任何一款嵌入式操作系統(tǒng)中都需要定時(shí)器的心臟跳動(dòng)作用,支持OS的uc/GUI可以通過定時(shí)器的設(shè)置達(dá)到嵌入式操作系統(tǒng)和圖形系統(tǒng)的實(shí)時(shí)和同步操作。在GUI_X_uCos.c中通過uc/os中的延時(shí)程序同μc/GUI掛接實(shí)現(xiàn)整合。
4:移植完畢
經(jīng)過移植之后,GUI應(yīng)用程序開發(fā)通過uc/GUI而變得非常容易,在調(diào)用GUI_Init()后,用戶可以根據(jù)需要正確配制uc/GUI后,可使用其強(qiáng)大的庫函數(shù)和豐富的GUI資源進(jìn)行編程。在GUI編程過程中,可以打開抗鋸齒功能減小圖形失真,得到高質(zhì)量的圖形和字體效果。采用內(nèi)存設(shè)備能有效克服閃爍現(xiàn)象,獲得更快的顯示速度,但它和抗鋸齒功能一樣需要額外的內(nèi)存開銷。