0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

基于STM32移植UCGUI圖形界面框架(3.9.0源碼)

DS小龍哥-嵌入式技術 ? 來源:DS小龍哥-嵌入式技術 ? 作者:DS小龍哥-嵌入式技 ? 2022-02-28 13:26 ? 次閱讀

?

一、環(huán)境介紹

keil: 5.25

MCU: STM32F103ZET6

UCGUI版本: 3.90(純源碼版本)

3.9.0是源碼版本,可以看到全部源碼,也方便學習;后續(xù)的版本都是提供lib庫文件,不再提供源碼了。

2.1 UCGUI

μC/GUI 是一種用于嵌入式應用的圖形支持軟件。它被設計用于為任何使用一個圖形 LCD的應用提供一個有效的不依賴于處理器和 LCD 控制器的圖形用戶接口。它能工作于單任務或多任務的系統(tǒng)環(huán)境下。 μC/GUI 適用于使用任何 LCD 控制和 CPU 的任何尺寸的物理和虛擬顯示。它的設計是模塊化的,由在不同的模塊中的不同的層組成。一個層,稱作 LCD 驅動程序,包含了對 LCD 的全部訪問。 μC/GUI 適用于所有的 CPU,因為它 100%由的 ANSI 的 C 語言編寫的。
μC/GUI 很適合大多數(shù)的使用黑色/白色和彩色 LCD 的應用程序。 它有一個很好的顏色管理器,允許它處理灰階。 μC/GUI 也提供一個可擴展的 2D 圖形庫和一個視窗管理器,在使用一個最小的 RAM 時能支持顯示窗口。

UCGUI官網(wǎng)地址: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----------操作系統(tǒng)接口函數(shù)定義文件

GUI源代碼文件:

1)AntiAlias:抗鋸齒顯示效果支持。

2)ConvertColor:彩色顯示的色彩轉換支持。

3)ConvertMono:(b/w)和灰度顯示的色彩轉換支持。

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

5)Font:字庫。

6)JPEG:圖片操作函數(shù)。

7)LCDDriver:LCD驅動支持。

8)MemDev:內存設備支持。主要功能是防止在項目重疊時觸摸屏的閃爍。

9)Widget:窗體控件庫。

10)WM:窗口管理庫。

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

WM(窗口管理器)的支持;使用控件時,需要將相應的頭文件包含進去,比如我們需要使用按鈕BUTTON,那么我們需要先包含BUTTON.h頭文件,否則控件即使支持也不可用。

二、移植步驟

移植準備工作

  1. 一個塊STM32開發(fā)板
  2. 一個完好的LCD顯示屏
  3. 一個完整的基于開發(fā)板的KEIL工程(包含完整的LCD驅動代碼)
  4. 一個完整的UCGUI 3.9源碼包

2.1 創(chuàng)建文件夾

首先在KEIL工程目錄下創(chuàng)建一個UCGUI的文件夾,用來存放移植需要用到的源碼文件。

效果圖:

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

?

2.2 拷貝源碼文件

GUI_V3.9_官方源碼\uCGUI3.90版源碼\Start路徑下的Config文件夾和GUI文件拷貝到剛才在KEIL工程目錄下創(chuàng)建的UCGUI文件夾里。

效果圖:

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

?

