UCGUI是一種嵌入式應用中的圖形支持系統(tǒng)。它設計用于為任何使用LCD圖形顯示的應用提供高效的獨立于處理器及LCD控制器的圖形用戶接口,它適用單任務或是多任務系統(tǒng)環(huán)境, 并適用于任意LCD控制器和CPU下任何尺寸的真實顯示或虛擬顯示。
它的設計架構是模塊化的,由不同的模塊中的不同層組成,由一個LCD驅動層來包含所有對LCD的具體圖形操作。UCGUI可以在任何的CPU上運行,因為它是100%的標準C代碼編寫的。
類似程序還有國產的一個MINIGUI (http://www.minigui.com/zhcn/),MiniGUI 是一個自由軟件項目。其目標是提供一個快速、穩(wěn)定、跨操作系統(tǒng)的圖形用戶界面(GUI)支持系統(tǒng),尤其是基于 Linux/uClinux、eCos 以及其他傳統(tǒng) RTOS(如 VxWorks、ThreadX、uC/OS-II、Nucleus 等)的實時嵌入式操作系統(tǒng)。有機會嘗試下,支持下國產,畢竟國內這樣的公司不多。。
這里移植的UCGUI3.90a版本,雖然已經有更新的版本,比如UCGUI3.98、甚至4.04版本。但是目前來說只有這個版本的代碼是最全的,包括了JPEG , MULTILAYER , MEMDEV ,AntiAlias等模塊。一直想嘗試做一個數碼相冊,JEPG模塊自然少不了,所以移植了這個版本。
UCGUI390a 下載
整個移植過程,讓LCD顯示圖案倒是沒花多少時間,資料也比較多,但是在移植觸摸屏的時候卡了好幾天,然后又是 UCGUI 指針圖標 移動有重影(LCD讀取像素顏色函數有問題)。。??傊浦彩莻€累人的活
首先需要保證你的LCD驅動和觸摸屏驅動是有效的,如果你的LCD也是ili93xx 控制器 XPT2046控制器的觸摸屏可以參考stm32 驅動 TFT LCDstm32 驅動 觸摸屏兩篇文章
UCGUI的文件數量很大,主要用到UCGUI390a/Start/Config 和 UCGUI390a/Start/GUI兩個文件夾下文件,不過文件數量也已經很多了 。。。
相關文件介紹如下:
將Config和GUI下所有文件加入工程,MDK中新建工程需要劃分好結構,這是UCGUI官方推薦的結構:
JPEG, MemDev , MultiLayer ,Widget , Wm 這5 個文件夾的內容可以暫時不加入MDK工程。
因為這些文件起到的是擴展功能,在移植階段可以先不添加,等到以后用到其中的功能時再選擇添加。但是建議都添加進去,避免遇到各種無解問題。。
當然前提是在配置時要把相應的功能開關關掉,在下面的步驟中會提到。
ConverMono , ConverColor ,Core ,Font 這四個目錄下的文件是不用修改的。
要修改的文件在LCDDriver ,Config 這兩個目錄下。
LCDDriver 是LCD的驅動接口函數文件,需要將自己的LCD驅動函數提供給UCGUI調用。
需要提供3個LCD底層驅動函數:
void LCD_L0_SetPixelIndex(int x, int y, int PixelIndex) LCD畫點函數,用指定顏色填充一個像素
unsigned int LCD_L0_GetPixelIndex(int x, int y) LCD讀取定點顏色函數,讀取一個像素點的16位RGB顏色值
void LCD_L0_FillRect(int x0, int y0, int x1, int y1) 矩形填充函數,用指定顏色填充一個矩形 。這個函數也可以不改 使用UCGUI的函數,用一個一個的像素點填充成一個矩形。也可以在底層驅動根據像素個數直接往GRAM 中寫數據,封裝成函數,供這個函數調用。速度會快很多。
其他的畫線畫圖形函數,也可以同樣優(yōu)化。
LCDDriver下有三個文件,LCDDummy.c 、 LCDNull.c 和LCDWin.c。 這三個都是UCGUI LCD接口模板文件。功能一樣,只是移植時修改的細節(jié)不一樣。我們可以選用其中一個,稍作修改作為接口文件。以LCDDummy.c為例:
#include"LCD_Private.h"/*privatemoduldefinitions&config*/#include"GUI_Private.h"#include"GUIDebug.h"/*#if(LCD_CONTROLLER==-1)&&(!defined(WIN32)|defined(LCD_SIMCONTROLLER))*///必須注釋,否則不會編譯#include"ili93xx.h"http://包含你的LCD驅動函數聲明#if(LCD_CONTROLLER==-1)//這句對應Config/LCDConf.h................voidLCD_L0_SetPixelIndex(intx,inty,intPixelIndex){POINT_COLOR=PixelIndex;//我的畫點函數使用了一個全局變量設定顏色LCD_DrawPoint(x,y);//畫點函數}................unsignedintLCD_L0_GetPixelIndex(intx,inty){returnLCD_ReadPoint(x,y);//我的讀取像素顏色函數}................voidLCD_L0_FillRect(intx0,inty0,intx1,inty1){LCD_Fill(x0,y0,x1,y1,LCD_COLORINDEX);//填充矩形函數/*for(;y0<=y1;y0++){LCD_L0_DrawHLine(x0,y0,x1);}*/}
UCGUI提供了一些LCD控制器的驅動函數,但是這種配置方法,可以適用于任何控制IC。
到這就算完成三分之一了,接下來修改Config文件夾下文件,Config下有三個文件:
GUIConf.h LCDConf.hGUITouchConf.h
還需要加入一個GUI_X.c文件,要不然編譯的時候會有錯誤。直接復制UCGUI390aSampleGUI_XGUI_X.c即可。如果打開了觸摸功能還需要加入一個UCGUI390aSampleGUI_XGUI_X_Touch.c 。
這三個文件是UCGUI的上層配置文件,也就是GUI 一些功能的開關。
GUIConf.h:
#ifndefGUICONF_H#defineGUICONF_H#defineGUI_OS(0)/*操作系統(tǒng)的支持,當用到ucos時需要打開Compilewithmultitaskingsupport*/#defineGUI_SUPPORT_TOUCH(1)/*觸摸屏的支持Supportatouchscreen(req.win-manager)*/#defineGUI_SUPPORT_UNICODE(0)/*用漢字庫時再打開SupportmixedASCII/UNICODEstrings*/#defineGUI_DEFAULT_FONT&GUI_Font6x8/*定義字體大小*/#defineGUI_ALLOC_SIZE12500/*分配的動態(tài)內存空間Sizeofdynamicmemory...ForWMandmemorydevices*//***********************************************************************Configurationofavailablepackages*/#defineGUI_WINSUPPORT1/*窗口功能支持要使用指針圖標必須打開Windowmanagerpackageavailable*/#defineGUI_SUPPORT_MEMDEV1/*內存管理Memorydevicesavailable*/#defineGUI_SUPPORT_AA1/*抗鋸齒功能,打開后可以提高顯示效果Antialiasingavailable*/#endif/*Avoidmultipleinclusion*/
LCDConf.h
#ifndefLCDCONF_H#defineLCDCONF_H#defineLCD_XSIZE(240)/*lcd的水平分辨率X-resolutionofLCD,Logicalcoor.*/#defineLCD_YSIZE(320)/*lcd的垂直分辨率Y-resolutionofLCD,Logicalcoor.*/#defineLCD_BITSPERPIXEL(16)/*16位顏色RGB值顏色深度*/#defineLCD_SWAP_RB(1)/*紅藍反色交換*//*lcd控制器的具體型號**設置為-1時會編譯LCDDriver下LCDDummy.c*設置為-2時會編譯LCDDriver下LCDNull.c**還需要修改LCDDriver下文件的宏定義才可以被編譯*eg.LCDDummy.c:**#if(LCD_CONTROLLER==-1)&&(!defined(WIN32)|defined(LCD_SIMCONTROLLER))*改為*#if(LCD_CONTROLLER==-1)*/#defineLCD_CONTROLLER-1//設置為-1-2,因為UCGUI沒有相應LCD控制IC驅動#defineLCD_INIT_CONTROLLER()LCD_Config();//綁定相關LCD底層驅動的初始化函數