首先自己建立一个MDK工程,在此放上我自己工程,方便大家直接在此进行修改。
bsp为底层驱动层,内部所有的函数均以bsp(
Board Support Package
)前缀开头,工程中添加了uC/OS但是实际并没有使用,为uCGUI建立了一些空的文件,方便直接添加.c.h文件。
准备uCGUI源码,我是用的是uCGUI3.90a版本。
移植开始。。。。。。。。。。。。。。。。。。。
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反色交换*/
#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,等功成在来水帖。转载
|