声明:本教程是作者学习uCGUI过程中的笔记,最后整理出来,献给初学者,旨在带领初学者入门uCGUI,仅供学习之用,不得用于商业。如需转载,请注明出处。
说明
平台: stm32f103zet6
TFTLCD型号: 2.8寸9341控制器
ucgui源码: 3.90a版本
触屏: 不带触屏(后续更新)
操作系统: 不支持
移植教程
一、准备工作:
(一) 源码:准备3.90版本的UCGUI源码
注:如果需要跑GUIDEMO,那么还需准备GUIDEMO源码。
(二) LCD底层驱动:准备LCD屏的底层驱动,接口函数如下:
1、 设置坐标点;
static void lcd_set_cursor(u16 xpos, u16 ypos);
2、 在指定点画指定颜色的点;
void lcd_set_point(u16 xpos, u16 ypos, u16 color);
3、 读取某个点的颜色值;
u16 lcd_get_point(u16 x, u16 y);
4、 在指定区域填充颜色(开窗口的方式,速度更快);
void lcd_window_fill(u16 sx, u16 sy, u16 ex, u16 ey, u16 color);
5、 LCD屏初始化(主要是出厂初始化代码);
void ili9341_initialize(void);
注:这里列出了和UCGUI的接口函数,这些函数的具体实现需要根据自己的LCD屏具体实现这些函数。
二、 移植过程
(一) 把UCGUI源码copy到自己的工程中,UCGUI文件夹下面,方便管理;
(二) 添加UCGUI源码到工程中,放在对应的组下面,方便管理,如图:
(三) 添加头文件路径,如图:
(四) 打开GUI_Config文件夹,编辑GUIConf.h文件,内容如下:
#define GUI_OS (0)
#define GUI_SUPPORT_TOUCH (0)
#define GUI_SUPPORT_UNICODE (1)
#define GUI_DEFAULT_FONT &GUI_Font6x8
#define GUI_ALLOC_SIZE 40*1024
#define GUI_WINSUPPORT0
#define GUI_SUPPORT_MEMDEV 1
#define GUI_SUPPORT_AA 1
(五) 打开GUI_Config文件夹,编辑LCDConf.h文件,内容如下:
#define LCD_XSIZE (320)
#define LCD_YSIZE (240)
#define LCD_BITSPERPIXEL (16)
#define LCD_CONTROLLER (-1)
#define LCD_FIXEDPALETTE (565)
#define LCD_SWAP_RB (1)
#define LCD_INIT_CONTROLLER() ili9341_initialize();
(六) 打开GUI_LCDDriver文件夹,编辑LCDDummy.c文件,内容如下:
1、 先添加LCD驱动文件的头文件,以便下面函数调用;如:#include "tftlcd.h"
2、 确保 #if (LCD_CONTROLLER == -1)
&& (!defined(WIN32) | defined(LCD_SIMCONTROLLER))
中的 LCD_CONTROLLER == -1 ,和LCDConf.h中的宏定义对应
3、 在 void LCD_L0_SetPixelIndex(int x, int y, int PixelIndex) 函数最后一行添加如下语句:
lcd_set_point(xPhys, yPhys, PixelIndex);
4、 在 unsigned int LCD_L0_GetPixelIndex(int x, int y) 函数 return语句之前添加如下语句:
PixelIndex = lcd_get_point(x, y);
5、 现在回到main函数
1) 添加头文
#include "GUI.h"
#include "GUIDEMO.h"
2) 在main函数中先调用必要的初始化函数后,再调用GUI_Init(); 函数,这个函数会调用LCD屏的初始化函数
3) 为了测试UCGUI是否初始化成功,我们先调用几个函数试试,在GUI_Init();下面接着调用如下函数:
GUI_SetBkColor(GUI_BLACK);
GUI_SetColor(GUI_RED);
GUI_Clear();
GUI_SetFont(&GUI_Font24_1);
GUI_DispStringAt("- - uCGUI disp Function sample - -",4,10);
// 延时3s,方便观看结果
delay_ms(1000);
delay_ms(1000);
delay_ms(1000);
看看是否把LCD刷成黑色,是否显示红色字符串
4) 然后再while循环中调用 GUIDEMO_main(); 函数,开始运行GUIDEMO
(七) 定时器中断配置,给UCGUI系统一个时钟(个人观点,仅供参考),否则GUIDEMO程序无法运行
1、 在这里用定时器2,所以需要配置定时器和NVIC中断,配置函数大家就自己做了,只是这里的定时器配置成2KHz的频率,如果想要界面变化快点,那么提高频率即可;然后我们进入定时器2的中断函数,首先在stm32f10x_it.c文件中加入外部变量声明 extern volatile int OS_TimeMS; 然后加入定时器2中断函数,如下:
void TIM2_IRQHandler(void)
{
if ( TIM_GetITStatus(TIM2 , TIM_IT_Update) != RESET )
{
TIM_ClearITPendingBit(TIM2 , TIM_FLAG_Update);
OS_TimeMS++;
if(OS_TimeMS ==0)
{
//GUI_TOUCH_Exec(); // 不带触摸不需要这条语句
}
}
}
后记
如有bug,恳请指出,欢迎各位网友一起讨论,一起进步,祝大家学业有成。
后续更新,请关注作者博客。
注意的问题:
1、 uCGUI中已经有LCD这个宏定义了,所以用户的代码中绝对不能有LCD这个宏定义,很多人在写LCD驱动函数的时候,用到了LCD这个宏定义,建议用别的名字如TFTLCD;
2、 用到的库函数一定要进入到工程中,并且要添加对应的头文件路径。