GUI_V3.9_官方源碼\uCGUI3.90版源碼\Sample路徑下的GUI_X文件夾拷貝到剛才在KEIL工程目錄下創(chuàng)建的UCGUI文件夾里。(GUI_X文件夾是操作系統(tǒng)的接口

效果圖:

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

?

2.3 創(chuàng)建UCGUI工程

打開KEIL工程,添加UCGUI源代碼。

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

?

根據(jù) UCGUI\GUI 目錄下的文件創(chuàng)建KEIL的工程目錄,名字最好用源碼默認的名字不要修改,以防止后面查找不方便。額外再添加創(chuàng)建一個UCGUI_Config目錄,用來存放UCGUI的配置文件創(chuàng)建好的工程目錄—效果圖:

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

?

2.4 添加UCGUI源文件

工程創(chuàng)建OK之后,將對應源文件添加到KEIL工程目錄下,將對應的頭文件加入工程。

效果圖:

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

?

添加的源文件和頭文件需要對照GUI文件夾逐個添加,不能漏掉文件。

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

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

UCGUI\GUI_X\GUI_X.c          //OS系統(tǒng)接口
UCGUI\Config\GUITouchConf.h   //配置觸摸屏
UCGUI\Config\ GUIConf.h       //配置GUI
UCGUI\Config\ LCDConf.h       //配置LCD顯示屏參數(shù)
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 顏色位數(shù)*/
#define LCD_SWAP_RB (1)        /*紅藍反色交換*/
#define LCD_INIT_CONTROLLER() LCD9341_Init (); 
/*底層初始化函數(shù),自己寫的,而非源碼自帶,這一步非常重要*/
#endif /* LCDCONF_H */
poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

因為我們有LCD的驅動,不需要UCGUI的LCD驅動配置。

其中:LCD9341_Init (); 函數(shù)是我們自己工程的LCD初始化函數(shù)。我們的LCD初始化函數(shù)名字不能是LCD_Init(),因為UCGUI自帶的LCD初始化函數(shù)也是這個名字,我們自己的工程里也不能出現(xiàn)LCD名字的結構體。不然,會出現(xiàn)重定義的錯誤。

修改UCGUI配置文件,打開GUIConf.h文件,修改成下面的代碼:

#ifndef GUICONF_H
#define GUICONF_H

#define GUI_OS                     (0)  /* 系統(tǒng)支持 */
#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底層的畫點函數(shù)和讀點函數(shù)。

先在LCDDummy.c里加入LCD頭文件。并且定義使用自己的LCD驅動。

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

?

添加畫點函數(shù)

該函數(shù)在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); //添加畫點函數(shù)
  }
}
poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

添加讀點函數(shù)

該函數(shù)在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);  //添加讀點函數(shù)
  }
  return PixelIndex;
}
poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

2.7 編譯工程

文件修改完畢之后,回到主函數(shù),添加#include "GUI.h"頭文件。

并在主函數(shù)里加入下面的代碼,測試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

?

編譯成功之后,將代碼下載到開發(fā)板運行。

效果如圖:

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

?

2.8 編譯錯誤解決辦法

如果編譯出現(xiàn)下面的錯誤:

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

根據(jù)錯誤提示,打開jerror.c文件,找到error_exit函數(shù),將該函數(shù)的最后一行代碼exit(EXIT_FAILURE); 該為return 。改完,再次編譯,錯誤解決。

效果圖:

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

?

方法:

  1. 查找自己原來的工程里是否有以LCD命名的相關結構體,
  2. 查看原來工程里的LCD初始化函數(shù)是否是LCD_Init(), 如果是,就修改函數(shù)名字。

一般解決了上述的問題,移植一般都沒有問題。出現(xiàn)了問題,可以查看錯誤信息,判斷是什么錯誤,針對性解決。

三、加入觸摸屏

加入觸摸屏功能之前,要保證原本工程已經有正常的觸摸屏驅動代碼,能正確的轉換觸摸屏的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 添加初始化函數(shù)

上邊步驟完成之后,在主函數(shù)添加(自己工程的)觸摸屏的初始化函數(shù),觸摸屏即可正常運行。

3.5 輪詢檢測觸摸屏

如果GUI沒有加入系統(tǒng),需要定義一個定時器去掃描觸摸屏,在定時器的中斷服務函數(shù)里加入GUI_TOUCH_Exec();函數(shù)。掃描的頻率為:10毫秒一次

如果GUI加入了系統(tǒng),可以創(chuàng)建一個單獨的任務,在任務里添加GUI_TOUCH_Exec();

第四章 加入UCOSII系統(tǒng)

4.1 移植準備步驟

本小節(jié)的的移植是基于UCOSII系統(tǒng)的移植

