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

GUI移植

2014-12-07 17:30 99 查看
下表显示了GUI 所有子目录的内容:

 

目 录
内容
Config
配置文件(根据应用配置)
GUI/AntiAlias
抗锯齿支持   *
GUI/ConvertMono
用于B/W(黑白两色)及灰度显示的色彩转换程序
GUI/ConvertColor
用于彩色显示的色彩转换的程序
GUI/Core
μC/GUI 内核
GUI/Font
字体文件
GUI/LCDDriver
LCD驱动(移植部分:根据需要修改或添加)
GUI/JPEG
JPEG图像支持  *
GUI/Mendev
存储器件支持  *
GUI/Touch
触摸屏支持    *
GUI/Widget
视窗控件库    *
GUI/WM
视窗管理器    *
(带“*”标志的为可选项,不同版本带的有所不同)

说明:移植是要特别注意配置文件Config和GUI/LCDDriver。

①.GUI/LCDDriver文件夹中存放的是一些LCD驱动代码,如果你使用的LCD在这里可以找到代码,可以直接通过Config中的LCDConfig.h里边的:

 #define LCD_CONTROLLER
-1 // -1:表示没有选择的LCD驱动,而是使用里边的样本程序进行修改。

uCGUI中具体支持哪些LCD?可以查询《uCGUI用户手册》的第22章 LCD驱动程序。里边详细的说明了,支持些什么控制器的LCD。

②.在工程中只需加载需要的LCD驱动代码文件即可。如果设置为-1,则选择加载LCDDummy.C或LCDTemplate.C文件(不同的版本,此代码的文件名可能会不同)。 

  移植步骤:

第一步:首先,得把你的TFT底层驱动写好,既在裸机下,可以正常显示。


①.LCD_Init    (): LC
1f2ab
D初始化函数。

②.LCD_SetPixel(): LCD画点函数。
   ③.LCD_GetPixel(): LCD读点颜色函数。

2.编写好这三个函数后,可以直接在LCDDummy.C或LCDTemplate.C文件中添加相应的代码

不要忘了改型号 
    #if (LCD_CONTROLLER == 9481) \

    && (!defined(WIN32) | defined(LCD_SIMCONTROLLER))
  

①.添加画点函数:

void LCD_L0_SetPixelIndex(int x, int y, int PixelIndex) {

  /* Write into hardware ... Adapt to your system */

  {

    /* ... */ 添加画点函数

  }

}

 

    ②.添加获取像素点颜色函数:

unsigned int LCD_L0_GetPixelIndex(int x, int y) {

  /* Read from hardware ... Adapt to your system */

  {

PixelIndex = 0;

/* ... */ 添加获取像素点颜色函数

  }

  return PixelIndex;

}

③.添加初始化函数:

int  LCD_L0_Init(void) {

  LCD_INIT_CONTROLLER(); // 把这句改成LCD_Init    ();

  return 0;

}

当然也可以直接在LCDConf.c文件中,把宏改成如下:

#define LCD_INIT_CONTROLLER()  TFTInit();

 

3. 以上方法是利用样本函数,当然也可以自己编写连接代码。如果是直接编写,则需要编写如下函数:

函数
说明
初始化及显示控制组
LCD_L0_Init         ()
初始化显示屏。
LCD_L0_ReInit       ()
不擦除内容而重新初始化LCD。
LCD_L0_Off          ()
关闭 LCD。
LCD_L0_On           ()
开启 LCD。
绘制组
LCD_L0_DrawBitmap   ()
通用绘制位图函数。
LCD_L0_DrawHLine    ()
绘制一条水平线。
LCD_L0_DrawPixel    ()
以当前前景色绘制一个像素。
LCD_L0_DrawVLine    ()
绘制一条垂直线。
LCD_L0_FillRect     ()
直译一个矩形区域。
LCD_L0_SetPixelIndex()
以指定颜色绘制一个像素。
LCD_L0_XorPixel     ()
反转一个像素。
“Get”组
LCD_L0_GetPixelIndex()
返回指定像素的颜色的索引。
“Set”组
LCD_L0_SetOrg       ()
不再使用,保留给将来使用(必须在驱动器中存在)。
查询表组
LCD_L0_SetLUTEntry  ()
修改LUT 的单个条目。
Misc.组(可选)
LCD_L0_ControlCache ()
锁/解锁/清除 LCD 高速缓存。
注意:红色为必须要实现的函数,其他函数可以为空,但必须保留函数体。
  
第二步:加入UCGUI程序包。



      从GUI源码里复制代码,进行工程搭建

(1):复制 源码/Start  文件下的GUI和Config这两个文件夹到自己的工程模板;

图片指示:



(2):复制 源码/Sample/GUI_X 文件夹下的 GUI_X.c 文件,粘贴到工程模板下的Config里;

图片指示:



(3):打开KEIL工程(事先准备好的),KEIL界面左边有个Project视窗,在Target1单击右键,出现一个选项卡,在Groups里创建各文件,然后依次Add
Files,即添加.c  .h 文件,这里要着重说明:添加文件的时候,尤其是GUI源码,文件类型选择ALL
Files(系统默认.c文件),就是为了添加.h文件,这一点很重要。举个例子吧,在Config文件夹下要添加GUI_X.c

GUIConf.h  GUITouch.h LCDConf.h。

       还有一个问题,网上有人说触摸用不到,可以不用添加,然后字体也只添加几个用得到的,我的意见是:全部添加,避免难以修改的KEIL警告,这点很重要,我是新手,我很清楚怎么过来的,呵呵呵。
补充说明:新建 TFTDrive.h ILI93xx.c 两个文件,这个TFTDrive.h是 ILI93xx.c 的头文件,通过TFTDrive.h找到ILI93xx.c里的程序。 这两个文件里面的内容,是事先准备好的,也就是我所说的没加GUI源码之前的 完整的 KEIL工程的一部分。当然,这两个文件放到LCDDriver文件夹里面,添加的时候也一并添加进去就行。 



①.GUI_X.C       :无系统

②.GUI_X_embOS.C :embOS系统

③.GUI_X_uCOS.C  :uCOS系统

根据不同条件添加不同文件,如果是无系统下添加文件①,否则根据系统添加文件,或编写文件。特别说明如下函数:

a.int  GUI_X_GetTime(void);

此函数调用系统时间如果你的系统有实时时钟之类的可以将实时时钟驱动程序放在这里面。没有也没关系只是调用系统时间相关的函数不能用而已,可能这个功能很多人也不会用。

b.void GUI_X_Delay(int Period);

此函数用于GUI的延时,如果没有跑系统,就自己手动的写个延时程序,如果跑了操作系统,就调用系统的延时函数。

 

    在uCGUI中有很多地方都调用了以上函数,在其它的GUIDEMO_XXXX.C中也有这样一些循环,你要是调试是发现液晶屏上的显示一直停在一个画面上很久的话,应该就是以上函数的问题,需要根据需要修改。
 

(4):文件添加完了,还有一步呢,还要在添加路径。点击魔术棒,出现一个选项卡,点击C/C++,在Include
Paths里包含文件路径,所有文件的都要包进来哦。能玩移植的朋友们,我相信(3)(4)两步对你们来说不难。



 

 



第三步:配置LCDConf.h GUIConf.h GUITouchConf.h(我的液晶不带触摸功能,此配置在此不讲。)
 
        配置LCDConf.h文件如下
        #ifndef LCDCONF_H
                #define LCDCONF_H
                #define LCD_XSIZE                                (160)                     //配置TFT的水平分辨率
                #define LCD_YSIZE                                (128)                     //配置TFT的垂直分辨率
                #define LCD_CONTROLLER                    (54124)                //TFT控制器的名称
                #define LCD_BITSPERPIXEL                    (16)                      //每个像素的位数
                #define LCD_FIXEDPALETTE                   (565)                    //调色板格式
                #define LCD_SWAP_RB                          (0)                        //红蓝反色交换
                #define LCD_INIT_CONTROLLER()          TFT_Init() ;           //此处需要定义的是你的TFT初始化函数                                                         
                              #endif /* LCDCONF_H */
这是我修改之后的源码,大家看看是不是声明下面少了许多函数啊,没错,我删掉了,原因很简单,我的底层驱动IC程序是厂家提供的,而且GUI源码也没有我的这部分驱动程序。所以大家弄得时候也要一并删除,只留下红色代码部分。
 
   配置GUIConf.h文件如下:
        #ifndef GUICONF_H
        #define GUICONF_H
 
                #define GUI_OS                                               (1)                          //多任务
                #define GUI_SUPPORT_TOUCH                       (0)                          //触摸
                #define GUI_SUPPORT_UNICODE                  (1)                         //Unicode支持 
                #define GUI_DEFAULT_FONT                           &GUI_Font6x8       //GUI默认字体 
                #define GUI_ALLOC_SIZE                                5000                      //动态内存的大小
                #define GUI_WINSUPPORT                              1                           //窗口控件支持
                #define GUI_SUPPORT_MEMDEV                     1                           //支持内存设备
                #define GUI_SUPPORT_AA                               1                          /* Anti aliasing available */

        #endif  /* Avoid multiple inclusion */
 
第四步:最关键的一步。那就是让GUI能够找到你的LCD驱动。修改LCDDriver。
        在编写你的TFT底层驱动程序的时候,一定不能忘记编写这两个函数:设置一个像素和获取一个像素的颜色,因为后面很多UCGUI和你的TFT驱动关联起来需要这两个函数为前提。以我的TFT为例:
void LCD_SetPixel(unsigned short x, unsigned short y, unsigned short color) 
{
        ….

}

unsigned short LCD_GetPixel(unsigned short x, unsigned short y) 
{
   …

}
这两个函数写好,并测试可以正常显示后,接下来需要修改TFT与UCGUI关联的函数(在一个C文件下(我的是ili9320_ucgui.c),建议大家在移植GCGUI之前最好下载个别人移植好的例程,对着修改这样难度降低很多):
int LCD_L0_Init(void)
{  
  TFT_Init();
  return 0;
}
这个函数,是GCGUI初始化TFT需要调用的,里面的函数就是你TFT底层驱动的初始化函数。
void LCD_L0_SetPixelIndex(int x, int y, int PixelIndex)
{
  LCD_SetPixel(x,y,PixelIndex);
}
unsigned int LCD_L0_GetPixelIndex(int x, int y)
{
  return LCD_GetPixel(x,y);
}
上面两个函数是其他函数的最基本元素,其他函数比如画线、点、圆都需要调用改函数。里面的LCD_SetPixel(x,y,PixelIndex)、LCD_GetPixel(x,y);就是你TFT底层驱动设置像素和获取像素的两个函数。
紧接着把该ili9320_ucgui.c文件下其他函数修改一下(凡是遇到设置像素和获取像素的地方用以上两个函数代替。)
接着,修改另一个C文件(ili9320_api.c)这里修改很简单,仅仅也是将设置像素和获取像素的函数替换掉自己定义的即可。

最后,网上说需要修改那个GUI_X.c文件,由于我下载的是STM32模板(ILI9320的控制器),那个文件没有修改。
PS:我的开发环境MDK3.4以上版本,CPU:STM32F103RB  TFT与MCU接口:模拟总线8位 1.8英寸 160×128分辨率的TFT
UCGUI版本3.90    UCOS版本2.86  在原基础上仅仅修改了以下几个文件:ili9320.c
、ili9320_ucgui.c 、ili9320_api.c 、GUIConf.h、LCDConf.h
由于网络的原因,稍后将整个工程上传上去,以及显示效果。呵呵 欢迎拍砖!



先修改主函数,添加 #include”GUI.h”//头文件包含嘛,呵呵呵

在main()里,添加 :

      GUI_Init();

       GUI_SetBkColor(GUI_BLUE); 

       GUI_SetColor(GUI_RED);

       GUI_Clear();

       GUI_DrawCircle(100,100,50);//画圆           

      while(1); 

底层配置优化
如果ucGUI已经移植成功,并通过测试,那么请继续看这一节。如果没有,请跳过。在测试ucGUI时,我发现,在刷屏(将LCD屏幕全部填充为某一颜色)时,调用ucGUI的刷屏函数,远不如LCD的刷屏函数执行速度快。通过测试,ucGUI的刷屏速度不及LCD的20分之1。
通过查看ucGUI的底层文件,我找到了ucGUI刷屏速度慢的原因。ucGUI的画图机制是找到某一个点,然后对其进行颜色填充;然后再找下一个点对其进行颜色填充。我们通常所用的LCD驱动器,如果说所画图像,某一区域颜色单一,在设定绘图区域后,顺次进行颜色填充,无需找一个点画一个点。这就是ucGUI画图时不如LCD速度快的原因。
优化的方法很简单:
打开对应的ucGUI的LCDDriver文件夹下的LCD驱动程序C文件。找到“voidLCD_L0_DrawHLine(intx0,inty,intx1)”函数。将“else”语句下的“LCD_L0_SetPixelIndex(x0,y,LCD_COLORINDEX);”改写为LCD颜色填充函数。比如说,我将其改为了“LCD_WriteRAM(LCD_COLORINDEX)”。这样的话,不再找一个点画一个点。大大加快了ucGUI的画图执行速率。
本节小结:此种优化方法并不适用于所有的LCD驱动器。ucGUI画图时采取找一个点画一个点的方法,应该是出于程序通用性的考虑。如果ucGUI移植完成后,刷屏效果可以接受,为了程序稳定性考虑,不建议进行优化。
常见问题解决:
如果移植后,显示的画面进行了横竖翻转,或者镜像翻转。只需要在LCDConf.h文件中,加入以下语句 
 #defineLCD_SWAP_XY1#defineLCD_MIRROR_X1#defineLCD_MIRROR_Y1具体是“1”还是“0”,需要经过自己调试配置。
如果说通过以上过程已经ucGui成功移植,那么接下来进行触摸屏移植。
7触摸屏移植1)修改config文件中的宏定义#defineGUI_SUPPORT_TOUCH(1)使系统支持触摸屏。2)编写好触摸屏的AD转换驱动程序。3).在AD转换驱动程序中加入如下函数//触摸屏相关函数
voidGUI_TOUCH_X_ActivateX()//准备X轴的测量{}
voidGUI_TOUCH_X_ActivateY()//准备Y轴的测量{}
intGUI_TOUCH_X_MeasureX(void)//返回A/D转换器X轴的结果{}
intGUI_TOUCH_X_MeasureY(void)//返回A/D转换器Y轴的结果{}
以上4个函数,需要根据使用的触摸屏控制器,自己写。
其中voidGUI_TOUCH_X_ActivateX(),voidGUI_TOUCH_X_ActivateY()。有的触摸驱动器可以不写这两个函数,但是要给这两个函数留空。也就是大括号中不写内容。
还有几点需要注意:1屏幕xy轴是否翻转,需要通过在LCDConfig.h中宏定义#defineLCD_SWAP_XY(1)
运行程序,若发现x或y轴镜像显示,需要再添加宏定义#defineLCD_MIRROR_X1#defineLCD_MIRROR_Y1
以上两个宏定义不需要全部添加。按照屏幕显示,只需要添加其中一个即可。如有需要也可全部添加。
添加完上述宏定义,要注意X、Y轴像素值需要对调。Ex:#defineLCD_XSIZE(320)/*X-resolutionofLCD,Logicalcoor.*/#defineLCD_YSIZE(240)/*Y-resolutionofLCD,Logicalcoor.*/2常见问题解决
编译时,找不到GUI_GetTime()或GUI_X_GetTime()或GUI_Delay()或GUI_X_Init()时,查看GUI文件夹下的CORE文件夹中是否缺失了GUI_X.C文件
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: