关注分享主机优惠活动
国内外VPS云服务器

基于STM32的UCGUI图形界面框架的移植(源码版本3.9.0)(ucgui stm32精美界面)

摘要:可以在此处找到移植教程。 第二部分是嵌入式应用图形支持软件的介绍。 使用任何控件,可与任何尺寸的物理和虚拟显示器配合使用。 其中一层称为驱动程序,包含对 . 并且为了测试移植是否成功,在main函数中添加如下代码:

1.环境介绍

keil:5.25

MCU:STM32F103ZET6

UCGUI版本:3.90(纯源码版本)

3.9。 0 源代码版本。 全部源码展示,方便学习。 后续版本将提供lib库文件,不再提供源码。

基于STM32的STemwin移植教程可以在这里找到:https://blog.csdn.net/xiaolong1126626497/article/details/117933355https://blog.csdn.net/xiaolong1126626497/article/details/ 117933355

2. UCGUI 概述 2.1 UCGUI

µC/GUI 是嵌入式应用的图形支持软件。 它旨在为使用图形 LCD 的应用程序提供独立于处理器和 LCD 控制器的高效图形用户界面。 适用于单任务或多任务系统环境。 µC/GUI 可与任何尺寸的物理和虚拟显示器配合使用,使用任何 LCD 控制和 CPU。 它的设计是模块化的,由不同层的不同模块组成。 其中一层称为 LCD 驱动程序,包含对 LCD 的所有访问。 µC/GUI 是用 100% ANSI C 编写的,因此它可以在任何 CPU 上运行。 µC/GUI 适用于大多数黑白和彩色 LCD。应用。 它有一个很棒的颜色管理器,可以处理灰度。 µC/GUI 还提供可扩展的 2D 图形库和窗口管理器,支持在使用最少 RAM 的情况下显示窗口。

UCGUI官网地址:Micrium Software and Documentation - Silicon Labs

2.2 GUI相关文件介绍

①. 一些 LCD 驱动程序代码存储在 GUI/LCDDriver 文件夹中。 如果您的 LCD 可以在此处找到代码

,您可以将其直接传递给 Config。 LCDConfig.h:

#define LCD_CONTROLLER -1 // -1:表示不选择LCD驱动,但使用内部示例程序进行修改。

有关 uCGUI 支持的 LCD 的更多信息,请参阅 uCGUI 用户手册中的第 22 章 LCD 驱动程序。 了解有关支持哪些控制器 LCD 的更多信息。

②。 只需将所需的 LCD 驱动程序代码文件加载到您的项目中即可。 如果设置为-1,则选择加载LCDDummy.C或LCDTemplate.C文件(此代码的文件名可能因版本而异)。

该文件夹主要内容如下。

配置 ----------- 配置文件

GUI ----------[ k4]源代码

GUI_X --------[k4 ]-操作系统界面函数定义文件

GUI源代码文件:

1) AntiAlias:支持抗锯齿显示效果。

2) ConvertColor:颜色显示的颜色转换支持。

3) ConvertMono:支持(黑白)和灰度显示的颜色转换。

4) Core:核心文件提供GUI的基本功能。

5) 字体:字体库。

6) JPEG:图像处理函数。

7) LCDDriver:LCD驱动支持。

8) MemDev:内存设备支持。 主要特点是防止重复项目触摸屏闪烁。

9) Widgets:表单控件库。

10) WM:窗口管理库。

注意:JPEG、MemDev、小部件和 WM 是可修剪的项目。 如果要支持widget(表单控件),则需要WM(窗口管理器)支持。

使用控件时,必须包含相应的头文件。 例如,如果需要使用按钮BUTTON,则必须首先包含BUTTON.h。 如果不包含头文件,即使支持该控件也无法使用。

2.移植流程

移植准备:

