1、硬件设备
使用的是正点原子的F4探索者开发板,编写的工程实例也是基于正点原子的工程实例。
2、移植过程*
2.1下载源码以及添加文件夹
首先下载UCGUI源码,网上有很多,搜一下就能找到,我用的是3.98版本,这是我自己整理完成的ucGUI文件夹的百度云地址,到时候下载好,直接添加到工程文件里即可。
整理完成的ucGUI百度云下载地址
我们建立的工程是基于正点原子F4开发板的【TFTLCD显示实验】,打开相应的工程文件夹,在其中创建ucGUI的文件夹。由于ucGUI/CORE文件中已经存在了lcd.h和lcd.c的文件,所以我们将工程目录HARDWARE/LCD中的lcd.c文件和lcd.h文件的文件名换成ili93xx.c和ili93xx.h。然后打开ili93xx.c和ili93xx.h文件,将其中的void LCD_Init(void)函数更名为void LCD_hard_Init(void)以防与ucGUI中的原有函数名冲突。
我是首先将以上步骤完成之后编译一下没错误,TFTLCD测试程序正常能使用,说明没有改错,然后再进行下一步。
2.2在工程目录下添加相应文件并添加头文件路径
如图所示,在工程文件夹下建立和下载完的文件夹中相对应的文件夹,并添加相应文件——但是GUI_X文件夹下只添加GUI_X.c,不添加别的c文件。
尤其是添加头文件路径那一步很关键,不然会出错,而且因为编译器编译起来至少10分钟,重新编译会很浪费时间。
2.3修改Config文件夹里的3个头文件
**打开Config/GUIConf.h将其修改如下:**
----------------------------------------------------------------------
File : GUIConf.h
Purpose : Configures abilities, fonts etc.
----------------------------------------------------------------------
*/
#ifndef GUICONF_H
#define GUICONF_H
#define GUI_OS (0)
#define GUI_SUPPORT_TOUCH (0) //1改成0,不支持触摸屏
#define GUI_SUPPORT_UNICODE (0)
#define GUI_DEFAULT_FONT &GUI_Font6x8
#define GUI_ALLOC_SIZE 20000
/******************************************************
*
* Configuration of available packages
*/
#define GUI_WINSUPPORT 0
//本来是1,由支持改成不支持,其实改不改无所谓,网上的源代码是改成不支持
#define GUI_SUPPORT_MEMDEV 0
#define GUI_SUPPORT_AA 0
#endif /* Avoid multiple inclusion */
里面的宏定义的意思
#define GUI_OS (0) //操作系统的支持
#define GUI_SUPPORT_TOUCH (1) //触摸屏
#define GUI_SUPPORT_MOUSE(1) //鼠标
#define GUI_SUPPORT_UNICODE (1)
//UNICODE支持,显示汉字
#define GUI_DEFAULT_FONT &GUI_Font6x8 //GUI默认字体
#define GUI_ALLOC_SIZE 5000 //动态内存
#define GUI_WINSUPPORT 1 //窗口控件支持
#define GUI_SUPPORT_MEMDEV 1 //内存设备支持
#define GUI_SUPPORT_AA 0
//抗锯齿形。打开刷新速率会差
**打开Config/LCDConf.h将其修改为如下:**
/***************************************************
----------------------------------------------------------------------
File : LCDConf_1375_C8_C320x240.h
Purpose : Sample configuration file
----------------------------------------------------------------------
*/
#ifndef LCDCONF_H
#define LCDCONF_H
/*********************************************************************
*
* General configuration of LCD
*
**********************************************************************
*/
#define LCD_XSIZE (480)
#define LCD_YSIZE (800)
//注意,我们使用的4.3英寸屏是480*800。
//如果是3.5英寸屏那么就是320*480。
#define LCD_BITSPERPIXEL (16)
#define LCD_CONTROLLER (-1)
#define LCD_FIXEDPALETTE (565)
#define LCD_SWAP_RB (1) //红蓝反色交换
#define LCD_SWAP_XY (0) //X、Y轴坐标互换——0是不需要
//正常竖屏显示就是0
#define LCD_INIT_CONTROLLER() LCD_hard_Init();
#endif /* LCDCONF_H */
//就多了这句,然后源代码其余部分删掉。
**在ili93xx.c文件中添加函数并在.h文件中声明**
void ili9320_SetPoint(u16 x,u16 y,u16 color)
{
POINT_COLOR=color;
LCD_DrawPoint(x,y);
}
**修改LCDDriver文件中间的LCDDummy.c**
打开LCDDriver文件夹里面的LCDDummy.c文件,添加头文件包含#include "ili93xx.h";将预处理命令修改为#if (LCD_CONTROLLER == -1) 。
在void LCD_L0_SetPixelIndex(int x, int y, int PixelIndex)函数最后添加语句ili9320_SetPoint( xPhys, yPhys ,PixelIndex);
如下图所示:
在unsigned int LCD_L0_GetPixelIndex(int x, int y)函return语句之前添加PixelIndex = LCD_ReadPoint(x,y);
为什么添加这两个函数
因为uCGUI的显示是基于点的显示,即uCGUI会调用你自己驱动的画点操作完成图案的显示。
画点函数,void LCD_L0_SetPixelIndex(int x, int y, int PixelIndex)的最后添加语句ili9320_SetPoint( xPhys, yPhys ,PixelIndex);而函数
void ili9320_SetPoint(u16 x,u16 y,u16 color)
{
POINT_COLOR=color;
LCD_DrawPoint(x,y);
}
其中的
LCD_DrawPoint(x,y);就是正点原子例程里面的画点函数。
读点函数,返回设定坐标点的颜色值。即ILI93xx.c文件里的LCD_ReadPoint()——正点原子例程里面的读点函数;所以写成:
在unsigned int LCD_L0_GetPixelIndex(int x, int y)函return语句之前添加PixelIndex = LCD_ReadPoint(x,y);
3、修改主程序
添加#include “gui.h”的预处理命令。
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "ili93xx.h"
#include "key.h"
#include "touch.h"
#include "gui.h"
int main(void)
{
Stm32_Clock_Init(336,8,2,7);//设置时钟,168Mhz
delay_init(168); //延时初始化
uart_init(84,115200); //初始化串口波特率为115200
LED_Init(); //LED端口初始化
LCD_hard_Init();
POINT_COLOR=RED;
GUI_Init(); //GUI初始化
GUI_SetBkColor(GUI_RED); //设置GUI背景颜色
GUI_Clear();
GUI_SetFont(&GUI_Font24_ASCII); //设置GUI字体
GUI_DispString("Hello World"); //显示字符
while(1)
{
delay_ms(400);
LED0 = !LED0;
}
}
4、第一次运行出现的错误以及解决
gui.h文件中有一个
它老是提示我,
LCD_COLORINDEX_UNION LCD;后面需要加一个“)”,应该是这样的LCD这个名称跟某些其他的的定义弄混了(百度到一个结论,但是没有提供解决办法),最后的解决办法是:
点开原来的出错的地方,右键查看定义,发现有一个头文件 LCD_Private.h中,存在这些宏定义:
我们把 LCD_Private.h头文件中相应的LCD改成LCD_gui就可以了,然后把gui.h文件中的LCD_COLORINDEX_UNION LCD;也改成LCD_COLORINDEX_UNION LCD_gui;重新编译之后运行:
还有一个错误:
无法打开#include “Ili9340.h”,这时候我们直接把LCDDriver.c移除,然后编译之后成功,下载到单片机之后,运行成功。