ucGUI 移植

本文用UCGUI398,下载完整的UCGUI的源代码,start文件夹下需要用到GUI和Config两个文件夹,Sample文件夹下需要用到GUI_X文件夹。

目录内容:

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,视窗管理器; 

移植uC/GUI主要集中在修改三个头文件和两个C文件:
三个头文件都在\Config下,分别是GUICon.h ,GUITouchConf.h,LCDConf.h ;
两个C文件一个是GUI_X.C(Sample\GUI_X.C),另外一个在GUI\LCDDriver目录下(LCDWin.c)。


1、修改头文件LCDConf.h
主要修改的地方:
#define LCD_XSIZE  (240)
#define LCD_YSIZE  (320)
//#define LCD_BITSPERPIXEL (8)
#define LCD_BITSPERPIXEL (16)  //16Bpp
#define LCD_CONTROLLER 1375 //有控制器写控制器  没控制器写-1
LCD_XSIZE  ,LCD_YSIZE 是对应你的LCD的尺寸大小
LCD_BISPERPIXEL  指定每象素的位的数量


2、修改头文件GUI_Conf.h
#ifndef GUICONF_H
#define GUICONF_H
#define GUI_OS  (0)
#define GUI_SUPPORT_TOUCH  (0)
#define GUI_SUPPORT_UNICODE  (1)
#define GUI_DEFAULT_FONT  &GUI_Font6x8
//#define GUI_ALLOC_SIZE  12500
#define GUI_ALLOC_SIZE  1024*4
#define GUI_WINSUPPORT  0
#define GUI_SUPPORT_MEMDEV  0
#define GUI_SUPPORT_AA  0
#endif
GUI_0S:位1时支持OS,否则就是裸跑吧
GUI_SUPPORT_TOUCH:是否支持触摸屏
GUI_SUPPORT_UNICODE:是否支持ASCII/UNICODE
GUI_DEFAULT_FONT:选择一个默认的字体
GUI_ALLOC_SIZE:动态内存的大小 //这里很重要,较大时,导致代码太大编译通不过,可以修改小些
GUI_WINSUPPORT:是否支持 WM(视窗管理器)
GUI_SUPPORT_MEMDEV:是否支持存储设备
GUI_SUPPORT_AA:是否支持反锯齿


3、修改 GUITouchConf.h
如果需要支持触摸屏的话,这个头文件也要作相应的修改。


4、修改 LCDWin.c(GUI\LCDDriver\LCDWin.c)
在LCD的最基本操作就是在某一个坐标上画点,其他的操作都是画点操作延伸出来的。必须要把画点这个函数连接到uC/GUI的代码里面。连接的函数就在LCDDriver下,我选用LCDWin.c(还有两个文件是LCDNULL.c和LCDDUMMY.c,这三个文件选一个作为驱动程序就可以,都是些模板)

修改这个文件的时候要注意,首先要屏蔽掉第一行的条件编译语句 #if defined(WIN32) && !defined(LCD_SIMCONTROLLER) 和文件的最后一行的#endif  顺便把#endif头上的#else 也干掉。这个文件是针对PC仿真的,不注释掉这几个地方,整个文件都不会被编译的。

分别根据自己的硬件板重写如下函数:
void LCD_L0_DrawPixel(int x, int y) 
void LCD_L0_DrawHLine(int x0, int y,  int x1) 
void LCD_L0_DrawVLine(int x, int y0,  int y1) 
void LCD_L0_FillRect(int x0, int y0, int x1, int y1) 
void LCD_L0_DrawBitmap(int x0, int y0,
                       int xsize, int ysize,
                       int BitsPerPixel, 
                       int BytesPerLine,
                       const U8* pData, int Diff,
                       const LCD_PIXELINDEX* pTrans)
void LCD_L0_SetOrg(int x, int y)
int  LCD_GetErrStat(void) 
void LCD_ClrErrStat(void) 
int  LCD_GetErrCnt (void) 
void LCD_Off(void) {}
void LCD_On(void) {}
int  LCD_L0_Init(void) 
int  LCD_L0_CheckInit(void) 
void LCD_L0_ReInit(void)
unsigned LCD_L0_GetPixelIndex(int x, int y)
void LCD_L0_XorPixel(int x, int y) 
void LCD_L0_SetPixelIndex(int x, int y, int ColorIndex)
void * LCD_L0_GetDevFunc(int Index)

