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

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、打开工程文件,添加工程文件夹如下图:

2013_08_26_1.jpg 

其中,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中将其声明。


1void ili9320_SetPoint(u16 x,u16 y,u16 color)
2{
3POINT_COLOR=color;
4LCD_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”的预处理命令):

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


2013_08_26_2.jpg 

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


1void LCD_L0_FillRect(int x0, int y0, int x1, int y1)
2{
3LCD_Fill(x0,y0,x1,y1,LCD_COLORINDEX);
4}


重新烧写程序,发现刷屏速度大幅度提升!

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


  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值