STM32F4应用笔记(三)UCGUI裸机移植——不支持触摸屏

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在工程目录下添加相应文件并添加头文件路径
STM32F4应用笔记(三)UCGUI裸机移植——不支持触摸屏_第1张图片
如图所示,在工程文件夹下建立和下载完的文件夹中相对应的文件夹,并添加相应文件——但是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);

如下图所示:
STM32F4应用笔记(三)UCGUI裸机移植——不支持触摸屏_第2张图片

在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文件中有一个
STM32F4应用笔记(三)UCGUI裸机移植——不支持触摸屏_第3张图片
它老是提示我,
LCD_COLORINDEX_UNION LCD;后面需要加一个“)”,应该是这样的LCD这个名称跟某些其他的的定义弄混了(百度到一个结论,但是没有提供解决办法),最后的解决办法是:
点开原来的出错的地方,右键查看定义,发现有一个头文件 LCD_Private.h中,存在这些宏定义:

STM32F4应用笔记(三)UCGUI裸机移植——不支持触摸屏_第4张图片
我们把 LCD_Private.h头文件中相应的LCD改成LCD_gui就可以了,然后把gui.h文件中的LCD_COLORINDEX_UNION LCD;也改成LCD_COLORINDEX_UNION LCD_gui;重新编译之后运行:
还有一个错误:
无法打开#include “Ili9340.h”,这时候我们直接把LCDDriver.c移除,然后编译之后成功,下载到单片机之后,运行成功。

你可能感兴趣的:(stm32,UCGUI)