您的位置:首页 > 产品设计 > UI/UE

uCGUI在STM32开发板上的移植及优化

2014-07-26 21:30 369 查看

uCGUI在STM32开发板上的移植及优化

晓梦逸尘 发布于:2013-8-25 22:42 分类:STM32

1、打开调试好的TFTLCD测试程序(这里是打开“ALIENTEK MINISTM32 实验10 TFTLCD显示实验”)的工程文件夹,在其中创建ucGUI的文件夹。由于ucGUI/CORE文件中已经存在了lcd.h和lcd.c的文件,所以我们将工程目录HARDWARE/LCD中的lcd.c文件和lcd.h文件的文件名换成ili93xx.c和ili93xx.h,并将其中的预处理命令也相应的更换。然后将ili93xx.h和ili93xx.c中用来标识液晶屏宽和高的LCD_H与LCD_W分别换成LCD_HEIGHT和LCD_WIDTH。

2、打开ucGUI源码文件,将其Start/GUI目录下的除JPEG文件夹以外的文件夹复制到第一步中创建的ucGUI文件夹中。

3、将Start/Config和Sample/GUI_X也复制到之前的文件夹 ucGUI中。

4、打开工程文件,添加工程文件夹如下图:



 

其中,USER、HARDWARE、SYSTEM、CORE、FWLib是工程中原有的文件,除此之外为需要新建的文件。 由于ucGUI目录下的CORE文件名与原有的文件名相冲突,故将其修改为ucCORE。并将ucGUI目录下的除GUI_X、Config以外的所有文件添加到相应的文件夹下。然后再添加Config目录下对应的三个.h文件和GUI_X目录下的GUI_X.c文件。

5、打开Config/GUIConf.h将其修改如下:

01
#ifndef GUICONF_H
02
#define GUICONF_H
03
 
 
04
#define GUI_OS (0)
05
#define GUI_SUPPORT_TOUCH (0)
06
#define GUI_SUPPORT_UNICODE (0)
07
 
 
08
#define GUI_DEFAULT_FONT &GUI_Font6x8
09
//#define GUI_ALLOC_SIZE 12500
10
#define GUI_ALLOC_SIZE 5000
11
 
 
12
 
 
13
#define GUI_WINSUPPORT 0
14
#define GUI_SUPPORT_MEMDEV 0
15
#define GUI_SUPPORT_AA 0
16
 
 
17
#endif
6、打开Config/LCDConf.h将其修改为如下:

 

01
#ifndef LCDCONF_H
02
#define LCDCONF_H
03
 
 
04
 
 
05
#define LCD_XSIZE (240)
06
#define LCD_YSIZE (320)
07
#define LCD_CONTROLLER (-1)
08
#define LCD_BITSPERPIXEL (16)
09
#define LCD_FIXEDPALETTE (565)
10
#define LCD_SWAP_RB (1) //红蓝反色交换
11
//#define LCD_SWAP_XY (1)
12
//LCD_MIRROR_X
13
#define LCD_INIT_CONTROLLER() LCD_hard_Init();
14
#endif
 

7、打开ili93xx.c和ili93xx.h文件,将其中的void LCD_Init(void)函数更名为void LCD_hard_Init(void)以防与ucGUI中的原有函数名冲突。然后再在ili93xx.c中添加如下函数,并在ili93xx.h中将其声明。

1
void
 
ili9320_SetPoint(u16 x,u16 y,u16 color)
2
{
3
POINT_COLOR=color;
4
LCD_DrawPoint(x,y);
5
}
8、打开LCDDummy.c文件,添加头文件包含#include "ili93xx.h";将预处理命令修改为#if (LCD_CONTROLLER == -1) 。

9、在void LCD_L0_SetPixelIndex(int x, int y, int PixelIndex)函数最后添加语句ili9320_SetPoint( xPhys, yPhys ,PixelIndex);

10、在unsigned int LCD_L0_GetPixelIndex(int x, int y)函return语句之前添加PixelIndex = LCD_ReadPoint(x,y);

