0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于STM32移植UCGUI图形界面框架(3.9.0源码)

DS小龙哥-嵌入式技术 来源:DS小龙哥-嵌入式技术 作者:DS小龙哥-嵌入式技 2022-02-28 13:26 次阅读

一、环境介绍

keil: 5.25

MCU: STM32F103ZET6

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

3.9.0是源码版本,可以看到全部源码,也方便学习;后续的版本都是提供lib库文件,不再提供源码了。

2.1 UCGUI

µC/GUI 是一种用于嵌入式应用的图形支持软件。它被设计用于为任何使用一个图形 LCD的应用提供一个有效的不依赖于处理器和 LCD 控制器的图形用户接口。它能工作于单任务或多任务的系统环境下。 µC/GUI 适用于使用任何 LCD 控制和 CPU 的任何尺寸的物理和虚拟显示。它的设计是模块化的,由在不同的模块中的不同的层组成。一个层,称作 LCD 驱动程序,包含了对 LCD 的全部访问。 µC/GUI 适用于所有的 CPU,因为它 100%由的 ANSI 的 C 语言编写的。
µC/GUI 很适合大多数的使用黑色/白色和彩色 LCD 的应用程序。 它有一个很好的颜色管理器,允许它处理灰阶。 µC/GUI 也提供一个可扩展的 2D 图形库和一个视窗管理器,在使用一个最小的 RAM 时能支持显示窗口。

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

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

2.2 GUI相关文件介绍

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

①.GUI/LCDDriver 文件夹中存放的是一些 LCD 驱动代码,如果你使用的 LCD 在

这里可以找到代码,可以直接通过 Config 中的 LCDConfig.h :

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

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

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

文件夹的主要内容如下:

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

GUI-----------源代码

GUI_X----------操作系统接口函数定义文件

GUI源代码文件:

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

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

3)ConvertMono:(b/w)和灰度显示的色彩转换支持。

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

5)Font:字库。

6)JPEG:图片操作函数。

7)LCDDriver:LCD驱动支持。

8)MemDev:内存设备支持。主要功能是防止在项目重叠时触摸屏的闪烁。

9)Widget:窗体控件库。

10)WM:窗口管理库。

注意:JPEG、MemDev、Widget、WM是可裁剪项,若要支持Widget(窗体控件),需要

WM(窗口管理器)的支持;使用控件时,需要将相应的头文件包含进去,比如我们需要使用按钮BUTTON,那么我们需要先包含BUTTON.h头文件,否则控件即使支持也不可用。

二、移植步骤

移植准备工作

  1. 一个块STM32开发板
  2. 一个完好的LCD显示屏
  3. 一个完整的基于开发板的KEIL工程(包含完整的LCD驱动代码)
  4. 一个完整的UCGUI 3.9源码包

2.1 创建文件夹

首先在KEIL工程目录下创建一个UCGUI的文件夹,用来存放移植需要用到的源码文件。

效果图:

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

2.2 拷贝源码文件

GUI_V3.9_官方源码\uCGUI3.90版源码\Start路径下的Config文件夹和GUI文件拷贝到刚才在KEIL工程目录下创建的UCGUI文件夹里。

效果图:

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

