作者:彭晓林
联系方式:196568501(QQ)
mail:bookworepeng@Hotmail.com
最近移植了UCGUI 想把他写下来跟正在关注ucgui的人一起探讨和学习,初次写东西还希望大侠们多多指教。
移植分为主要的三步:
第一步:
下载ucgui源码,在你编译目标代码的编译器上编译通过你的UCGUI源码。
第二步:
找到最底层函数,跟你的液晶驱动器对接。
第三步:
测试你一直的gui功能。
编译ucgui
第一步详解:
编译器:vitual dsp 4.5 ucgui 版本 3.9
打开 GUIConf.h 根据我的实际需要配置此文件
原配置如下:
#define GUI_OS (1) /* Compile with multitasking support */
#define GUI_WINSUPPORT (1) /* Use window manager if true (1) */
#define GUI_SUPPORT_MEMDEV (1) /* Support memory devices */
#define GUI_SUPPORT_TOUCH (1) /* Support a touch screen (req. win-manager) */
#define GUI_SUPPORT_MOUSE (1) /* Support a mouse */
#define GUI_SUPPORT_UNICODE (1) /* Support mixed ASCII/UNICODE strings */
#define GUI_SUPPORT_AA (1) /* Support for antialiasing */
#define GUI_SUPPORT_BIDI (1) /* Support for bidirectional text */
配置后如下:
#define GUI_OS (1) /* Compile with multitasking support */
#define GUI_WINSUPPORT (1) /* Use window manager if true (1) */
#define GUI_SUPPORT_MEMDEV (0) /* Support memory devices *///打开此宏定义后编译通不过,错误最后没改后,时间紧,后来就把宏定义给关掉了
#define GUI_SUPPORT_TOUCH (0) /* Support a touch screen (req. win-manager) */
#define GUI_SUPPORT_MOUSE (0) /* Support a mouse */
#define GUI_SUPPORT_UNICODE (1) /* Support mixed ASCII/UNICODE strings */
#define GUI_SUPPORT_AA (1) /* Support for antialiasing */
#define GUI_SUPPORT_BIDI (1) /* Support for bidirectional text */
编译后后会遇到如下问题:
以下函数找不到——
void GUI_X_Init(void);
/**** ExecIdle - called if nothing else is left to do ****/
void GUI_X_ExecIdle(void);
/**** Timing routines - required for blinking ****/
int GUI_X_GetTime(void);
void GUI_X_Delay(int Period);
/**** Multitask routines - required only if multitasking is used (#define GUI_OS 1) ****/
void GUI_X_Unlock(void);
void GUI_X_Lock(void);
U32 GUI_X_GetTaskId(void);
void GUI_X_InitOS(void);
先不用管,先编译通过了再说。
移植
第二步详解:
1.写刚刚上面定义的空函数
其中这几个函数是跟你跑的目标机的操作系统相关的可以先把支持操作系统那个宏定义关闭(在GUIConf.h 文件中更改为:#define GUI_OS (0) void GUI_X_Unlock(void);)
void GUI_X_Lock(void);
U32 GUI_X_GetTaskId(void);
void GUI_X_InitOS(void);
在此函数中如果跑系统可以加系统延时
void GUI_X_ExecIdle(void);
此函数调用系统时间如果你的系统有实时时钟之类的可以将实时时钟驱动程序放在这里面。没有也没关系只是调用系统时间相关的函数不能用而已,可能这个功能很多人也不会用。
int GUI_X_GetTime(void);
此函数用于GUI的延时,如果没有跑系统,就自己手动的写个延时程序,如果跑了操作系统,就调用系统的延时函数。
void GUI_X_Delay(int Period);
此函数可以将你的液晶初始化代码放在这里,当然你把初始化放在运行gui的代码前也能正常运行,但是这样不有利于,GUI的整体封装。
void GUI_X_Init(void);
2.找出底层的接口函数。(此步骤也是最重要的一步)
2.1 找出接口函数的方法如下
在GUI中运行一个绘图函数,
例如:在GUI中运行
GUI_DrawCircle(0, 0, 10);
单步运行,直到跟踪到最底层代码。
其中所有的绘制操作和获取像素点的值都是下面两个函数
void LCD_L0_SetPixelIndex(int x, int y, int PixelIndex);
unsigned int LCD_L0_GetPixelIndex(int x, int y);
在void LCD_L0_SetPixelIndex(int x, int y, int PixelIndex);中在如下地方写自己的画点函数即可
/* Write into hardware ... Adapt to your system */
{
/* ... */
}
在unsigned int LCD_L0_GetPixelIndex(int x, int y);中在如下为止写获取像素值的函数即可
/* Read from hardware ... Adapt to your system */
{
PixelIndex = 0;/* ... */
}
此部分昨晚移植工作关键的就完成了。
然后就是测试功能了。
第三步,
测试功能,
此部分应该不用说也知道该怎么做了。