说明:有的函数可以不用修改,可以用它软件的实现,有的则要重写,有的则可以直接返回0,完全有你个人的硬件板所决定。

    
5、修改GUI_X.C(Sample\GUI_X.C)文件,这主要是系统级的函数。
在GUI_X这个文件夹下有3个GUI_X*文件。分别为:GUI_X.c、GUI_X_embOS.c、GUI_X_ucOS.c这3个文件分别对应无操作系统、embOS和ucOS。
分别根据自己的硬件板重写如下函数:
void GUI_X_Init(void) 
void GUI_X_InitOS()
void GUI_X_Unlock()
void GUI_X_Lock()
int GUI_X_GetTime(void)
void GUI_X_Delay(int ms) 
int GUI_X_GetTaskID()
void GUI_X_ExecIdle(void)
void GUI_X_UpdateScreen()
void GUI_X_Log     (const char *s) { GUI_USE_PARA(s); }
void GUI_X_Warn    (const char *s) { GUI_USE_PARA(s); }
void GUI_X_ErrorOut(const char *s) { GUI_USE_PARA(s); }
     
说明:有的函数可以不用修改,可以用它软件的实现,有的则要重写,有的则可以直接返回0,完全有你个人的系统所决定。


做完以上的工作基本上算是完成了移植的工作了。

最后在主函数上编写测试程序:

int Main()
{
        GUI_Init();
        GUI_DispString("jhluroom,Hello world!");
        for(;;);
        return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
最近在弄ucGUI移植,网上搜了不少资料,也问了同学,总算把简单的一个程序弄好了,现在跟大家分享下心得。该程序是直接用的原子大哥的TFTLCD显示的例子,直接拿过来移植的。所用到的是原子大哥TFTLCD例子(库函数版本)和ucGUI3.90源码。 建工程就不说了,附件里有,相信大家也看到别人建的工程了,下面直接说重点。 由于ucGUI移植笔记内容太多,就介绍其中几点(具体的还需看附件内容): 1. 如果LCD驱动文件是lcd.c和lcd.h,最好改为别的名字,比如ili93xx.c和ili93xx.h。然后还要把LCD_Init()初始化函数改为LCDx_Init(); 2. 需要改的地方: A. LCDConf.h中按照下面的图就行,其余的可以删除掉,注意红框中是刚刚改过的LCD初始化函数,改为刚刚更改的初始化函数就行。 B.接下来事GUIConf.h中的设置,目前只是用到简单的一个现实函数,多以就全部设为0 C. 这个是LCD驱动函数的修改,这三个最好改红框选中的文件。 接下来就是更改的第一块,首先的把第1部所更改的相应的LCD底层函数的头文件加进来,不然ucGUI没办法正常工作。然后就是第二个红框给为自己的驱动芯片型号。 再就是第二块,找到画蓝线的两个函数,用方框里的函数取代,如果是用原子大哥的,第一个函数必须要用快速画点函数,因为函数参数里有颜色这个参数,画点函数没有,如果是别的程序,也是一样,加入画点函数就行,但必须要有颜色的参数。第二个函数就是读取某点的颜色值的函数,加进来就行,我这儿直接就用了原子大哥的程序。 3. 最后修改主函数 有人纳闷了,为什么把LCD初始化函数 给注释掉了,没关系,在前面 文件中不是有个宏定义嘛 这个宏定义已经在 这个文件中调用,见下图哦 还有一项特别注意的,如果你用原子大哥的LCD初始化函数,移植完后,你会发现你的屏幕先白屏一下之后就马上黑屏,而且后面无论设置什么颜色都是这样的情况。在调用GUI_Init()的时候,这个函数会进入LCD_Init(),然后再LCD_Init()函数里面有这样的语句 #if (GUI_DEFAULT_BKCOLOR != GUI_INVALID_COLOR) /* Clear video memory */ LCD_SetDrawMode(GUI_DRAWMODE_REV); LCD_FillRect(0,0, GUI_XMAX, GUI_YMAX); LCD_SetDrawMode(0); #endif 这句#if (GUI_DEFAULT_BKCOLOR != GUI_INVALID_COLOR)里面的GUI_DEFAULT_BKCOLOR 初值是OXFFFF, GUI_INVALID_COLOR 初值也是0XFFFF,而原子哥的初始化函数最后有一句LCD_Clear(WHITE);这样就把 GUI_INVALID_COLOR 的值设置成了0X0000;导致调用了下面的三个函数。从而出现上面的问题。只要把 原子哥 的初始化函数LCD_Clear(WHITE); 注释掉就不会错了,小问题大错误。这是引用的hua290565456的帖子里的话,觉得很有用,就粘贴过来了。 这就是一个基本的ucGUI移植。该笔记放在附件了,有工程和源码,还有此贴的word文档。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值