GUI_V3.9_官方源码\uCGUI3.90版源码\Sample路径下的GUI_X文件夹拷贝到刚才在KEIL工程目录下创建的UCGUI文件夹里。(GUI_X文件夹是操作系统的接口

效果图:

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

2.3 创建UCGUI工程

打开KEIL工程,添加UCGUI源代码。

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

根据 UCGUI\GUI 目录下的文件创建KEIL的工程目录,名字最好用源码默认的名字不要修改,以防止后面查找不方便。额外再添加创建一个UCGUI_Config目录,用来存放UCGUI的配置文件创建好的工程目录—效果图:

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

2.4 添加UCGUI源文件

工程创建OK之后,将对应源文件添加到KEIL工程目录下,将对应的头文件加入工程。

效果图:

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

添加的源文件和头文件需要对照GUI文件夹逐个添加,不能漏掉文件。

源文件只添加.c 。其他文件一律不添加。

UCGUI_Config文件夹添加的文件如下所示:

UCGUI\GUI_X\GUI_X.c          //OS系统接口
UCGUI\Config\GUITouchConf.h   //配置触摸屏
UCGUI\Config\ GUIConf.h       //配置GUI
UCGUI\Config\ LCDConf.h       //配置LCD显示屏参数
poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

效果图:

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

2.5 修改配置文件

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

#ifndef LCDCONF_H
#define LCDCONF_H
#define LCD_XSIZE (240)        /* 水平分辨率X-resolution of LCD, Logical coor. */
#define LCD_YSIZE (320)        /* 垂直分辨率Y-resolution of LCD, Logical coor. */
#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 (); 
/*底层初始化函数,自己写的,而非源码自带,这一步非常重要*/
#endif /* LCDCONF_H */
poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

因为我们有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  /* Size of dynamic memory ... For WM and memory devices*/
#define GUI_ALLOC_SIZE          1024*1024  /* Size of dynamic memory ... For WM and memory devices*/
#define GUI_WINSUPPORT             0  /* 窗口管理器包可用 */
#define GUI_SUPPORT_MEMDEV        0  /* 内存设备可用 */
#define GUI_SUPPORT_AA             0  /* 抗锯齿可用 */

#endif  /* Avoid multiple inclusion */
poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

初次移植,将不需要用到的配置全部关闭,等UCGU的基本操作熟悉之后再打开使用。

2.6 修改UCGUI底层驱动

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

先在LCDDummy.c里加入LCD头文件。并且定义使用自己的LCD驱动。

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

添加画点函数

该函数在LCDDummy.c文件(大约382行)处。

void LCD_L0_SetPixelIndex(int x, int y, int PixelIndex)
 {
  /* Convert logical into physical coordinates (Dep. on 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
  /* Write into hardware ... Adapt to your system */
  {
    LCD_DrawPoint_color(x,y,PixelIndex); //添加画点函数
  }
}
poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

添加读点函数

该函数在LCDDummy.c文件(大约407行)处。

unsigned int LCD_L0_GetPixelIndex(int x, int y) {
  LCD_PIXELINDEX PixelIndex;
  /* Convert logical into physical coordinates (Dep. on 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
  /* Read from hardware ... Adapt to your system */
  {
		PixelIndex=LCD_ReadPoint(x,y);  //添加读点函数
  }
  return PixelIndex;
}
poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

2.7 编译工程

文件修改完毕之后,回到主函数,添加#include "GUI.h"头文件。

并在主函数里加入下面的代码,测试GUI移植是否成功。

GUI_Init();                    //GUI初始化
GUI_SetBkColor(GUI_BLUE);      //设置颜色
GUI_Clear();                   //清屏
GUI_GotoXY(60,50);             //设置字符显示的XY坐标
GUI_DispString("Hello World!!");   //显示字符
GUI_DrawCircle(100,200,50);      //画圆  
poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

代码写完,编译工程,编译时间1-10分钟左右(电脑性能决定)。

效果图:

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

编译成功之后,将代码下载到开发板运行。

效果如图:

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

2.8 编译错误解决办法

如果编译出现下面的错误:

..\OBJ\KEY.axf: Error: L6218E: Undefined symbol exit (referred from jerror.o).
poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

根据错误提示,打开jerror.c文件,找到error_exit函数,将该函数的最后一行代码exit(EXIT_FAILURE); 该为return 。改完,再次编译,错误解决。

效果图:

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

方法:

  1. 查找自己原来的工程里是否有以LCD命名的相关结构体,
  2. 查看原来工程里的LCD初始化函数是否是LCD_Init(), 如果是,就修改函数名字。

一般解决了上述的问题,移植一般都没有问题。出现了问题,可以查看错误信息,判断是什么错误,针对性解决。

三、加入触摸屏

加入触摸屏功能之前,要保证原本工程已经有正常的触摸屏驱动代码,能正确的转换触摸屏的X Y坐标值。

3.1 打开GUIConf.h文件,修改当前GUI支持触摸屏

#define GUI_SUPPORT_TOUCH         (1)  /* 支持触摸屏 */
#define GUI_ALLOC_SIZE             5000   //修改内存空间改大一点,防止编译不过  
poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

效果图:

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

3.2 打开GUITouchConf.h文件,替换成下边代码。

#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_BOTTOM  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 */
poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

效果图:

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

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坐标
}
poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

效果图:

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

3.4 添加初始化函数

上边步骤完成之后,在主函数添加(自己工程的)触摸屏的初始化函数,触摸屏即可正常运行。

3.5 轮询检测触摸屏

如果GUI没有加入系统,需要定义一个定时器去扫描触摸屏,在定时器的中断服务函数里加入GUI_TOUCH_Exec();函数。扫描的频率为:10毫秒一次

如果GUI加入了系统,可以创建一个单独的任务,在任务里添加GUI_TOUCH_Exec();

第四章 加入UCOSII系统

4.1 移植准备步骤

本小节的的移植是基于UCOSII系统的移植

移植系统之前的准备工作:

  1. 一份UCOSII源码
  2. 熟悉UCOSII的基本操作(创建工程和任务编写)

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

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

效果图:

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

4.2 在GUI.h加入UCOSII的头文件。

添加相关头文件路径效果图:

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

4.3 添加UCOSII源码到工程目录

效果图:

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

注意:加载源码的时候,不能将ucos_ii.c加入到工程。加入了ucos_ii.c文件会出现重定义。

ucos_ii.c的代码作用是加载源文件,因为UCOSII其他源文件我们已手动加入到工程,已不需要ucos_ii.c的代码”。

4.4 设置UCOSII任务调度时间基准

初始化滴答时钟,开启滴答时钟中断,设置滴答时钟10毫秒中断一次。

(用任何一个硬件定时器都可以代替)

在滴答时钟中断服务函数里加入下面的代码:

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

/*
滴答时钟中断服务函数
*/
void SysTick_Handler(void)
{
	   OSIntEnter();		   //进入中断
    OSTimeTick();       //调用ucos的时钟服务程序               
    OSIntExit();         //触发任务切换软中断
}
poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

效果图:

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

4.5 修改错误与正确的宏

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

4.6 添加UCOS支持文件

在进行上边的步骤,之后,编译工程,会出现如下的错误:

Build target 'UCGUI移植'
linking...
..\OBJ\KEY.axf: Error: L6218E: Undefined symbol GUI_X_GetTaskId (referred from guitask.o).
..\OBJ\KEY.axf: Error: L6218E: Undefined symbol GUI_X_InitOS (referred from guitask.o).
..\OBJ\KEY.axf: Error: L6218E: Undefined symbol GUI_X_Lock (referred from guitask.o).
..\OBJ\KEY.axf: Error: L6218E: Undefined symbol GUI_X_Unlock (referred from guitask.o).
Not enough information to list image symbols.
Finished: 1 information, 0 warning and 4 error messages.
"..\OBJ\KEY.axf" - 4 Error(s), 0 Warning(s).
Target not created
poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

根据报错提示信息,打开GUITask.c 文件。GUITask.c有提示需要在GUI_X.c文件实现几个函数。

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

根据提示,继续打开GUI_X.C 。前边有提到,GUI_X.C文件主要是提供OS系统接口,配置/系统相关的外部环境。

效果图:

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

我们当前移植的OS是UCOSII系统,打开KEIL工程路径下的GUI_X文件夹:

效果图:

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

该目录下有6个与系统接口相关的文件,我们移植的是UCOS系统,其中GUI_X_uCOS.c文件是UCOSII系统的接口。我们将GUI_X_uCOS.c文件加入到工程

效果图:

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

将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); }
poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

效果图:

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

完成上面的步骤之后,将GUI_X.c文件从工程中卸载掉,因为GUI_X_uCOS.c与GUI_X.c文件实现的函数有很多是相同的,不卸载GUI_X.c会出现重定义的错误。

接着修改GUI_X_uCOS.c文件,替换UCOS的延时函数。(大约在78行)。

void GUI_X_ExecIdle (void) 
{
    //OS_X_Delay(1);
	OSTimeDly(50);  //UCOS延时函数
}
poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

效果图:

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

4.7 建立任务测试效果

