
做了两个星期终于把gui搞通了,现将移植方法总结如下,仅供学习交流之用。
2014/8/23
一、uCGUI移植步骤
1、uCGUI及TFT驱动文件准备
(1)将TFT驱动文件ili9320.h、ili9320.c 及其字体文件ili9320_font.h 复
制至keil 工程模板的文件夹中;
(2) 准备好uCGUI源文件(本例使用的版本3.90a),将START 文件夹
下的GUI 文件夹全部复制到keil 工程模板的文件夹中;再将START 文件夹下的Config 文件夹复制至GUI 文件夹下;最后将Sample 文件夹下GUI_X 中的GUI_X.c 复制到Config 文件夹中。最终文件结构如图1-1所示:
图1-1
2、添加文件至工程,文件目录结构组如图2-2示:
图2-1在添加文件时应注意uCGUI下除了gui_config 下需要添加所有的.h 头文件外其余所有均不需要添加头文件;
图2-2
3、GUI配置
(1)G UIConf.h配置:
#define GUI_OS (0) /*编译多任务支持
#define GUI_SUPPORT_TOUCH (0) /* 触屏支持*/
#define GUI_SUPPORT_UNICODE (1) /*支持ASCII/UNICODE码*/ #define GUI_DEFAULT_FONT &GUI_Font6x8 /*初始化字体大小*/
#define GUI_ALLOC_SIZE 5*1024 /*开辟动态空间大小*/
图3-1
注意:动态空间受芯片容量大小制约,不可开辟过大,否则报错
图3-2(2) LCD 相关文件配置:
LCDConfig.h 的配置
#define LCD_XSIZE (320)
#define LCD_YSIZE (240) /*x,y方向像素设置*/
#define LCD_BITSPERPIXEL (16) /*像素位数*/
#define LCD_CONTROLLER 9320 /*LCD驱动器型号*/
图3-3
继续修改第110行
#define LCD_INIT_CONTROLLER() ili9320_Initializtion()
并将其后的语句注释掉。ili9320_Initializtion()为具体的LCD驱动
器初始化程序,应与ili9320.c中的初始化函数名一致。
图3-4
4、修改LCD驱动LCDDummy.C
(1)修改第42行
#if (LCD_CONTROLLER == 9320)
注意:此处LCD_CONTROLLER 的值应与LCD_Config.h 中#define LCD_CONTROLLER 9320 一致,如果都用-1 也可以。
图4-1(2) 修改第383行void LCD_L0_SetPixelIndex(int x, int y, int PixelIndex)
函数为:
void LCD_L0_SetPixelIndex(int x, int y, int PixelIndex)
{
/* Write into hardware ... Adapt to your system */
ili9320_SetPoint(x,y,PixelIndex);
}
图4-2
(3) 修改第407行unsigned int LCD_L0_GetPixelIndex(int x, int y)函数为:
unsigned int LCD_L0_GetPixelIndex(int x, int y)
{
return ili9320_GetPoint(x,y);//PixelIndex;
}
图4-3
(4)添加包含文件#include "ili9320.h"
5、编写测试代码
int main()
{
GPIO_Config();
USART_InitConfig(); //使用printf()函数时必须先初始化串口,否则程序会死在printf()上,无法运行
GUI_Init();
GUI_SetFont(&GUI_Font8x16);
GUI_SetBkColor(GUI_BLUE);
GUI_DispString("GUI Version Is ");
GUI_DispString(GUI_GetVersionString()); //查询GUI版本号 GUI_GetVersionString()
GUI_GotoXY(110,100);
GUI_DispString("Hello World ! ");
while(1)
{
}
}
运行如图所示:
图4-4
二、GUI界面设计
1、显示自造的汉字
使用GUIFontTool 制作所需字库,添加到工程,复制生成的字库程序中的#ifndef GUI_FLASH
#define GUI_FLASH
#endif
到主函数,
然后声明外部变量extern GUI_FLASH const GUI_FONT GUI_FontHZ_SimSun100_16;
当使用该字库时需调用GUI_SetFont(&GUI_FontHZ_SimSun100_16);
2、显示图片
使用uC-GUI-BitmapConvert.exe 打开bmp 图片->Imagin->Convert to->选择RGB 或其他->保存,即可生成 .c 文件。将生成的文件添加到工程,将 .c 文件后半部分的结构体定义名如:GUI_CONST_STORAGE GUI_BITMAP bmnotebook ,作为外部变量在主函数中声明:extern GUI_CONST_STORAGE GUI_BITMAP bmnotebook;,绘图时调用函数GUI_DrawBitmap(&bmnotebook,10,10);即可。
三、触摸屏程序设计思路 1、 触屏校准算法
触屏坐标的操作需分清物理坐标(),px py 与像素坐标(),tx ty 之间的换算关系GUI 函数的操作均是对像素坐标而言的。校准思路:读取屏幕四个角上的物理坐标可获得px,py 的最大最小值max px 、min px 、max py 和min py ;计算公式:
max min 0(4095.0320)/()tx px px x =⨯-+ max min 0(4095.0240)/()ty py py y =⨯-+
其中 0x 、0y 为像素坐标在x ,y 方向的偏移量。
获取0x 、0y 的方法1(笨拙的办法):先令0x 、0y 为0编程下载调试,按屏幕的四角,输出像素坐标即可获取偏移量0x 、0y 。
2、 获取0x 、0y 的方法2(矫正算法):
3、 消除读取坐标时干扰的方法:
连续读取两次(物理)坐标,当两次数值相差在较小范围(如50)时视为有效。
注意:max px 、min px 、max py 和min py 等的数据类型(均为16位数据),在进行除法时要强制转换为浮点型,而在GUI 函数中则需要强制转化为整型。
经验总结
1、 若颜色显示与设置不同,是由 未启动红蓝交换 造成的,解决方法:建立查询表,启动
红蓝交换即在 LCD_Config.h 中添加以下两行:
#define LCD_FIXEDPALETTE 565 //定义颜色查询表
#define LCD_SW AP_RB 1 //激活LCD红(Red)蓝(Blue)交换(SW AP)