11、移植ColorBar程序,将main.c文件修改为如下形式(别忘了在main.c文件中添加#include“gui.h”的预处理命令):

01
void
 
DemoShowColorBar(
void
);
02
 
 
03
int
 
main(
void
)
04
{
05
SystemInit();
06
delay_init(72); 
//延时初始化
07
NVIC_Configuration();
08
uart_init(9600);
09
LED_Init();
10
KEY_Init();
11
// LCD_Init();
12
GUI_Init();
13
GUI_SetBkColor(GUI_BLACK);
14
 
 
15
GUI_SetColor(GUI_WHITE);
16
GUI_Clear();
17
GUI_SetFont(&GUI_Font24_ASCII);
18
GUI_DispStringHCenterAt(
"COLOR_ShowColorBar - Sample"
, 160, 5);
19
DemoShowColorBar();
20
 
 
21
while
(1)
22
{
23
delay_ms(400);
24
LED0 = !LED0;
25
}
26
 
 
27
}
28
 
 
29
void
 
DemoShowColorBar(
void
)
30
{
31
int
 
x0 = 60, y0 = 40, yStep = 15, i;
32
int
 
xsize = LCD_GetDevCap(LCD_DEVCAP_XSIZE) - x0;
33
GUI_SetFont(&GUI_Font8x16);
34
#if (LCD_FIXEDPALETTE)
35
y0 = 66;
36
yStep = 13;
37
GUI_DispStringAt(
"Fixed palette: "
, 0, 40);
38
GUI_DispDecMin(LCD_FIXEDPALETTE);
39
#endif
40
GUI_DispStringAt(
"Red"
, 0, y0 + yStep);
41
GUI_DispStringAt(
"Green"
, 0, y0 + 3 * yStep);
42
GUI_DispStringAt(
"Blue"
, 0, y0 + 5 * yStep);
43
GUI_DispStringAt(
"Grey"
, 0, y0 + 6 * yStep);
44
GUI_DispStringAt(
"Yellow"
, 0, y0 + 8 * yStep);
45
GUI_DispStringAt(
"Cyan"
, 0, y0 + 10 * yStep);
46
GUI_DispStringAt(
"Magenta"
, 0, y0 + 12 * yStep);
47
for
 
(i = 0; i < xsize; i++) {
48
U16 cs = (255 * (U32)i) / xsize;
49
U16 x = x0 + i;;
50
GUI_SetColor(cs);
51
GUI_DrawVLine(x, y0 , y0 + yStep - 1);
52
GUI_SetColor(0xff + (255 - cs) * 0x10100L);
53
GUI_DrawVLine(x, y0 + yStep, y0 + 2 * yStep - 1);
54
GUI_SetColor(cs<<8);
55
GUI_DrawVLine(x, y0 + 2 * yStep, y0 + 3 * yStep - 1);
56
GUI_SetColor(0xff00 + (255 - cs) * 0x10001L);
57
GUI_DrawVLine(x, y0 + 3 * yStep, y0 + 4 * yStep - 1);
58
GUI_SetColor(cs * 0x10000L);
59
GUI_DrawVLine(x, y0 + 4 * yStep, y0 + 5 * yStep - 1);
60
GUI_SetColor(0xff0000 + (255 - cs) * 0x101L);
61
GUI_DrawVLine(x, y0 + 5 * yStep, y0 + 6 * yStep - 1);
62
GUI_SetColor((U32)cs * 0x10101L);
63
GUI_DrawVLine(x, y0 + 6 * yStep, y0 + 7 * yStep - 1);
64
GUI_SetColor(cs * 0x101);
65
GUI_DrawVLine(x, y0 + 7 * yStep, y0 + 8 * yStep - 1);
66
GUI_SetColor(0xffff + (255 - cs) * 0x10000L);
67
GUI_DrawVLine(x, y0 + 8 * yStep, y0 + 9 * yStep - 1);
68
GUI_SetColor(cs * 0x10100L);
69
GUI_DrawVLine(x, y0 + 9 * yStep, y0 + 10 * yStep - 1);
70
GUI_SetColor(0xffff00 + (255 - cs) * 0x1L);
71
GUI_DrawVLine(x, y0 + 10 * yStep, y0 + 11 * yStep - 1);
72
GUI_SetColor(cs * 0x10001);
73
GUI_DrawVLine(x, y0 + 11 * yStep, y0 + 12 * yStep - 1);
74
GUI_SetColor(0xff00ff + (255 - cs) * 0x100L);
75
GUI_DrawVLine(x, y0 + 12 * yStep, y0 + 13 * yStep - 1);
76
}
77
}
12、下载到开发板运行如下图所示:



 

13、以上就完成了ucGUI裸机移植的所有步骤,但是发现刷屏较慢。然后我们跟踪GUI_Clear()刷屏函数的执行情况,发现是void LCD_L0_FillRect(int x0, int y0, int x1, int y1)函数执行效率不高。于是将其修改如下:

1
void
 
LCD_L0_FillRect(
int
 
x0, 
int
 
y0, 
int
 
x1, 
int
 
y1)
2
{
3
LCD_Fill(x0,y0,x1,y1,LCD_COLORINDEX);
4
}
重新烧写程序,发现刷屏速度大幅度提升!

14、ucGUI预定义了一些颜色,这些预定义是放在gui.h文件中。然而,我们发现这些颜色是以24bits的方式定义的。通过查询手册发现我们所使用的颜色被ucGUI定义成了“逻辑颜色” ,它通过最小平方偏移搜索的方式将其映射为“物理颜色”。所以在用户使用颜色时有很强的灵活性。

源码详见http://pan.baidu.com/share/link?shareid=590010509&uk=1208661112
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: