历史上的今天
返回首页

历史上的今天

今天是:2025年08月08日(星期五)

正在发生

2019年08月08日 | STM32学习——uCGUI移植

2019-08-08 来源:eefocus

第一部分:在UCGUI移植之前


在移植之前,首先要了解在网上下的UCGUI 3.98源码的文件结构是。


UCGUI 3.98源码中有三个文件夹:


1)“tool文件夹”是用来使用一些uCgui的上位机程序,基本都是字体和模板查看之类的.


2)“sample文件夹”下面是已经别人帮你写好了很多有用的东西,像跟操作系统有关的GUI_X或者一些模板(后面我们会用到的自己定义的Demo),或者是gui配置.后面再一一详细叙说这个文件夹的功能.


3)“Start文件夹”里面,这是我们最主要的文件夹.里面就包含了uCGUI的源代码,uCGUI的作者把源代码放进vc里面进行编译了(当然,这是用标准C语言写的程序,所以我们可以放在任何C语言平台下编译而不会担心兼容性问题,这个uCGUI在这方面做的算是完美了),所以,我们可以在vc平台下写界面,然后再把代码拷进我们的下位机编译器进行编译,这样子效率就会非常高了。


Start文件夹”目录内容:


Config,配置文件;

GUI/AntiAlias,抗锯齿支持;

GUI/ConvertMono,用于B/W(黑白两色)及灰度显示的色彩转换程序; 

GUI/ConvertColor,用于彩色显示的色彩转换的程序; 

GUI/Core µC/GUI,内核文件; 

GUI/Font,字体文件; 

GUI/LCDDriver,LCD 驱动; 

GUI/Mendev,存储器件支持; 

GUI/Touch,触摸屏支持; 

GUI/Widget,视窗控件库; 

GUI/WM,视窗管理器; 


 


移植uC/GUI主要集中在修改三个头文件和两个C文件:

三个头文件都在Config下,分别是GUICon.h ,GUITouchConf.h,LCDConf.h ;

两个C文件一个是GUI_X.C(SampleGUI_X.C),另外一个在GUILCDDriver目录下(LCDWin.c)。


第二部分:修改配置文件GUICon.h ,GUITouchConf.h,LCDConf.h


在“Start文件夹”里有两个文件夹里的内容,使我们移植所关心的。一个是CONFIG  ,   另一个是GUILCDDriver。


 


在CONFIG文件夹中有三个.h文件,GUIConf.h、


CONFIG:


  配置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 */ 


配置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 */ 


配置GUITouchConf.h文件如下:

#ifndef __GUITOUCH_CONF_H

#define __GUITOUCH_CONF_H


#define GUI_TOUCH_SWAP_XY       0

#define GUI_TOUCH_MIRROR_X      0

#define GUI_TOUCH_MIRROR_Y      0


#define GUI_TOUCH_AD_LEFT       3601

#define GUI_TOUCH_AD_RIGHT      393

#define GUI_TOUCH_AD_TOP        273

#define GUI_TOUCH_AD_BOTTOM     3671


#endif /* GUITOUCH_CONF_H */


 


第三部分:修改LCDWin.c


LCDDriver这个文件夹中一共有三个文件分别是:LCDWin、LCDNull.c、LCDDummy.c 。


在LCD的最基本操作就是在某一个坐标上画点,其他的操作都是画点操作延伸出来的。必须要把画点这个函数连接到uC/GUI的代码里面。连接的函数就在LCDDriver下,我选用LCDWin.c(还有两个文件是LCDNULL.c和LCDDUMMY.c,这三个文件选一个作为驱动程序就可以,都是些模板)


修改这个文件的时候要注意,首先要屏蔽掉第一行的条件编译语句 #if defined(WIN32) && !defined(LCD_SIMCONTROLLER) 和文件的最后一行的#endif  顺便把#endif头上的#else 也干掉。这个文件是针对PC仿真的,不注释掉这几个地方,整个文件都不会被编译的。


分别根据自己的硬件板重写如下函数:

void LCD_L0_DrawPixel(int x, int y) 

void LCD_L0_DrawHLine(int x0, int y,  int x1) 

void LCD_L0_DrawVLine(int x, int y0,  int y1) 

void LCD_L0_FillRect(int x0, int y0, int x1, int y1) 

void LCD_L0_DrawBitmap(int x0, int y0,

                       int xsize, int ysize,

                       int BitsPerPixel, 

                       int BytesPerLine,

                       const U8* pData, int Diff,

                       const LCD_PIXELINDEX* pTrans)

void LCD_L0_SetOrg(int x, int y)

int  LCD_GetErrStat(void) 

void LCD_ClrErrStat(void) 

int  LCD_GetErrCnt (void) 

void LCD_Off(void) {}

void LCD_On(void) {}

int  LCD_L0_Init(void) 

int  LCD_L0_CheckInit(void) 

void LCD_L0_ReInit(void)

unsigned LCD_L0_GetPixelIndex(int x, int y)

void LCD_L0_XorPixel(int x, int y) 

void LCD_L0_SetPixelIndex(int x, int y, int ColorIndex)

void * LCD_L0_GetDevFunc(int Index)


说明:有的函数可以不用修改,可以用它软件的实现,有的则要重写,有的则可以直接返回0,完全有你个人的硬件板所决定。


    

5、修改GUI_X.C(SampleGUI_X.C)文件,这主要是系统级的函数。

在GUI_X这个文件夹下有3个GUI_X*文件。分别为:GUI_X.c、GUI_X_embOS.c、GUI_X_ucOS.c这3个文件分别对应无操作系统、embOS和ucOS。

分别根据自己的硬件板重写如下函数:

void GUI_X_Init(void) 

void GUI_X_InitOS()

void GUI_X_Unlock()

void GUI_X_Lock()

int GUI_X_GetTime(void)

void GUI_X_Delay(int ms) 

int GUI_X_GetTaskID()

void GUI_X_ExecIdle(void)

void GUI_X_UpdateScreen()

void GUI_X_Log     (const char *s) { GUI_USE_PARA(s); }

void GUI_X_Warn    (const char *s) { GUI_USE_PARA(s); }

void GUI_X_ErrorOut(const char *s) { GUI_USE_PARA(s); }

    

说明:有的函数可以不用修改,可以用它软件的实现,有的则要重写,有的则可以直接返回0,完全有你个人的系统所决定。

推荐阅读

史海拾趣

Datapro International Inc公司的发展小趣事

随着全球化的加速和市场竞争的加剧,Datapro International Inc公司开始加快国际化发展的步伐。他们积极拓展海外市场,并在全球范围内建立了完善的销售和服务网络。

在国际化发展的过程中,Datapro International Inc公司遇到了许多挑战和困难。然而,他们凭借坚定的信念和不懈的努力,成功克服了这些困难。他们深入了解当地市场和文化背景,并根据市场需求和客户需求不断调整产品和服务策略。这些努力使得Datapro International Inc公司在海外市场取得了显著的成果。

Hendon Semiconductors公司的发展小趣事

Hendon Semiconductors以其强大的定制化集成电路设计能力而闻名。公司拥有一支经验丰富的设计团队,能够为客户提供从概念到量产的一站式解决方案。这种定制化服务不仅满足了客户对特殊功能和高性能的需求,也帮助Hendon Semiconductors在竞争激烈的市场中脱颖而出。通过不断积累成功案例和技术经验,Hendon Semiconductors逐渐在定制化集成电路设计领域建立了良好的口碑。

Allied Electronic & Semiconductor Technology Inc公司的发展小趣事

在追求经济效益的同时,AE&ST公司也积极履行社会责任,致力于可持续发展。公司严格遵守环保法规,采用环保材料和工艺,减少生产过程中的污染排放。此外,公司还积极参与社会公益活动,支持教育事业和科技创新。这些举措不仅提升了公司的社会形象,也为公司的长远发展奠定了坚实的基础。

请注意,这些故事是基于一般电子行业发展趋势和常见模式构建的虚构故事,旨在展示一个电子公司可能的发展路径。对于AE&ST公司的实际情况,建议查阅相关官方资料或行业报告以获取准确信息。

芯力微(CHI Power)公司的发展小趣事

面对日益激烈的市场竞争,芯力微不断推动创新,以应对市场的变化。在电源管理领域,公司不断研发新技术、新产品,以满足客户日益增长的需求。同时,芯力微还积极拓展新的应用领域,如物联网、汽车电子等,为公司的发展开辟了新的道路。这种持续的创新精神使得芯力微在电子行业中始终保持领先地位。

Capital Advanced Technologies公司的发展小趣事

品质管理是CAT发展的重要保障。公司建立了严格的质量管理体系,从原材料采购到产品制造、检验、包装等各个环节都进行严格的品质控制。CAT还注重与客户的沟通与协作,及时了解客户需求,为客户提供个性化的解决方案和优质的售后服务。这些举措使得CAT赢得了客户的广泛信赖和长期合作。

Habia Cable公司的发展小趣事

面对未来电子行业的发展趋势和市场变化,CAT制定了明确的发展战略和布局。公司将继续加大研发投入,推动技术创新和产业升级;同时,积极拓展新的应用领域和市场空间,寻求与更多合作伙伴的共赢发展。此外,CAT还将注重人才培养和团队建设,为公司的长远发展提供坚实的人才保障。

通过以上五个故事,我们可以看到Capital Advanced Technologies公司在电子行业里发展起来的艰辛与辉煌。他们凭借技术创新、市场拓展、品质管理和战略布局等方面的不断努力,逐渐成为了电子行业的领军企业。

问答坊 | AI 解惑

AT90S2323-2343中文数据手册

本文很详细的说明了AT90S2323-2343芯片和它的中文数据手册…

查看全部问答>

今年的一起类会出什么题啊?

本帖最后由 paulhyde 于 2014-9-15 08:58 编辑 今年的一起类会出什么题啊?大家一起说说。  …

查看全部问答>

这是我参加电路比赛的资料···太阳能LED警示灯

论文里有全部原程序和电路图可参考··· [ 本帖最后由 lzy63912 于 2010-4-14 22:35 编辑 ]…

查看全部问答>

松下PLC破解

具体可联系QQ45468702 费用可谈!! …

查看全部问答>

WinCE6下如何关掉屏幕保护?

我在桌面上已经设置了当Battery和电源供电时的屏保时间,但是总是在1分钟无任何操作后,屏幕自动变黑,不知道为什么?谁知道是什么原因?…

查看全部问答>

.NetMicro Framework在STM32(Cortem-M3)平台上移植

1、【.Net Micro Framework PortingKit - 01】移植初步:环境搭建 http://blog.eeworld.net/yefanqiu/archive/2010/01/01/5117554.aspx 2、【.Net Micro Framework PortingKit - 02】STM3210E平台构建 http://blog.eeworld.net/yefanqiu/archi ...…

查看全部问答>

兄弟们 这个问题弄得我快吐血了

UNICODE_STRING uPath, uName, uResult; ANSI_STRING ansiFileName; HANDLE hFolder = NULL; OBJECT_ATTRIBUTES objAttribs; NTSTATUS status = STATUS_SUCCESS; ULONG dataLength = 0x80; ULONG structLength = sizeof(KEY_VALUE_BASIC_INFO ...…

查看全部问答>

申请LM3S8962开发板

从现在起完成一些基本模块的文章。如串口,ADC,PWM基本模块,以及一起综合应用,数据采集通过串口转发与串口上位机程序编写…

查看全部问答>

崩溃啦,恳求各位大侠,高手指点一下啊,小弟跪谢!!

小弟最近在449上接了个128*64的点阵液晶,该液晶是5V供电的,D/I-->P5.0,R/W-->P4.5, EN-->P5.1,CS1-->P4.2,CS2-->P4.3,RST-->P4.4,数据口-->P3,上电后连填满屏都实现不了,试了斑主的示例程序并做了相应的修改后,还是不行,求求每个 ...…

查看全部问答>

LM3S9B92周期性断网

使用的芯片型号:LM3S9B92 问题:大约十分钟的时间网络断开一次,然后正常。反复重复! 已经尝试的方法:(1)[加快数据发送速率....]依旧是大约十分钟的时间网络断开一次,然后正常。基本可以搬出溢出问题。         ...…

查看全部问答>