STM32开发板,完整的LCD显示屏,完整的KEIL(完整的完整的UCGUI 3.9源代码包(包括LCD驱动代码)

2.1 创建文件夹

首先在KEIL工程目录存放移植所需的源代码文件。

渲染:

p> 2.2 复制源代码文件

GUI_V3.9_官方源代码/uCGUI3.90版本源代码/复制启动路径下的Config文件夹和GUI文件我会的。 前面在KEIL工程目录下创建的UCGUI文件夹里面。

渲染:

复制GUI_V3.9_Official GUI_X文件夹示例源码中刚刚创建的UCGUI文件夹路径/uCGUI3.90版本源码/KEIL工程目录(GUI_X文件夹为操作系统界面)。

渲染:

2.3 创建UCGUI工程

打开KEIL工程,添加UCGUI源代码,根据UCGUI/GUI目录下的文件创建一个KEIL工程目录,使用源代码的默认名称,另外创建一个UCGUI_Config目录来存放UCGUI配置文件创建的工程目录,避免后期使用的不便。

2.4 添加UCGUI源文件

创建工程后,将相应的源文件添加到KEIL工程中。相应的头文件到目录

渲染:

>

按照GUI文件夹一一添加源文件和头文件,不能漏掉任何文件。 left:0;">仅将 .c 添加到源文件中,不添加其他文件。

UCGUI_Config 文件夹。这些文件是:

UCGUI/GUI_X/GUI_X.c //OS系统界面 UCGUI/Config/GUITouchConf.h //配置触摸屏 UCGUI/Config/ GUIConf.h //GUIUCGUI/Config/ 配置LCDConf h //设置。 LCD显示参数

效果图:

2.5修改配置文件

修改LCD配置文件,打开LCDConf.h文件,替换如下代码:

#ifndef LCDCONF_H#define LCDCONF_H#define LCD_XSIZE (240) /* LCD水平分辨率X -分辨率,逻辑坐标。 */#define LCD_YSIZE (320) /* LCD垂直分辨率Y-分辨率,逻辑坐标。 */#define LCD_BITSPERPIXEL (16) /*LCD颜色深度*/#define LCD_CONTROLLER (-1) /*LCD控制器具体型号*/#define LCD_FIXEDPALETTE (565) /*RGB颜色数量*/#define LCD_SWAP_RB ( 1) /*反转红蓝颜色*/#define LCD_INIT_CONTROLLER() LCD9341_Init (); /*底层初始化函数self是自己写的,没有包含在源代码中。 这一步非常重要 */#endif /* LCDCONF_H */

这一步没有必要,因为我们有 LCD 驱动需要UCGUI LCD驱动程序设置。

其中有: LCD9341_Init(); 该函数是自己工程的LCD初始化函数。 LCD初始化函数不能命名为LCD_Init()。 UCGUI 附带的 LCD 初始化函数也有这个名称,并且您不能在自己的项目中包含 LCD 名称结构。 否则,您将收到重新定义错误。

修改UCGUI配置文件,打开GUIConf.h文件,更改以下代码:

#ifndef GUICONF_H#define GUICONF_H #define GUI_OS ( 0) /* 系统支持*/#define GUI_SUPPORT_TOUCH (0) /* 触摸屏支持*/#define GUI_SUPPORT_UNICODE (0) /* 支持混合 ASCII/UNICODE 字符串*/#define GUI_DEFAULT_FONT &GUI_Font6x8/ /#define GUI_ALLOC_SIZE 12500 / * 动态内存大小 ... 对于 WM 和内存设备*/#define GUI_ALLOC_SIZE 1024*1024 /* 动态内存大小 ... 对于 WM 和内存设备*/#define GUI_WINSUPPORT 0 /* 窗口管理器包可用* /#define GUI_SUPPORT_MEMDEV 0 /* 内存设备可用*/#define GUI_SUPPORT_AA 0 /* 抗锯齿可用 */#endif /* 避免多重包含 */

对于初始移植,请关闭所有不必要的设置,并在熟悉后将其打开。 本节介绍 UCGU 的基本操作。

2.6 修改UCGUI底层驱动

打开LCDDummy.c文件,添加UCGUI底层画点和读点函数我会的。

首先,将LCD头文件添加到LCDDummy.c中。 然后将其定义为使用您自己的 LCD 驱动程序。

添加画点功能

该函数位于 LCDDummy.c 文件中(第 382 行左右)。

void LCD_L0_SetPixelIndex(int x, int y, int PixelIndex) { /* 将逻辑坐标转换为物理坐标(取决于 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 /* 写入硬件...适应系统 */ { LCD_DrawPoint_color(x,y,PixelIndex); //添加绘图点函数}}

添加读取点函数

该函数为LCDDummy c文件。 (大约第 407 行)。

unsigned int LCD_L0_GetPixelIndex(int x, int y) { LCD_PIXELINDEX PixelIndex; /* 将逻辑坐标转换为物理坐标(取决于LCDConf.h) */ #if LCD_SWAP_XY | LCD_MIRROR_Y int xPhys = LOG2PHYS_X( x , y ); int yPhys = LOG2PHYS_Y(x, y); #else #define xPhys x #define yPhys y #endif /* 从硬件读取...适应系统 */ {PixelIndex=LCD_ReadPoint(x, y); / 添加读取点函数} return PixelIndex;}

2.7 编译工程

当文件发生变化时,在main函数中返回并添加#包含“GUI.h”头文件。

接下来,在main函数中添加以下代码来测试GUI移植是否成功。

GUI_Init(); //初始化GUI GUI_SetBkColor(GUI_BLUE); //设置颜色 GUI_Clear();//清屏 GUI_GotoXY(60,50); //设置文字显示的XY坐标 GUI_DispString("Hello World!!"); //显示文字 GUI_DrawCircle(100,200,50); > 编写代码并编译项目。 编译时间大约为1-10分钟(取决于计算机性能)。

渲染:

如果编译成功,将代码下载到开发板并运行马苏。

效果如图所示。

2.8 如何解决编译错误

编译时出现如下错误:发生:

../OBJ/KEY.axf:错误:L6218E:未定义的符号终止(从 jerror.o 引用)。

按照错误提示,打开jerror.c文件,找到error_exit函数,将函数中最后一行代码改为exit(EXIT_FAILURE)。 这就是回报。 修改完毕后,再次编译,错误即可解决。

渲染:

如何:

检查原工程是否有以 LCD 命名的关联结构体,原工程的 LCD 初始化函数为 LCD_Init() 检查是否有 在这种情况下,只需更改函数名称即可。

以上问题通常都已解决,移植通常不会出现问题。如果遇到任何问题,您可以查看错误消息,确定错误所在并进行相应解决。

3.添加触摸屏.

在添加触摸屏功能之前,请先在原项目中输入触摸屏的X、Y坐标值。

打开3.1 GUIConf.h文件,修改当前GUI以支持触摸屏。 #define GUI_SUPPORT_TOUCH (1) /* 触摸屏支持*/#define GUI_ALLOC_SIZE 5000 // 大幅度改变内存空间。 . 防止编译

渲染:

3.2 打开GUITouchConf.h file 替换为以下代码

#ifndef GUITOUCH_CONF_H#define GUITOUCH_CONF_H#define GUI_TOUCH_AD_LEFT 0 // 屏幕左侧的大小 #define GUI_TOUCH_AD_RIGHT 240 // 屏幕右侧的大小 #define GUI_TOUCH_AD_TOP 0 // 屏幕顶部尺寸 #define GUI_TOUCH_AD_BOT 320 // 屏幕底部尺寸 #define GUI_TOUCH_SWAP_XY 0 // 坐标是否替换 #define GUI_TOUCH_MIRROR_X 0 //设置镜像X#define GUI_TOUCH_MIRROR_Y 0 //设置镜像Y#endif /* GUITOUCH_CONF_H */

渲染:

3.3 将 GUI_X_Touch.c 文件添加到项目的 UCGUI_Config 目录中。

GUI_X_Touch.c 位于 UCGUI/GUI_X 路径下。

修改代码获取X Y坐标,添加触摸屏驱动头文件。

将代码更改如下。

#include "GUI.h" #include "GUI_X.h" #include "touch.h" // 头文件 void GUI_TOUCH_X_ActivateX(void) {}void GUI_TOUCH_X_ActivateY(void) {}int GUI_TOUCH_X_MeasureX(void) { / /添加获取触摸X坐标的代码 Touch_check(); //扫描触摸屏 return TOUCH.x; //X坐标 }int GUI_TOUCH_X_MeasureY (void) {//添加获取触摸Y坐标的代码 Touch_check(); /扫描触摸屏 return TOUCH.y; //Y坐标}

渲染:

3.4 添加初始化函数

以上步骤完成后,添加初始化函数。 如果我将触摸屏功能(在我自己的项目中)添加到主功能中,触摸屏将正常运行。

3.5 轮询检测触摸屏

如果系统中没有添加GUI,定义一个定时器来扫描触摸屏并使用GUI_TOUCH_Exec (( );功能:扫描频率为:每10毫秒一次

如果系统中已添加GUI,则可以创建多频段任务并添加GUI_TOUCH_Exec()。

第四章加入UCOSII系统4.1移植准备步骤

本节移植基于UCOSII系统

移植系统前准备:

1获取 UCOSII 源代码的副本,熟悉 UCOSII 的基本操作(创建项目和创建任务)

GUIConf.h 打开文件更改当前 GUI 支持系统

#define GUI_OS (1 ) /* 系统支持*/

渲染:

4.2 添加UCOSII header 添加文件到GUI.h

添加相关头文件的路径渲染

将 4.3 UCOSII 源代码添加到项目目录

渲染:

注意:加载源码时,将ucos_ii.c添加到工程中,不能添加。

" ucos_ii。 c代码用于加载源文件。 .c 中不再需要 ucos_ii 代码,因为我手动将其他 UCOSII 源文件添加到项目中。

4.4 设置 UCOSII 任务计划的时基

初始化滴答时钟,启用滴答时钟中断,并将滴答时钟设置为每 10 毫秒中断一次。

(可以可以使用任何硬件定时来替换)

将以下代码添加到滴答时钟中断服务函数

(记得在tick定时器中断函数代码文件中引用UCOSII头文件:#include "includes.h")

/*Tick时钟中断服务函数* /void SysTick_Handler(void){ OSIntEnter(); //中断 OSTimeTick(); //调用ucos时钟服务程序 OSIntExit()}

渲染:

4.5 错误修复Macros

4.6 添加 UCOS 支持文件

完成上述步骤后,编译项目,会收到以下错误:

目标“UCGUI 移植”链接.../OBJ/KEY.axf:错误:L6218E:未定义符号 GUI_X_GetTaskId(从 guitask.o 引用).../OBJ/ KEY .axf:错误:L6218E:未定义符号 GUI_X_InitOS(引用来自 guitask.o).../OBJ/KEY.: 错误: L6218E: 未定义的符号 GUI_X_Lock(从 guitask.o 引用).../OBJ/KEY.axf:错误:L6218E:未定义符号 GUI_X_Unlock(从 guitask.o 引用)。 信息不足,无法列出图像符号。 已完成:1 条信息、0 条警告和 4 条错误消息。 "../OBJ/KEY.axf" - 4 错误,0 警告。目标未创建

根据错误消息打开 GUITask.c 文件。 GUITask.c要求某些功能必须在GUI_X.c文件中实现。

按照提示继续打开 GUI_X.C。 前面提到,GUI_X.C文件主要提供OS系统接口,配置系统相关的外部环境。

渲染:

当前端口安装的操作系统是UCOSII系统。 打开KEIL工程路径下的GUI_X文件夹:

渲染:

该目录包含六个与系统接口相关的文件。 我正在移植UCOS系统,GUI_X_uCOS.c文件是UCOSII系统的接口。 将 GUI_X_uCOS.c 文件添加到项目

渲染:

将 GUI_X.C 文件中的三个底层函数复制到 GUI_X_uCOS.c 文件

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) }

渲染:

完成上述步骤后,从项目中卸载 GUI_X.c 文件,因为 GUI_X_uCOS.c 和 GUI_X.c 文件实现的许多功能是相同的(如果您不想卸载) GUI_X.c,然后修改GUI_X_uCOS.c文件,替换UCOS延迟函数(第78行) /p> void GUI_X_ExecIdle (void) { //OS_X_Delay(1);OSTimeDly(50); //UCOS延迟函数}

渲染:

4.7 任务测试效果建立

//启动任务 void start_task(void *pdata){ OS_CPU_SR cpu_sr=0;pdata = pdata; () //进入临界区(不能被中断中断) OSTaskCreate( led0_task,(void) *)0,(OS_STK*)&LED0_TASK_STK[LED0_STK_SIZE-1],LED0_TASK_PRIO);//创建任务 OSTaskCreate(led1_task,(void *)0,(OS_STK*)&LED1_TASK_STK[LED1_STK_SIZE-1],LED1_TASK_PRIO); OSTaskSuspend(START_TASK_PRIO);//暂停已启动的任务。 OS_EXIT_CRITICAL(); //退出临界区(可能被中断中断)}//LED0任务 void led0_task(void *pdata){ u8 i;u16 cnt=0;/***** ******** **** ************ *****绘制进度条控件*** **************** ****** ***** ************/ hProgBar_1 = PROGBAR_Create(0, 0, 240, 40, WM_CF_SHOW ); //设置进度条大小坐标参数 PROGBAR_SetBarColor(hProgBar_1,0,GUI_GREEN); //参数(handle,1(0)为进度条覆盖的区域和进度条未覆盖的区域,表示显示进度条覆盖的颜色) PROGBAR_SetBarColor(hProgBar_1,1,GUI_RED); //参数(handle,1(0)为进度条覆盖的区域,进度表示显示状态栏未覆盖的区域和进度条未覆盖的颜色) PROGBAR_SetValue(hProgBar_1,99);句柄,99是进度条显示的99%) while( 1){ i=!i ;LED2(i);LED3(i);PROGBAR_SetValue(hProgBar_1,cnt); //控制显示进度条 1 OSTimeDlyHMSM(0 ,0,1,0); //任务延迟一定的时间(设置小时、分钟、秒、毫秒) WM_Exec();if(cnt>=100){cnt=0;}}} //LED1 任务 void led1_task(void *pdata){ u8 i;u16 cnt;hProgBar_2 = PROGBAR_Create(0, 80, 240, 40, WM_CF_SHOW); //设置进度条的大小坐标参数 PROGBAR_SetBarColor(hProgBar_2,0,GUI_GREEN); //参数(handle,1(0)为进度条覆盖的区域,未覆盖的区域,代表显示进度条覆盖的颜色) PROGBAR_SetBarColor( hProgBar_2,1,GUI_RED); //参数(handle, 1(0)为进度条覆盖的区域,progress表示显示进度条未覆盖的区域的颜色和进度条未覆盖的区域)while(1){ //GUIDEMO_main(); //运行演示代码 i=!i;LED1 (i);PROGBAR_SetValue(hProgBar_2,cnt); / /显示进度条2控件的进度 WM_Exec(); //显示启用 OSTimeDlyHMSM(0,0 ,0,500); // 延迟任务一定的时间(设置小时、分钟、秒、毫秒) cnt++ ;if(cnt>=100){cnt=0;}}}

效果图:

第五章:移植演示代码

将所有演示文件添加到您的项目中进行编译,最后运行演示代码。

//LED0任务 void led0_task(void *pdata){ u8 i;while(1){ i=!i;LED2(i);LED3(i); GUI_TOUCH_Exec(); OSTimeDlyHMSM(0,0,0,10); // 将任务延迟一定的时间(设置小时、分钟、秒和毫秒)}}//LED1 任务 void led1_task(void *pdata){ u8 i;while(1){GUIDEMO_main(); //运行演示代码 i=!i LED1(i); ;LED4(i);OSTimeDlyHMSM(0,0,0,10); // 延迟任务一定的时间(设置时、分、秒、毫秒)}}

设置系统时间计算

如果您运行UCOS系统,您可以将UCOS运行频率设置得更高。 #define OS_TICKS_PER_SEC 1000 //1 秒节拍时间。

如何计算节拍时间:节拍时钟中断时间 * 节拍数 = 1 秒

第六章 常用相关函数分析 6.1 初始化函数

函数原型

GUI_Init()函数

初始化 GUI 的内部数据结构和变量。 在使用 GUI 中的任何功能之前必须调用此函数。

函数参数

返回值

6.2 设置 XY 坐标

函数原型

GUI_GotoXY(int x, int y)

功能

当前设置XY 坐标值

函数参数

X:横坐标 Y:纵坐标

返回值

p>

成功返回 0

相关函数

GUI_GotoX() 设置当前 X 坐标

GUI_GotoY() 设置当前 X 坐标 当前 Y 坐标

6.3 设置 LCD 背景颜色

函数原型

void GUI_SetBkColor(GUI_COLOR color)

功能

设置 LCD 背景颜色

> p >

函数参数

颜色:颜色值

返回值

6.4 设置 LCD 前景色

函数原型

void GUI_SetColor(GUI_COLOR color)

功能

设置LCD前景色

函数参数

颜色:颜色值

返回值

官方文件

GUI_SetColor.c

当前6.5 坐标显示文字

函数原型

void GUI_DispString(const char GUI_UNI_PTR *s)

函数

在当前坐标处显示text-字符串

函数参数

*s: 字符串指针

返回值

拥有的文件

GUI_DispString.C

> p>

示例:

GUI_DispString( " Hello world!!"); // 显示字符串

6.6 指定显示文本的坐标

函数原型

void GUI_DispStringAt(const char GUI_UNI_PTR *s, int x, int y)

功能

指定坐标处的text- 显示string

函数参数

*s:字符串指针

X:水平坐标

Y:垂直坐标

返回值

官方文件

GUI_DispStringAt.c

示例:

GUI_DispStringAt("Hello World!!",0,100); // 显示字符串

6.7 显示文本的API函数集合

函数

p>

GUI_DispChar()

在当前坐标处显示一个字符

GUI_DispCharAt( )

在指定坐标处显示单个字符

p>

GUI_DispChars()

按照指定的重复次数显示字符

GUI_DispChars()

显示文本当前坐标字符串

GUI_DispStringAt()

在指定坐标处显示字符串

GUI_DispStringAtCEOL()

在指定坐标处显示字符串并清除到行尾

GUI_DispStringInRect()

在指定矩形区域内显示字符串

GUI_DispStringLen()

在当前坐标处显示指定字符数的字符串

6.8 选择文本绘制模式

函数

函数

>

GUI_SetTextMode();

设置文本绘制模式

6.9 选择文本对齐方式

功能

函数

GUI_GetTextAlign( )

返回当前文本对齐模式

GUI_SetLBorder()

换行后设置左边距

GUI_SetTextAlign()

设置文本对齐方式

6.10 设置当前文本坐标

函数

函数

GUI_GotoX()

转到当前集合坐标

GUI_GotoXY()

设置当前 YX 坐标

GUI_GotoY()

设置当前 Y 坐标

6.11 返回当前值文本坐标

函数

函数

GUI_GetDispPosX()

返回当前 X 坐标

GUI_GetDispPosY()

现在返回

的Y坐标

6.12 清除窗口相关函数

函数

函数

GUI_Clear()

清除活动窗口(背景如果是活动窗口,整个屏幕将被擦除)

GUI_DispCEOL()

清除从当前坐标到行尾的显示

第七章存储设备

默认情况下,存储设备处于激活状态。要优化软件性能,请通过在配置文件 GUIConf.h 中添加以下行来关闭存储设备支持: 您可以: #define GUI_SUPPORT_MEMDEV 0

如果要使用这个,需要打开宏开关。

未经允许不得转载:主机频道 » 基于STM32的UCGUI图形界面框架的移植(源码版本3.9.0)(ucgui stm32精美界面)

评论 抢沙发

评论前必须登录!