准备资料:
1、 到网上下载UCGUI3.90的源码,如果下不到,可以点击以下链接进行下载:
http://download.csdn.net/detail/ballack_linux/8122901
下载后解压,可看到如下目录:
Sample目录主要包含一些示例代码,Start目录包含工程文件和源码,Tool包含一些取模工具,很实用。
开始移植:
1、 此例程是基于“ALIENTEKMINISTM32 实验10 TFTLCD显示实验”来移植的。打开该目录目录,可以看到:
在此路径下建立一个UCGUI文件夹。建立后如下:
2、 将UCGUI 3.90目录下的Start\GUI下的所有文件夹和Config文件夹拷贝到上面建立的UCGUI文件夹下:
此时需要注意:由于UCGUI\Core下有LCD.C和LCD.H文件,而例程中也有,如下:
所以将ALIENTEK MINISTM32实验10 TFTLCD显示实验\HARDWARE\LCD路径下的Lcd.c改名为local_lcd.c,Lcd.h改名为local_lcd.h。
3、 将UCGUI源码和local_lcd.c添加到工程中,如下:
记得添加路径到工程中,
4、 将local_lcd.c和main.c中的#include"lcd.h"改为#include "local_lcd.h",编译,报错如下:
函数重名引起的错误,在此将local_lcd.c和local_lcd.h中的void LCD_Init(void);改为void LCD_Local_Init(void); 同时把main.c中的LCD_Init();调用先注释掉。再次编译,报错如下:
将UCGUI最新3.90版源码\UCGUI390a\Sample下的GUI_X文件夹也拷贝到UCGUI路径下,并把GUI_X.c添加到工程中。
再次编译,报错:
可在LCD.h中找到如下宏定义:
然后继续跟踪,可以看到在LCDDummy.c、LCDNull.c、LCDWin.c都有定义LCD_L0_SetLUTEntry函数。在此例程中使用LCDDummy.c文件,打开该文件可看到整个文件都由以下宏决定是否参与编译:
将其修改为
在工程中查找LCD_CONTROLLER,可以看到在LCDConf.h中定义了:
将其改为:
再次编译,报错:
打开gui_touch_driveranalog.c文件,可以看到:
查找GUI_SUPPORT_TOUCH,可以在GUIConf.h文件中看到如下定义:
由于在此没有跑操作系统,也没有使用触摸屏,也暂时用不到中文字符,更没有用到动态内存分配,只是用TFT来做显示。所以改动如下:
可以看到,编译通过了:
5、 在main.c中包含gui.h头文件,即#include“gui.h”,又报错了:
这个问题我找了大半天,可以查到在GUIType.h中有如下定义:
LCD_COLOR是在LCD.h中定义的,而GUIType.h中是有#include “LCD.h”的,那这是为啥呢?
打开LCD.h,可以看到预编译指令如下:
打开local_lcd.h和local_lcd.c,可以找到如下:
看到原因了吧?local_lcd.h用LCD_H定义了TFT屏的高度,而LCD.h用LCD_H作为整个文件的预编译控制。所以导致了#include “LCD.h”根本就没包含到GUIType.h里面去!!!所以做如下修改:
将local_lcd.h和local_lcd.c中的LCD_W改为LCD_WIDTH,LCD_H改为LCD_HEIGHT。改完后如下:
再次编译,通过了!!
6、 接下来需要在UCGUI源码中添加一些LCD驱动的函数。具体如下:
① 我们使用GUI之前,肯定要对GUI进行初始化,此时会调用GUI_Init()函数,GUI_Init()函数中调用了LCD_Init();由于我们此例程用的是LCDDummy.c文件,在LCDDummy.c文件的LCD_Init();函数中又调用了LCD_INIT_CONTROLLER();我们可以在LCDConf.h文件中找到该定义:
将其改为
然后在LCDDummy.c文件头添加
② 在local_lcd.c中添加以下函数,并在local_lcd.h中添加声明:
③ 在LCDDummy.c中包含local_lcd.h头文件,然后在其中几个函数中添加内容:
7、 此时可以写一个测试程序测试了,我们一般使用红黄蓝565的分配比例,而且在有些TFT屏会发现红蓝两种颜色是相反的,我使用的屏正好是相反的,所以可以在LCDConf.h中通过定义以下宏,来交换红蓝两色:
8、 下面我写了一个测试的例程,是显示进度条的简单例程。
Main.c中改成如下:
烧录到板子上,你会发现只有“Progressbar”字幕和进度条显示,但是进度条没动作。
这是为啥呢,可以查到,是卡死在GUI_Delay(intPeriod)函数中,深入到底层查看,可以知道如果不带操作系统,是会陷入死循环的。可以自己写一个函数做延时函数,也可以使用正点原子的SysTick作为延时的基准。我的处理如下:
在GUITime.c中添加
9、 编译后通过,下载到板子,可以看到有一个进度条在执行进度。
资源下载地址:http://download.csdn.net/detail/ballack_linux/8125055