//开始任务
void start_task(void *pdata)
{
  OS_CPU_SR cpu_sr=0;
	pdata = pdata; 
  OS_ENTER_CRITICAL();			      //进入临界区(无法被中断打断)    
 	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); //参数(句柄,1(0)代表本函数是显示进度条覆盖的区域还未覆盖的区域,进度条覆盖的颜色)
  PROGBAR_SetBarColor(hProgBar_1,1,GUI_RED);   //参数(句柄,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();  
		cnt++;
		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); //参数(句柄,1(0)代表本函数是显示进度条覆盖的区域还未覆盖的区域,进度条覆盖的颜色)
  PROGBAR_SetBarColor(hProgBar_2,1,GUI_RED);   //参数(句柄,1(0)代表本函数是显示进度条覆盖的区域还未覆盖的区域,进度条未覆盖的颜色)

	while(1)
	{
		//GUIDEMO_main();	 //运行DEMO代码
		i=!i;
		LED1(i);
		LED4(i);
	  PROGBAR_SetValue(hProgBar_2,cnt);  //显示进度条2控件 的进度
		WM_Exec();                         //显示生效
		OSTimeDlyHMSM(0,0,0,500); //将一个任务延时若干时间(设定时、 分、 秒、 毫秒)
	  cnt++;
		if(cnt>=100)
		{
			cnt=0;
		}
	}
}
poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

效果图:

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

第五章 移植DEMO代码

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

将DEMO文件全部加入工程编译,最后运行DEMO代码。

//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();	 //运行DEMO代码
		i=!i;
		LED1(i);
		LED4(i);
		OSTimeDlyHMSM(0,0,0,10);          //将一个任务延时若干时间(设定时、 分、 秒、 毫秒)
	}
}
poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

系统时间计算

如果跑UCOS系统可以设置UCOS工作频率高一些: #define OS_TICKS_PER_SEC 1000 //一秒的节拍时间。

节拍时间计算方式:滴答时钟中断时间 * 节拍次数 = 1秒

第六章 常用相关函数解析

6.1 初始化函数

函数原型

GUI_Init();

函数功能

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

函数参数

返回值

6.2 设置XY坐标

函数原型

GUI_GotoXY(int x, int y)

函数功能

设置当前的XY坐标

函数参数

X :横坐标 Y:纵坐标

返回值

成功返回0

相关函数

GUI_GotoX() 设置当前X坐标

GUI_GotoY() 设置当前Y坐标

6.3 设置LCD背景颜色

函数原型

void GUI_SetBkColor(GUI_COLOR color)

函数功能

设置LCD背景颜色

函数参数

Color:颜色值

返回值

6.4 设置LCD前景颜色

函数原型

void GUI_SetColor(GUI_COLOR color)

函数功能

设置LCD前景颜色

函数参数

Color:颜色值

返回值

所属文件

GUI_SetColor.c

6.5 在当前坐标显示文本

函数原型

void GUI_DispString(const char GUI_UNI_PTR *s)

函数功能

在当前坐标显示文本-字符串

函数参数

*s :字符串指针

返回值

所属文件

GUI_DispString.C

示例:

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

6.6 指定坐标显示文本

函数原型

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

函数功能

在指定坐标显示文本-字符串

函数参数

*s :字符串指针

X:横坐标

Y:纵坐标

返回值

所属文件

GUI_DispStringAt.c

示例:

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

6.7 显示文本API函数集合

函 数

说 明

GUI_DispChar()

在当前坐标显示单个字符

GUI_DispCharAt()

在指定坐标显示单个字符

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

设置当前X坐标

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

要是使用时,需要将宏开关打开:

完整资料包下载: https://download.csdn.net/download/xiaolong1126626497/24238463

审核编辑:符乾江

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • STM32
    +关注

    关注

    2270

    文章

    10895

    浏览量

    355744
  • ucguibuilder
    +关注

    关注

    0

    文章

    2

    浏览量

    6092
收藏 人收藏

    评论

    相关推荐

    SSM框架源码解析与理解

    SSM框架(Spring + Spring MVC + MyBatis)是一种在Java开发中常用的轻量级企业级应用框架。它通过整合Spring、Spring MVC和MyBatis三个框架,实现了
    的头像 发表于 12-17 09:20 172次阅读

    DRV8821-23 EVM图形用户界面

    电子发烧友网站提供《DRV8821-23 EVM图形用户界面.pdf》资料免费下载
    发表于 12-05 15:08 0次下载
    DRV8821-23 EVM<b class='flag-5'>图形</b>用户<b class='flag-5'>界面</b>

    DRV8800-01 EVM图形用户界面

    电子发烧友网站提供《DRV8800-01 EVM图形用户界面.pdf》资料免费下载
    发表于 12-02 11:07 0次下载
    DRV8800-01 EVM<b class='flag-5'>图形</b>用户<b class='flag-5'>界面</b>

    STM32项目实战:基于STM32U5的火灾报警系统(LVGL),附项目教程/源码

    《火灾报警系统_STM32U5》项目完整文档、项目源码,点击下方链接免费领取。项目资料领取https://s.c1ns.cn/F5XyUSTM32项目实战之“火灾报警系统”(基于STM32
    的头像 发表于 11-13 14:18 562次阅读
    <b class='flag-5'>STM32</b>项目实战:基于<b class='flag-5'>STM32</b>U5的火灾报警系统(LVGL),附项目教程/<b class='flag-5'>源码</b>

    图形用户界面与命令行接口的比较

    在计算机科学和信息技术领域,用户与计算机交互的方式主要分为两种:图形用户界面(GUI)和命令行接口(CLI)。这两种界面各有优势和局限性,适用于不同的场景和用户需求。 1. 定义与基本特征
    的头像 发表于 11-12 14:38 322次阅读

    基于机智云移植STM32L496G代码移植

    前言最近我拿到了STM32L496AGMCU,发现其扩展版可以连接ESP-01S。我想尝试将开发板连接到我们的机智云上,并根据机智云提供的文档进行程序移植STM32CubeMX移植
    的头像 发表于 09-20 08:05 396次阅读
    基于机智云<b class='flag-5'>移植</b><b class='flag-5'>STM32</b>L496G代码<b class='flag-5'>移植</b>

    UCGUI单片机源码

    UCGUI单片机源码
    发表于 07-04 17:11 1次下载

    用git还是用图形界面安装idf-tools总是失败,这是什么问题?

    无论是用git还是用图形界面安装idf-tools总是失败,这是什么问题?
    发表于 06-19 07:03

    上位机控制界面用什么做好

    在设计上位机控制界面时,选择合适的开发工具和框架至关重要。本文介绍如何创建一个优秀的上位机控制界面。 引言 上位机控制界面是实现人机交互的关键环节,它允许用户通过
    的头像 发表于 06-06 10:54 914次阅读

    STM32F4的裸机源码可以移植到linux ARM上运行吗? 具体需要怎么实现呢?

    STM32F4的裸机源码可以移植到linux ARM开发板上运行吗? 具体需要怎么实现呢?
    发表于 03-20 07:00

    兆易创新与SEGGER联合提供免费商用的emWin图形界面解决方案

    合作,为使用GD32系列Arm® Cortex®-M微控制器的广大用户提供免费商用的emWin嵌入式GUI(图形用户界面)以及屡获殊荣的AppWizard工具。这一举措旨在加速高性能GUI应用的开发与落地,进一步推动工业控制和智能物联网领域的技术进步。
    的头像 发表于 03-16 09:59 1007次阅读

    OpenHarmony4.0源码解析之媒体框架

    及 audio-source 插件调用音频框架的播放及采集功能来实现音频的播放与录制;通过 surface-sink 调用图形框架,video-decoder 调用解码驱动模
    的头像 发表于 02-26 22:05 906次阅读
    OpenHarmony4.0<b class='flag-5'>源码</b>解析之媒体<b class='flag-5'>框架</b>

    stm32必须要移植系统吗

    电子等。在使用STM32进行开发时,是否需要进行系统移植是一个常见的问题。 系统移植是指将操作系统或者驱动程序从一个硬件平台移植到另一个硬件平台的过程。由于不同的硬件平台可能存在差异,
    的头像 发表于 01-08 14:17 864次阅读

    如何移植爱星云的源码

    上次已经给大家讲了如何搭建中间件SDK(Ai-WB2-12F使用安信可中间件接入爱星云,远程点个灯——第一篇)。经过上次的帖子,小伙伴们想必已经完成一个新项目的添加,并使用WB2编译成功,今天讲如何移植爱星云的源码。 在正式开始之前,先介绍一下设备上云的流程。
    的头像 发表于 01-07 11:10 603次阅读
    如何<b class='flag-5'>移植</b>爱星云的<b class='flag-5'>源码</b>

    stm32移植ucos iii教程

    µC/OS-III是一个实时操作系统,广泛应用于嵌入式系统开发中。在STM32系列微控制器上移植µC/OS-III可以充分发挥其实时性和多任务处理能力。本篇文章将为您提供一个详实、细致的STM32
    的头像 发表于 01-02 16:29 1498次阅读