一、環境介紹
keil: 5.25
MCU: STM32F103ZET6
UCGUI版本: 3.90(純原始碼版本)
3.9.0是原始碼版本,可以看到全部原始碼,也方便學習;后續的版本都是提供lib庫檔案,不再提供原始碼了,
基于STM32的STemwin移植教程可以看這里: https://blog.csdn.net/xiaolong1126626497/article/details/117933355
https://blog.csdn.net/xiaolong1126626497/article/details/117933355
二、UCGUI介紹
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

2.2 GUI相關檔案介紹

①.GUI/LCDDriver 檔案夾中存放的是一些 LCD 驅動代碼,如果你使用的 LCD 在
這里可以找到代碼,可以直接通過 Config 中的 LCDConfig.h :
#define LCD_CONTROLLER -1 // -1:表示沒有選擇的 LCD 驅動,而是使用里邊的樣本程式進行修改,
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頭檔案,否則控制元件即使支持也不可用,
二、移植步驟
移植準備作業:
- 一個塊STM32開發板
- 一個完好的LCD顯示屏
- 一個完整的基于開發板的KEIL工程(包含完整的LCD驅動代碼)
- 一個完整的UCGUI 3.9原始碼包
2.1 創建檔案夾
首先在KEIL工程目錄下創建一個UCGUI的檔案夾,用來存放移植需要用到的原始碼檔案,
效果圖:

2.2 拷貝原始碼檔案
將GUI_V3.9_官方原始碼\uCGUI3.90版原始碼\Start路徑下的Config檔案夾和GUI檔案拷貝到剛才在KEIL工程目錄下創建的UCGUI檔案夾里,
效果圖:

將GUI_V3.9_官方原始碼\uCGUI3.90版原始碼\Sample路徑下的GUI_X檔案夾拷貝到剛才在KEIL工程目錄下創建的UCGUI檔案夾里,(GUI_X檔案夾是作業系統的介面)
效果圖:

2.3 創建UCGUI工程
打開KEIL工程,添加UCGUI源代碼,

根據 UCGUI\GUI 目錄下的檔案創建KEIL的工程目錄,名字最好用原始碼默認的名字不要修改,以防止后面查找不方便,額外再添加創建一個UCGUI_Config目錄,用來存放UCGUI的組態檔創建好的工程目錄—效果圖:

2.4 添加UCGUI源檔案
工程創建OK之后,將對應源檔案添加到KEIL工程目錄下,將對應的頭檔案加入工程,
效果圖:

添加的源檔案和頭檔案需要對照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顯示屏引數
效果圖:

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 */
因為我們有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 */
初次移植,將不需要用到的配置全部關閉,等UCGU的基本操作熟悉之后再打開使用,
2.6 修改UCGUI底層驅動
打開LCDDummy.c檔案,添加UCGUI底層的畫點函式和讀點函式,
先在LCDDummy.c里加入LCD頭檔案,并且定義使用自己的LCD驅動,

添加畫點函式
該函式在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); //添加畫點函式
}
}
添加讀點函式
該函式在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;
}
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); //畫圓
代碼寫完,編譯工程,編譯時間1-10分鐘左右(電腦性能決定),
效果圖:

編譯成功之后,將代碼下載到開發板運行,
效果如圖:

2.8 編譯錯誤解決辦法
如果編譯出現下面的錯誤:
..\OBJ\KEY.axf: Error: L6218E: Undefined symbol exit (referred from jerror.o).
根據錯誤提示,打開jerror.c檔案,找到error_exit函式,將該函式的最后一行代碼exit(EXIT_FAILURE); 該為return ,改完,再次編譯,錯誤解決,
效果圖:

方法:
- 查找自己原來的工程里是否有以LCD命名的相關結構體,
- 查看原來工程里的LCD初始化函式是否是LCD_Init(), 如果是,就修改函式名字,
一般解決了上述的問題,移植一般都沒有問題,出現了問題,可以查看錯誤資訊,判斷是什么錯誤,針對性解決,
三、加入觸摸屏
加入觸摸屏功能之前,要保證原本工程已經有正常的觸摸屏驅動代碼,能正確的轉換觸摸屏的X Y坐標值,
3.1 打開GUIConf.h檔案,修改當前GUI支持觸摸屏
#define GUI_SUPPORT_TOUCH (1) /* 支持觸摸屏 */
#define GUI_ALLOC_SIZE 5000 //修改記憶體空間改大一點,防止編譯不過
效果圖:

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 */
效果圖:

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系統的移植
移植系統之前的準備作業:
- 一份UCOSII原始碼
- 熟悉UCOSII的基本操作(創建工程和任務撰寫)
打開GUIConf.h檔案,修改當前GUI支持系統
#define GUI_OS (1) /* 系統支持 */
效果圖:

4.2 在GUI.h加入UCOSII的頭檔案,
添加相關頭檔案路徑效果圖:

4.3 添加UCOSII原始碼到工程目錄
效果圖:

注意:加載原始碼的時候,不能將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(); //觸發任務切換軟中斷
}
效果圖:

4.5 修改錯誤與正確的宏

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
根據報錯提示資訊,打開GUITask.c 檔案,GUITask.c有提示需要在GUI_X.c檔案實作幾個函式,

根據提示,繼續打開GUI_X.C ,前邊有提到,GUI_X.C檔案主要是提供OS系統介面,配置/系統相關的外部環境,
效果圖:

我們當前移植的OS是UCOSII系統,打開KEIL工程路徑下的GUI_X檔案夾:
效果圖:

該目錄下有6個與系統介面相關的檔案,我們移植的是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行),
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;
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;
}
}
}
效果圖:

第五章 移植DEMO代碼

將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); //將一個任務延時若干時間(設定時、 分、 秒、 毫秒)
}
}
系統時間計算
如果跑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://www.uj5u.com/qita/302577.html
標籤:其他
上一篇:幾種典型的智慧農業物聯網解決方案
