摘要:可以在此处找到移植教程。 第二部分是嵌入式应用图形支持软件的介绍。 使用任何控件,可与任何尺寸的物理和虚拟显示器配合使用。 其中一层称为驱动程序,包含对 . 并且为了测试移植是否成功,在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
如果要使用这个,需要打开宏开关。
评论前必须登录!
注册