UCGUI学习之路(2)移植
开始学习之前,先简单说说我的移植过程及一些问题的解决。
一、 首先下载UCGUI的源代码。
我用的是3.90版的,并且准备一个简单工程,并且编译无误。
二、 复制文件。
打开源代码文件夹,复制START\GUI目录下所有文件到工程文件夹中,
复制START\CONFIG 目录下所有文件到工程目录下的GUI文件夹中,
复制SAMPLE\GUI_X文件夹到工程目录下的GUI\CONFIG文件夹中。
三、修改文件。
打开之前建好的mdk工程,把拷贝入工程中的ucgui文件加入工程中,
相应的头文件也要加上。
四、把具体使用的LCD的低层驱动加到GUI_LCDDriver文件下。
当然别处也可以。源文件中我之所以放此文件夹中,
想着以后复制到别的工程时方便。要注意的是自己的 lcd 底层驱动不能命名为 lcd.c 和 lcd.h,这样编译会出错,
因为在 ucgui内部文件中已经有 lcd.c 和 lcd.h 文件,比如我这里使用 lcd_base.c。而这个驱动程序最重要的就是三个函数:
1、lcd 初始化函数,我定义的是void LCD_base_Init(void);记好这个初始化的函数名不能定义为LCD_Init();
因为在 UCGUI 文件中已经使用了这个函数名,所以会导致编译出错。
还有就是返回看第五步配置文件最下面用到的就是这个函数,
你的文件 lcd 初始化文件名换的话也别忘了给第五步配置中的也替换掉。
2、lcd 填充一个像素的函数,我定的的是void LCD_Fast_DrawPoint(u16 x,u16 y,u16 color);
3、得到一个像素颜色的函数我定义的是 u16 LCD_ReadPoint(u16 x,u16 y);
五、修改源文件,
要修改的文件主要是这三个 LCDDummy.c GUIConf.h LCDConf.h文件。
上层配置:也就是GUI一些功能的开关,打开
GUIConf.h文件:
按照如下代码配置:(注:0 是关,1是开)
#ifndef GUICONF_H
#define GUICONF_H
#define GUI_OS (0) //操作系统的支持,当用到 ucos时需要打开
#define GUI_SUPPORT_TOUCH (0) /* 触摸屏的支持,这里关闭*/
#define GUI_SUPPORT_UNICODE (1) /* 建议初始关闭,以后用汉字库时再打开*/
#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 /* 抗锯齿功能,打开后可以提高显示效果,建议先关闭*/
#endif
上层配置完当然还有下层,就是 LCDConf.h文件,这个也很简单,它原来的看
起来比较复杂,我这里把它简化了,大家用的时候可以把我的拷贝过去替换掉原
来的,代码如下:
#ifndef LCDCONF_H
#define LCDCONF_H
#define LCD_XSIZE (240) //具体LCD屏幕X方向像素
#define LCD_YSIZE (320) //具体LCD屏幕Y方向像素
#define LCD_CONTROLLER (-1) //一个标志位,用来指定初始化函数,后面看了就明白了
#define LCD_BITSPERPIXEL (16) //颜色深度
#define LCD_FIXEDPALETTE (565) //RGB颜色格式
#define LCD_SWAP_RB (1) //红蓝交换
#define LCD_SWAP_XY (1) //xy坐标交换
//LCD_MIRROR_X
#define LCD_INIT_CONTROLLER() LCD_base_Init(); //指定初始化函数,这里是具体LCD屏的初始化函数。
#endif
关于配置中 LCD
型号问题,这里我们用的是通用型的方法也就是没有用到官方提供的具体型号配置文件,所以这里具体型号填-1,
要是用官方配置文件那就要填具体型号了,比如我看他们的例程用到的是ili9320,这里的-1就改为9320.
有的同学可能还看到 GUIConfig目录下还有GUITouchConf.h文件,其实这里可以不管了,因为我们在GUIConf.h中有#define
GUI_SUPPORT_TOUCH (0)
这条语句把触摸屏的功能已经关闭,当然以后用到触摸时还要具体配置,这里就不探讨了。其实这一部分很简单关键就是几个开关的控制和一个lcd初始化函数的替换。
六、现在最关键的就是要ucgui能够找到lcd的底层驱动并且进行连接。
这一步就是修改LCDDummy.c文件了。
1、打开 LCDDummy.c文件,在开头的头文件中增加语句#include”lcd_base.h”,把lcd的底层驱动接口包含进来。
2、将接下来这句话#if (LCD_CONTROLLER == -1) && (!defined(WIN32) |defined(LCD_SIMCONTROLLER))中 后 半 部 分 的 删 掉 ,
即 剩 下#if(LCD_CONTROLLER == -1)这一句就行了,要是不修改的话整个LCDDummy.c文件都不会编译。
3、再往下找到 void LCD_L0_SetPixelIndex(int x, int y, int PixelIndex)这个函数把函数里面的都删掉然后用自己的填充一个像素的函数替换掉如下所示:
void LCD_L0_SetPixelIndex(int x, int y, int PixelIndex)
{
LCD_Fast_DrawPoint(x,y,PixelIndex);//画点
}
4、同上一步操作,只是这里用的是得到一个像素颜色的函数,如下:
unsigned int LCD_L0_GetPixelIndex(int x, int y)
{
return LCD_ReadPoint(x,y);
}
七、到此移植的基本工作已经完成,然后就是编译测试了。
编译通过后,修改main函数如下:
int main()
{
delay_init(168); //初始化延时函数
uart_init(115200);//初始化串口
//以上是初始化是为了单片机可以正常运行,具体可能不同
//下面才是GUI相关代码
GUI_Init(); //初始化
GUI_SetBkColor(GUI_BLUE); //设置背景颜色
GUI_SetColor(GUI_WHITE); //设置前景颜色
GUI_Clear(); //清屏
GUI_SetFont(&GUI_Font32_ASCII); //设置字体,如果不设置,就使用默认的字体
GUI_DispStringAt("Hello World!",40,10); //打印字符串
GUI_SetPenSize(5); //设置画笔大小
GUI_SetColor(GUI_YELLOW); //设置画笔颜色
GUI_DrawLine(50,80,190,80); //画线
GUI_SetPenSize(10); //设置画笔粗细
GUI_SetColor(GUI_RED);
GUI_DrawLine(50,120,190,120); //画线
GUI_SetColor(GUI_GREEN);
GUI_FillCircle(120,220,60); //画圆
while(1);
}
如果颜色和自己设定的不一样,就要修改自己的底层驱动。
八、如果编译,下载到开发板,能够显示图片,就移植成功了。
如果还有报错,可能的原因有:
1、一些头文件没有包含,仔细检查一下。
2、一些变量的名字跟自己编写的底层函数有冲突,注意修改一下。