移植系統(tǒng)之前的準備工作:

  1. 一份UCOSII源碼
  2. 熟悉UCOSII的基本操作(創(chuàng)建工程和任務編寫)

打開GUIConf.h文件,修改當前GUI支持系統(tǒng)

#define GUI_OS (1) /* 系統(tǒng)支持 */
poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

效果圖:

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

?

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

添加相關頭文件路徑效果圖:

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

?

4.3 添加UCOSII源碼到工程目錄

效果圖:

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

?

注意:加載源碼的時候,不能將ucos_ii.c加入到工程。加入了ucos_ii.c文件會出現(xiàn)重定義。

ucos_ii.c的代碼作用是加載源文件,因為UCOSII其他源文件我們已手動加入到工程,已不需要ucos_ii.c的代碼”。

4.4 設置UCOSII任務調度時間基準

初始化滴答時鐘,開啟滴答時鐘中斷,設置滴答時鐘10毫秒中斷一次。

(用任何一個硬件定時器都可以代替)

在滴答時鐘中斷服務函數(shù)里加入下面的代碼:

(記得在滴答定時器中斷函數(shù)的代碼文件里引用UCOSII的頭文件:#include "includes.h" )

/*
滴答時鐘中斷服務函數(shù)
*/
void SysTick_Handler(void)
{
	   OSIntEnter();		   //進入中斷
    OSTimeTick();       //調用ucos的時鐘服務程序               
    OSIntExit();         //觸發(fā)任務切換軟中斷
}
poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

效果圖:

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

?

4.5 修改錯誤與正確的宏

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

?

4.6 添加UCOS支持文件

在進行上邊的步驟,之后,編譯工程,會出現(xiàn)如下的錯誤:

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

根據(jù)報錯提示信息,打開GUITask.c 文件。GUITask.c有提示需要在GUI_X.c文件實現(xiàn)幾個函數(shù)。

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

?

根據(jù)提示,繼續(xù)打開GUI_X.C 。前邊有提到,GUI_X.C文件主要是提供OS系統(tǒng)接口,配置/系統(tǒng)相關的外部環(huán)境。

效果圖:

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

?

我們當前移植的OS是UCOSII系統(tǒng),打開KEIL工程路徑下的GUI_X文件夾:

效果圖:

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

?

該目錄下有6個與系統(tǒng)接口相關的文件,我們移植的是UCOS系統(tǒng),其中GUI_X_uCOS.c文件是UCOSII系統(tǒng)的接口。我們將GUI_X_uCOS.c文件加入到工程

效果圖:

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

?

將GUI_X.C文件的三個底層函數(shù)拷貝一份到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文件實現(xiàn)的函數(shù)有很多是相同的,不卸載GUI_X.c會出現(xiàn)重定義的錯誤。

接著修改GUI_X_uCOS.c文件,替換UCOS的延時函數(shù)。(大約在78行)。

void GUI_X_ExecIdle (void) 
{
    //OS_X_Delay(1);
	OSTimeDly(50);  //UCOS延時函數(shù)
}
poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

效果圖:

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

?

4.7 建立任務測試效果

//開始任務
void start_task(void *pdata)
{
  OS_CPU_SR cpu_sr=0;
	pdata = pdata; 
  OS_ENTER_CRITICAL();			      //進入臨界區(qū)(無法被中斷打斷)    
 	OSTaskCreate(led0_task,(void *)0,(OS_STK*)&LED0_TASK_STK[LED0_STK_SIZE-1],LED0_TASK_PRIO);	//創(chuàng)建的任務					   
 	OSTaskCreate(led1_task,(void *)0,(OS_STK*)&LED1_TASK_STK[LED1_STK_SIZE-1],LED1_TASK_PRIO);	 				   
	OSTaskSuspend(START_TASK_PRIO);	//掛起起始任務.
	OS_EXIT_CRITICAL();			        //退出臨界區(qū)(可以被中斷打斷)
}


//LED0任務
void led0_task(void *pdata)
{	 	
	u8 i;
	u16 cnt=0;
	/***************************************
	畫一個進度條控件	
	****************************************/

  hProgBar_1 = PROGBAR_Create(0, 0, 240, 40, WM_CF_SHOW); //設置進度條的大小坐標參數(shù)
	PROGBAR_SetBarColor(hProgBar_1,0,GUI_GREEN); //參數(shù)(句柄,1(0)代表本函數(shù)是顯示進度條覆蓋的區(qū)域還未覆蓋的區(qū)域,進度條覆蓋的顏色)
  PROGBAR_SetBarColor(hProgBar_1,1,GUI_RED);   //參數(shù)(句柄,1(0)代表本函數(shù)是顯示進度條覆蓋的區(qū)域還未覆蓋的區(qū)域,進度條未覆蓋的顏色)
  PROGBAR_SetValue(hProgBar_1,99);             //參數(shù)(句柄 ,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); //設置進度條的大小坐標參數(shù)
	PROGBAR_SetBarColor(hProgBar_2,0,GUI_GREEN); //參數(shù)(句柄,1(0)代表本函數(shù)是顯示進度條覆蓋的區(qū)域還未覆蓋的區(qū)域,進度條覆蓋的顏色)
  PROGBAR_SetBarColor(hProgBar_2,1,GUI_RED);   //參數(shù)(句柄,1(0)代表本函數(shù)是顯示進度條覆蓋的區(qū)域還未覆蓋的區(qū)域,進度條未覆蓋的顏色)

	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();			 //監(jiān)視和刷新觸摸板		
		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

系統(tǒng)時間計算

如果跑UCOS系統(tǒng)可以設置UCOS工作頻率高一些: #define OS_TICKS_PER_SEC 1000 //一秒的節(jié)拍時間。

節(jié)拍時間計算方式:滴答時鐘中斷時間 * 節(jié)拍次數(shù) = 1秒

第六章 常用相關函數(shù)解析

6.1 初始化函數(shù)

函數(shù)原型

GUI_Init();

函數(shù)功能

初始化GUI的內部數(shù)據(jù)結構和變量,使用GUI任何功能之前必須調用本函數(shù)

函數(shù)參數(shù)

返回值

6.2 設置XY坐標

函數(shù)原型

GUI_GotoXY(int x, int y)

函數(shù)功能

設置當前的XY坐標

函數(shù)參數(shù)

X :橫坐標 Y:縱坐標

返回值

成功返回0

相關函數(shù)

GUI_GotoX() 設置當前X坐標

GUI_GotoY() 設置當前Y坐標

6.3 設置LCD背景顏色

函數(shù)原型

void GUI_SetBkColor(GUI_COLOR color)

函數(shù)功能

設置LCD背景顏色

函數(shù)參數(shù)

Color:顏色值

返回值

6.4 設置LCD前景顏色

函數(shù)原型

void GUI_SetColor(GUI_COLOR color)

函數(shù)功能

設置LCD前景顏色

函數(shù)參數(shù)

Color:顏色值

返回值

所屬文件

GUI_SetColor.c

6.5 在當前坐標顯示文本

函數(shù)原型

void GUI_DispString(const char GUI_UNI_PTR *s)

函數(shù)功能

在當前坐標顯示文本-字符串

函數(shù)參數(shù)

*s :字符串指針

返回值

所屬文件

GUI_DispString.C

示例:

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

6.6 指定坐標顯示文本

函數(shù)原型

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

函數(shù)功能

在指定坐標顯示文本-字符串

函數(shù)參數(shù)

*s :字符串指針

X:橫坐標

Y:縱坐標

返回值

所屬文件

GUI_DispStringAt.c

示例:

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

6.7 顯示文本API函數(shù)集合

函 數(shù)

說 明

GUI_DispChar()

在當前坐標顯示單個字符

GUI_DispCharAt()

在指定坐標顯示單個字符

GUI_DispChars()

按指定重復次數(shù)顯示一個字符

GUI_DispChars()

在當前坐標顯示字符串

GUI_DispStringAt()

在指定坐標顯示字符串

GUI_DispStringAtCEOL()

在指定坐標顯示字符串,并清除到行末

GUI_DispStringInRect()

在指定矩形區(qū)域內顯示字符串

GUI_DispStringLen()

在當前坐標顯示指定字符數(shù)量的字符串

6.8 選擇文本繪圖模式

函數(shù)

功能

GUI_SetTextMode();

設置文本繪圖模式

6.9 選擇文本對齊方式

函數(shù)

功能

GUI_GetTextAlign()

返回當前文本對齊模式

GUI_SetLBorder()

設置換行后的左邊界

GUI_ SetTextAlign()

設置文本對齊模式

6.10 設置當前文本坐標

函數(shù)

功能

GUI_GotoX()

設置當前X坐標

GUI_GotoXY()

設置當前YX坐標

GUI_GotoY()

設置當前Y坐標

6.11 返回當前文本坐標

函數(shù)

功能

GUI_GetDispPosX()

返回當前X坐標

GUI_GetDispPosY()

返回當前Y坐標

6.12 清除視窗相關函數(shù)

函數(shù)

功能

GUI_Clear()

清除活動視窗(如果背景是活動視窗,則是清除整個屏幕)

GUI_DispCEOL()

清除從當前坐標到行末的顯示內容

第七章 儲存設備

默認情形下,存儲設備是被激活的。為了優(yōu)化軟件的性能,對存儲設備的支持可以在配
置文件 GUIConf.h 中加入下面一行而關閉:
#define GUI_SUPPORT_MEMDEV 0

要是使用時,需要將宏開關打開:

完整資料包下載: https://download.csdn.net/download/xiaolong1126626497/24238463

審核編輯:符乾江

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • STM32
    +關注

    關注

    2264

    文章

    10854

    瀏覽量

    354313
  • ucguibuilder
    +關注

    關注

    0

    文章

    2

    瀏覽量

    6084
收藏 人收藏

    評論

    相關推薦

    基于機智云移植STM32L496G代碼移植

    前言最近我拿到了STM32L496AGMCU,發(fā)現(xiàn)其擴展版可以連接ESP-01S。我想嘗試將開發(fā)板連接到我們的機智云上,并根據(jù)機智云提供的文檔進行程序移植。STM32CubeMX移植
    的頭像 發(fā)表于 09-20 08:05 ?280次閱讀
    基于機智云<b class='flag-5'>移植</b><b class='flag-5'>STM32</b>L496G代碼<b class='flag-5'>移植</b>

    UCGUI單片機源碼

    UCGUI單片機源碼
    發(fā)表于 07-04 17:11 ?0次下載

    用git還是用圖形界面安裝idf-tools總是失敗,這是什么問題?

    無論是用git還是用圖形界面安裝idf-tools總是失敗,這是什么問題?
    發(fā)表于 06-19 07:03

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

    在設計上位機控制界面時,選擇合適的開發(fā)工具和框架至關重要。本文介紹如何創(chuàng)建一個優(yōu)秀的上位機控制界面。 引言 上位機控制界面是實現(xiàn)人機交互的關鍵環(huán)節(jié),它允許用戶通過
    的頭像 發(fā)表于 06-06 10:54 ?802次閱讀

    STM32F4的裸機源碼可以移植到linux ARM上運行嗎? 具體需要怎么實現(xiàn)呢?

    STM32F4的裸機源碼可以移植到linux ARM開發(fā)板上運行嗎? 具體需要怎么實現(xiàn)呢?
    發(fā)表于 03-20 07:00

    兆易創(chuàng)新與SEGGER聯(lián)合提供免費商用的emWin圖形界面解決方案

    合作,為使用GD32系列Arm? Cortex?-M微控制器的廣大用戶提供免費商用的emWin嵌入式GUI(圖形用戶界面)以及屢獲殊榮的AppWizard工具。這一舉措旨在加速高性能GUI應用的開發(fā)與落地,進一步推動工業(yè)控制和智能物聯(lián)網(wǎng)領域的技術進步。
    的頭像 發(fā)表于 03-16 09:59 ?886次閱讀

    stm32必須要移植系統(tǒng)嗎

    電子等。在使用STM32進行開發(fā)時,是否需要進行系統(tǒng)移植是一個常見的問題。 系統(tǒng)移植是指將操作系統(tǒng)或者驅動程序從一個硬件平臺移植到另一個硬件平臺的過程。由于不同的硬件平臺可能存在差異,
    的頭像 發(fā)表于 01-08 14:17 ?799次閱讀

    如何移植愛星云的源碼

    上次已經給大家講了如何搭建中間件SDK(Ai-WB2-12F使用安信可中間件接入愛星云,遠程點個燈——第一篇)。經過上次的帖子,小伙伴們想必已經完成一個新項目的添加,并使用WB2編譯成功,今天講如何移植愛星云的源碼。 在正式開始之前,先介紹一下設備上云的流程。
    的頭像 發(fā)表于 01-07 11:10 ?564次閱讀
    如何<b class='flag-5'>移植</b>愛星云的<b class='flag-5'>源碼</b>

    stm32移植ucos iii教程

    μC/OS-III是一個實時操作系統(tǒng),廣泛應用于嵌入式系統(tǒng)開發(fā)中。在STM32系列微控制器上移植μC/OS-III可以充分發(fā)揮其實時性和多任務處理能力。本篇文章將為您提供一個詳實、細致的STM32
    的頭像 發(fā)表于 01-02 16:29 ?1324次閱讀

    圖形界面開發(fā)工具GUI Guider的使用教程

    GUI Guider是NXP推出的一款功能強大且對用戶非常友好的圖形界面開發(fā)工具。目前最新版本是1.6.1。
    的頭像 發(fā)表于 12-20 09:49 ?1.6w次閱讀
    <b class='flag-5'>圖形界面</b>開發(fā)工具GUI Guider的使用教程

    linux圖形界面設置ip

    在Linux系統(tǒng)中,可以使用圖形界面來設置IP地址。下面是一個詳實而細致的文章,將指導您如何通過圖形界面設置IP地址。 第一部分:進入網(wǎng)絡設置界面 打開Linux系統(tǒng)的“設置”應用程
    的頭像 發(fā)表于 11-27 15:19 ?3156次閱讀

    GUI圖形界面編程tkinter高級組件介紹

    大家好, 我是了不起, 歡迎收看我的冒險之旅。 今天我們將深入學習GUI圖形界面編程tkinter, 了解高級組件的使用方式。 tkinter高級組件 OptionMenu 選擇項
    的頭像 發(fā)表于 11-26 16:42 ?904次閱讀
    GUI<b class='flag-5'>圖形界面</b>編程tkinter高級組件介紹

    python窗口圖形界面編程

    Python是一種功能強大而又簡單易用的編程語言,支持多種編程范式,包括面向過程、面向對象和函數(shù)式編程。除了用于開發(fā)各種類型的應用程序和網(wǎng)絡服務,Python還提供了豐富的圖形用戶界面(GUI)編程
    的頭像 發(fā)表于 11-22 14:23 ?815次閱讀

    STM32移植而引發(fā)的兩個小疑問

    STM32用戶將基于STM32F0芯片的代碼移植STM32F4系列時遇到了些麻煩。其中有個問題跟中斷處理有關。有個中斷服務程序代碼在STM32
    的頭像 發(fā)表于 11-18 14:12 ?1076次閱讀
    因<b class='flag-5'>STM32</b><b class='flag-5'>移植</b>而引發(fā)的兩個小疑問

    RT-thread源碼移植STM32F10x和STM32F4xx

    RT-thread源碼移植STM32F10x和STM32F4xx: 一、源碼下載 點擊入門->下載 ? 在歷史版本里邊隨便選取一個 ? 會
    的頭像 發(fā)表于 11-15 09:38 ?2367次閱讀
    RT-thread<b class='flag-5'>源碼</b><b class='flag-5'>移植</b>到<b class='flag-5'>STM32</b>F10x和<b class='flag-5'>STM32</b>F4xx