首先自己建立一个MDK工程,在此放上我自己工程,方便大家直接在此进行修改。
工程框架.png (38.83 KB, 下载次数: 5)
下载附件
MDK工程框架
2015-8-4 11:00 上传
ucguiDemoCode.zip
(936.35 KB, 下载次数: 129)
2015-8-4 11:33 上传
点击文件名下载附件
MDK工程模版
ucguiDemoCode.zip
(2.12 MB, 下载次数: 188)
2015-8-4 15:13 上传
点击文件名下载附件
移植成功
bsp为底层驱动层,内部所有的函数均以bsp(
Board Support Package)前缀开头,工程中添加了uC/OS但是实际并没有使用,为uCGUI建立了一些空的文件,方便直接添加.c.h文件。
准备uCGUI源码,我是用的是uCGUI3.90a版本。
ucgui3.90a.zip
(9.49 MB, 下载次数: 209)
2015-8-4 11:10 上传
点击文件名下载附件
uCGUI源码
移植开始。。。。。。。。。。。。。。。。。。。
1.将BSP文件夹下面的LCD文件夹修改名字为ILI9341,将lcd.c修改为ili9341.c,lcd.h修改为ili9341.h,因为在 uCGUI/GUI/Core 下已经存在lcd.c和lcd.h了。文件名字可以随便起,因为我的液晶控制器为ILI9341。。。
2.修改工程,移除bsp下lcd.c重新添加ili9341.c,修改后编译会有几个错误,都是因为头文件包含的原因 将#include"lcd.h"改成#include "ili9341.h“或者将#include "lcd/lcd.h" 改为#include " ili9341/ili9341.h"即可编译通过
最好将ili9341.h中的预处理指令的名字也改成 ILI9341.
3.将 ili9341.h文件中宏定义(#define LCD ((LCD_TypeDef *) LCD_BASE) )中的LCD修改为ILI9340,因为LCD这个名字uCGUI也有用到,否则会冲突,你会发现莫名的100多个错误,呜呜,不多说了,我闲哭会。
4.接下来将源码文件夹下 /Sample/GUI_X 和 /Start/Config,/Start/GUI复制到工程文件夹UCGUI下。按照名字将GUI_X,GUI/(除了JPEG),Config下的.c.h添加到工程中
工程 uCGUI/Config下添加3个.h配置文件
uCGUI/GUI_X下只添加GUI_X.c
uCGUI/GUI/LCDDriver下只添加LCDDummy.c
其余的则将对应文件夹下的.c文件全部添加到工程中
添加完毕后,点击魔术棒 包含路径。
5.编译,发现会有19个错误,莫慌
6.打开 uCGUI/Config下GUIConf.h进行配置,主要是一些功能开关,暂时全部关闭,等需要时在打开即可
#define GUI_OS (0)
#define GUI_SUPPORT_TOUCH (0)
#define GUI_SUPPORT_UNICODE (0)
#define GUI_DEFAULT_FONT &GUI_Font6x8
//#define GUI_ALLOC_SIZE 12500
#define GUI_ALLOC_SIZE 40*1024
#define GUI_WINSUPPORT 0
#define GUI_SUPPORT_MEMDEV 0
#define GUI_SUPPORT_AA 0
7.打开 uCGUI/Config下LCDCon.f根据自己的液晶尺寸以及控制器等具体信息进行配置(对源文件的无用函数和#define命令都删了,修改后如下,最下面的两行需要自己手动添加)
首先在该文加下包含 #inclide“ili9341.h”因为要使用到液晶初始化函数。
#define LCD_XSIZE (240)
#define LCD_YSIZE (320)
//#define LCD_BITSPERPIXEL (8)
#define LCD_BITSPERPIXEL (16)
#define LCD_CONTROLLER (-1) /*液晶控制器型号,-1=LCDDummy.c -2=LCDNull.c 也可以设置成你自己的控制器型号如果你确定uCGUI支持的话例如设置为 9320是可以的。*/
#define LCD_SWAP_RB (1) /*RED BLUE反 {MOD}交换*/
#define LCD_INIT_CONTROLLER() bsp_lcd_init(); /*液晶初始化*/
8.打开 uCGUI/GUI/LCDDriver下的LCDDummy.c文件进行修改
#if (LCD_CONTROLLER == -1)
&& (!defined(WIN32) | defined(LCD_SIMCONTROLLER))
修改为 #if (LCD_CONTROLLER == -1) 即把第2行和那和反斜杠删了就好,这样就可以进行编译了
9.点击编译。。。。。bang bang bang bang----》编译通过 无错误无警告,But 并没有什么卵用 还需要添加几个函数
10.打开 uCGUI/GUI/LCDDriver下LCDDummy.c找到函数 LCD_L0_FillRect(),LCD_L0_GetPixelIndex(),LCD_L0_SetPixelIndex()修改后函数如下:(包含头文件#include "ili9341/ili9341.h")
void LCD_L0_SetPixelIndex(int x, int y, int PixelIndex)
{
/* Convert logical into physical coordinates (Dep. on LCDConf.h) */
#if LCD_SWAP_XY | LCD_MIRROR_X| LCD_MIRROR_Y
int xPhys = LOG2PHYS_X(x, y);
int yPhys = LOG2PHYS_Y(x, y);
#else
#define xPhys x
#define yPhys y
#endif
/* Write into hardware ... Adapt to your system */
{
bsp_lcd_fastDrawPoint( x,y,PixelIndex );
}
}
unsigned int LCD_L0_GetPixelIndex(int x, int y) {
LCD_PIXELINDEX PixelIndex;
/* Convert logical into physical coordinates (Dep. on LCDConf.h) */
#if LCD_SWAP_XY | LCD_MIRROR_X| LCD_MIRROR_Y
int xPhys = LOG2PHYS_X(x, y);
int yPhys = LOG2PHYS_Y(x, y);
#else
#define xPhys x
#define yPhys y
#endif
/* Read from hardware ... Adapt to your system */
{
PixelIndex = bsp_lcd_readPoint( x,y );/* ... */
}
return PixelIndex;
}
void LCD_L0_FillRect(int x0, int y0, int x1, int y1)
{
bsp_lcd_fill( x0,y0,x1,y1,LCD_COLORINDEX );
}
11.这回是真的完事了,好像也不是那么麻烦哈,编译通过 ,main.h中包含 #include "gui.h" 编写程序测试移植结果
12.main.c中有个简单的测试程序,需要的话下载后测试即可,此处补贴出程序了(测试程序是从别的帖子复制的,我叫小偷,谢谢)
此帖仅是我本人移植时个人见解,可能有不足之处请谅解,透光石借鉴了很多网上及本论坛网友的帖子,感谢有助于我完成本帖的那些大牛们。
带触摸屏的学习Ing,等功成在来水帖。
继续上面的工程,添加触摸屏。
首先说明,上面的移植工程并不够完善,如果程序中调用了 GUI_Delay()函数则会发现,程序将卡死在这个函数中,因为GUI_Delay()延时函数,是利用变量OS_TimeMS来进行延时的,而此变量我们并没有做任何操作,其值初始化为0后,没有跟随系统时间递增。
解决法案:(我使用的是定时器3中断)
使用系统滴答定时器或普通定时器均可,设置中断时间为1ms,例:
在工程中添加两个库文件,用于定时器(stm32f10x_tim.c和misc.c),同时在头文件stm32f10x_conf.h 中将该两个文件的头文件的注释去掉
extern volatile int OS_TimeMS;
void TIM3_IRQHandler(void)
{
if(TIM3->SR&0X0001)
{
OS_TimeMS+=1;
}
TIM3->SR&=~(1<<0);
}
此时工程已经完善,开始添加触摸屏。
1.将战舰的触摸屏实验 HARDWARE 文件夹下TOUCH和24CXX文件夹赋值到该工程的BSP文件夹下(24CXX文件夹不是必须的,但是如果没有移植过来,就需要修改触摸屏初始化函数)为了方便,我将24CXX也赋值过来了
2.将24cxx.c touch.c myiic.c 添加到工程,编译,出现的错误或警告都是头文件包含问题和函数未定义(因为修改了之前ili9341.c中定义的函数名字)问题,一一找到修改,直到编译成功即可。需要注意一下的是touch.c中的头文件包含指令
#include"lcd.h",因为工程中已经存在该头文件,所以并没有出现错误或警告提示,但是此时应修改为#include "ili9341/ili9341.h"
3.将 GUIConf.h中的#define GUI_SUPPORT_TOUCH (0) 修改为#define GUI_SUPPORT_TOUCH (1) 支持触摸屏,编译出现4个未定义函数
4.在工程中添加 GUI_X_Touch.c 文件 编译通过,该文件中共四个函数第一个 第二个不用管,第三个第四个需要修改,先添加头文件#include "touch/touch.h"。
5.修改函数 int GUI_TOUCH_X_MeasureX(void) 如下:(注意:网上有资料说该函数返回的是坐标值,经测试是不正确的,该函返回的是AD的值,并不是坐标值)
extern u8 CMD_RDX;
int GUI_TOUCH_X_MeasureX(void)
{
u16 x=TP_Read_AD( CMD_RDX );
return x;
}
6.修改函数 int GUI_TOUCH_X_MeasureY(void) 如下:(返回AD值)
extern u8 CMD_RDY;
int GUI_TOUCH_X_MeasureY(void)
{
/*u16 x,y;
x=y=0;
TP_Read_XY2( &x,&y );
return y;*/
u16 y=TP_Read_AD( CMD_RDY );
return y;
}
7.开一个10ms中断的定时器,不断查询触摸屏的状态,我使用的是定时器4.
/*
**10ms中断
*/
void TIM4_IRQHandler(void)
{
if(TIM4->SR&0X0001)
{
GUI_TOUCH_Exec();
}
TIM4->SR&=~(1<<0);
}
8.配置 GUITouchConf.h文件,总共有7个宏定义(自添加2个)
/*此四个需要实际测量*/
#define GUI_TOUCH_AD_LEFT 305
#define GUI_TOUCH_AD_RIGHT 3826
#define GUI_TOUCH_AD_TOP 293
#define GUI_TOUCH_AD_BOTTOM 3726
/*此三个不断组合实验即可*/
#define GUI_TOUCH_SWAP_XY 0
#define GUI_TOUCH_MIRROR_X 0
#define GUI_TOUCH_MIRROR_Y 0
此处是我使用的参数(战舰V2.1 竖屏),跟我开发板一样的小伙伴可以直接使用此参数试试。
9.如果发现上述参数配置不正确,即指针停留液晶左上角不动,莫慌!!!在 UCGUI3.90a/Sample/GUI文件夹下有一TOUCH_Sample.c文件,专门用于此参数的测量(前四个参数),将该文件内容复制到main函数中稍作修改即可。程序运行后点击触摸屏左上角(GUI_TOUCH_AD_LEFT=X,GUI_TOUCH_AD_TOP=Y),点击触摸屏右下角(GUI_TOUCH_AD_RIGHT=X,GUI_TOUCH_AD_BOTTOM=Y)(第一次测量时可能由于此四个数据与真是数据相差巨大,指针并不会跟随触屏移动,不用管,只要将数据测量写入即可,再次测量就会发现指针会跟随触屏移动了)
此外
我已经将参数测量程序和触摸屏移植成功后测试程序均写入main.c文件中,通过预处理指令进行选择运行那个程序。
10.移植完毕,谢谢支持。
/*建议:GUI_Delay的延时使用系统滴答定时器,GUI_Exec();是界面刷新函数,界面复杂时非常耗时,最好不要放在中断里面。*/
此工程为完整的工程,main.c中通过条件编译可以选择main函数累启动不同的触摸屏测试程序。
一周热门 更多>