轉自http://www.openedv.com/posts/list/20610.htm
UCGUI移植初級解析
-----------------如何建立一個簡單的UC/GUI工程
僅供像我這樣的新手學習UCGUI使用
做UCGUI移植,首先要選擇好自己硬件平臺,UCGUI源碼,液晶的底層驅動。關於硬件和GUI源碼(我選的源碼3.90版,原子STM32MINI開發板)不必多說。其次,液晶的底層驅動函數得要好好準備,這可是直接和GUI源碼打交道的。
補充說明:移植之前,先要準備一個完整的KEIL工程,所謂完整,就是沒添加源碼TFT也能任意畫點顯示。這一點對我們新手來說是至關重要的。如果你是用原子的mini做實驗那就更好了,在準備KEIL工程的時候可以直接把原子的TFT實驗複製過來。
好了,開始移植講解!
1. 構建液晶底層驅動函數。
這部分代碼,實際上包含這幾個功能:液晶初始化功能、控制IC讀取點座標功能、畫點功能。底層的驅動一般來說液晶的廠家都會給帶,還有要注意驅動IC的型號,GUI源碼所帶的IC驅動函數往往沒有合適的,至少我沒碰到,呵呵呵。
這是我的底層函數,先列舉三個比較重要的:
LCD_ReadPoint(u16 x, u16 y);//讀取點座標
LCD_SetPoint(u16 x, u16 y, u16 color );//畫點
TFT_Init(void);//初始化函數
2. 從GUI源碼裏複製代碼,進行工程搭建
(1):複製源碼/Start 文件下的GUI和Config這兩個文件夾到自己的工程模板;
圖片指示:
(2):複製源碼/Sample/GUI_X 文件夾下的 GUI_X.c 文件,粘貼到工程模板下的Config裏;
圖片指示:
(3):打開KEIL工程(事先準備好的),KEIL界面左邊有個Project視窗,在Target1單擊右鍵,出現一個選項卡,在Groups裏創建各文件,然後依次Add Files,即添加.c .h 文件,這裏要着重說明:添加文件的時候,尤其是GUI源碼,文件類型選擇ALL Files(系統默認.c文件),就是爲了添加.h文件,這一點很重要。舉個例子吧,在Config文件夾下要添加GUI_X.c
GUIConf.h GUITouch.h LCDConf.h。
還有一個問題,網上有人說觸摸用不到,可以不用添加,然後字體也只添加幾個用得到的,我的意見是:全部添加,避免難以修改的KEIL警告,這點很重要,我是新手,我很清楚怎麼過來的,呵呵呵。
補充說明:新建TFTDrive.hILI93xx.c 兩個文件,這個TFTDrive.h是 ILI93xx.c的頭文件,通過TFTDrive.h找到ILI93xx.c裏的程序。這兩個文件裏面的內容,是事先準備好的,也就是我所說的沒加GUI源碼之前的完整的 KEIL工程的一部分。當然,這兩個文件放到LCDDriver文件夾裏面,添加的時候也一併添加進去就行。
(4):文件添加完了,還有一步呢,還要在添加路徑。點擊魔術棒,出現一個選項卡,點擊C/C++,在Include Paths裏包含文件路徑,所有文件的都要包進來哦。能玩移植的朋友們,我相信(3)(4)兩步對你們來說不難。
(5)
修改:Config / GUIConf.h文件
方法:
#define GUI_OS (0)
#define GUI_SUPPORT_TOUCH (0)
#define GUI_SUPPORT_UNICODE (0)
#define GUI_DEFAULT_FONT &GUI_Font6x8
#define GUI_ALLOC_SIZE 5000
#define GUI_WINSUPPORT (0)
#define GUI_SUPPORT_MEMDEV (0)
#define GUI_SUPPORT_AA (0)
其餘部分不需要改動
(6)
修改Config / LCDConf.h
方法:
#ifndef LCDCONF_H
#define LCDCONF_H
#define LCD_XSIZE (240) /* 水平分辨率X-resolution of LCD, Logical coor. */
#define LCD_YSIZE (320) /* 垂直分辨率Y-resolution of LCD, Logical coor. */
#define LCD_BITSPERPIXEL (16) /*lcd顏色深度*/
#define LCD_CONTROLLER (-1) /*lcd控制器的具體型號*/
#define LCD_FIXEDPALETTE (565) /*RGB顏色位數*/
#define LCD_SWAP_RB (1) /*紅藍反色交換*/
#define LCD_INIT_CONTROLLER() TFT_Init(); /*底層初始化函數,自己寫的,而非源碼自帶,這一步非常重要*/
#endif /* LCDCONF_H */
這是我修改之後的源碼,大家看看是不是聲明下面少了許多函數啊,沒錯,我刪掉了,原因很簡單,我的底層驅動IC程序是廠家提供的,而且GUI源碼也沒有我的這部分驅動程序。所以大家弄得時候也要一併刪除,只留下紅色代碼部分。
(7)
修改:LCDDriver / LCDDummy.c文件
方法:在這裏面添加幾個函數,關於這幾個函數就是我在開始列舉的幾個函數
LCD_ReadPoint(u16 x, u16 y);//讀取點座標
LCD_SetPoint(u16 x, u16 y, u16 color );//畫點
你的函數也許不是這個名字哦,大家不要照搬,這是你自己的驅動函數,在哪裏添加這兩個函數呢,不要着急,聽我來說,
還有一個頭文件 #include“TFTDrive.h”這個是你自己的底層驅動文件,把這個頭文件寫在LCDDriver / LCDDummy.c 中即可。必須要寫的 否則建立不起聯繫。
找到void LCD_L0_SetPixelIndex(int x, int y, int PixelIndex) {
/* Convert logical into physical coordinates (Dep. on LCDConf.h) */
#if LCD_SWAP_XY | LCD_MIRROR_X| LCD_MIRROR_Y
int xPhys = LOG2PHYS_X(x, y);
int yPhys = LOG2PHYS_Y(x, y);
#else
#define xPhys x
#define yPhys y
#endif
/* Write into hardware ... Adapt to your system */
{
添加LCD_SetPoint(x,y,PixelIndex);/* 自己自行添加的,畫點... */
}
}
找到unsigned int LCD_L0_GetPixelIndex(int x, int y) {
LCD_PIXELINDEX PixelIndex;
/* Convert logical into physical coordinates (Dep. on LCDConf.h) */
#if LCD_SWAP_XY | LCD_MIRROR_X| LCD_MIRROR_Y
int xPhys = LOG2PHYS_X(x, y);
int yPhys = LOG2PHYS_Y(x, y);
#else
#define xPhys x
#define yPhys y
#endif
/* Read from hardware ... Adapt to your system */
{
添加 PixelIndex=LCD_ReadPoint(x,y); //讀點
}
return PixelIndex;
}
至此,移植結束,大家是不是想看一看現象呢,接下來:
先修改主函數,添加 #include”GUI.h”//頭文件包含嘛,呵呵呵
在main()裏,添加:
GUI_Init();
GUI_SetBkColor(GUI_BLUE);
GUI_SetColor(GUI_RED);
GUI_Clear();
GUI_DrawCircle(100,100,50);//畫圓
while(1);
點擊編譯:
感想:關於移植,我個人覺得最困難的地方是底層驅動函數與GUI源碼打交道的部分,這部分的。C 。h文件一定要事先準備好,放到LCDDriver文件夾下面。這將直接決定你的移植是不是成功。
如有不足之處,敬請諒解!
製作
於2013/8/27