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