ZLGGUI 是一個輕量級的GUI 系統,適合於單色、彩色屏幕,對CPU要求不高,並且占用資源少,很合適簡單的單色OLED使用,下面
來講解ZLGGUI的代碼移植。本次測試使用的OLED 是128*64的屏。
1、ZLG代碼文件
基本圖形操作函數 —— GUI_BASE.C
顯示顏色管理函數 —— GUI_STOCKC.C
顏色轉換操作函數 —— CONVERTCOLOR.C
5×7ASCII 碼字庫及顯示函數 —— FONT5_7.C
8×8ASCII 碼字庫及顯示函數 —— FONT8_8.C
24×32 數字庫及顯示函數 —— FONT24_32.C
單色圖形及漢字顯示函數 —— LOADBIT.C
圖標菜單 下拉菜單操作函數 —— MENU.C
窗口操作函數 —— WINDOW.C
重要文件說明如下:
CONFIG.H 用於聲明常用宏包含所有項目所用的頭文件(方便項目的管理)
GUI_CONFIG.H 用於配置ZLG/GUI (用於裁剪ZLG/GUI)
FONT_MACRO.H 定義字節點陣宏(用於定義字體點陣數據)
主要硬件驅動層接口函數 LCDDRIVE.C
修改該文件與OLED驅動函數配合即可移植成功,下面講解LCDDRIVE.C。
2、驅動函數接口
先看代碼
#include "config.h"
#include "oled_sh1106.h"
/****************************************************************************
* 名稱:GUI_Initialize()
* 功能:初始化GUI,包括初始化顯示緩沖區,初始化LCM並清屏。
* 入口參數:無
* 出口參數:無
* 說明:用戶根據LCM的實際情況編寫此函數。
****************************************************************************/
void GUI_Initialize(void)
{
//LCD_Init(); // 初始化液晶屏
OLED_Init();
}
/****************************************************************************
* 名稱:GUI_FillSCR()
* 功能:全屏填充。直接使用數據填充顯示緩沖區。
* 入口參數:dat 填充的數據
* 出口參數:無
* 說明:用戶根據LCM的實際情況編寫此函數。
****************************************************************************/
void GUI_FillSCR(TCOLOR dat)
{
//LCD_Clear(dat);
OLED_Fill(0,0,127,64,1);
}
/****************************************************************************
* 名稱:GUI_ClearSCR()
* 功能:清屏。
* 入口參數:無
* 出口參數:無
* 說明:用戶根據LCM的實際情況編寫此函數。
****************************************************************************/
void GUI_ClearSCR()
{
//LCD_Clear(WHITE); // 清屏
OLED_Clear();
}
/****************************************************************************
* 名稱:GUI_Point()
* 功能:在指定位置上畫點。
* 入口參數: x 指定點所在列的位置
* y 指定點所在行的位置
* color 顯示顏色(對於黑白色LCM,為0時滅,為1時顯示)
* 出口參數:返回值為1時表示操作成功,為0時表示操作失敗。(操作失敗原因是指定地址超出有
* 效范圍)
* 說明:用戶根據LCM的實際情況編寫此函數。
****************************************************************************/
void GUI_Point(uint16 x, uint8 y, TCOLOR color)
{
//LCD_Fast_DrawPoint(x,y,color);
OLED_DrawPoint(x,y,color);
}
/****************************************************************************
* 名稱:GUI_ReadPoint()
* 功能:讀取指定點的顏色。
* 入口參數:x 指定點所在列的位置
* y 指定點所在行的位置
* ret 保存顏色值的指針
* 出口參數:返回0表示指定地址超出緩沖區范圍
* 說明:對於單色,設置ret的d0位為1或0,4級灰度則為d0、d1有效,8位RGB則d0--d7有效,
* RGB結構則R、G、B變量有效。
****************************************************************************/
uint8 GUI_ReadPoint(uint16 x, uint8 y, TCOLOR *ret)
{
//*ret = LCD_ReadPoint(x, y);
return 0;
}
/****************************************************************************
* 名稱:GUI_HLine()
* 功能:畫水平線。
* 入口參數: x0 水平線起點所在列的位置
* y0 水平線起點所在行的位置
* x1 水平線終點所在列的位置
* color 顯示顏色(對於黑白色LCM,為0時滅,為1時顯示)
* 出口參數:無
* 說明:對於單色、4級灰度的液晶,可通過修改此函數作圖提高速度,如單色LCM,可以一次更
* 新8個點,而不需要一個點一個點的寫到LCM中。
****************************************************************************/
void GUI_HLine(uint16 x0, uint8 y0, uint16 x1, TCOLOR color)
{
uint8 temp;
if(x0>x1) // 對x0、x1大小進行排列,以便畫圖
{
temp = x1;
x1 = x0;
x0 = temp;
}
do
{
GUI_Point(x0, y0, color); // 逐點顯示,描出垂直線
x0++;
}
while(x1>=x0);
}
/****************************************************************************
* 名稱:GUI_RLine()
* 功能:畫垂直線。
* 入口參數: x0 垂直線起點所在列的位置
* y0 垂直線起點所在行的位置
* y1 垂直線終點所在行的位置
* color 顯示顏色
* 出口參數:無
* 說明:對於單色、4級灰度的液晶,可通過修改此函數作圖提高速度,如單色LCM,可以一次更
* 新8個點,而不需要一個點一個點的寫到LCM中。
****************************************************************************/
void GUI_RLine(uint16 x0, uint8 y0, uint8 y1, TCOLOR color)
{
uint8 temp;
if(y0>y1) // 對y0、y1大小進行排列,以便畫圖
{
temp = y1;
y1 = y0;
y0 = temp;
}
do
{
GUI_Point(x0, y0, color); // 逐點顯示,描出垂直線
y0++;
}
while(y1>=y0);
}
/****************************************************************************
* 名稱:GUI_Exec()
* 功能:刷新屏幕
*
*
*
*
*
****************************************************************************/
void GUI_Exec(void)
{
OLED_Refresh_Gram();
}
以上主要修改了函數
void GUI_Initialize(void)
void GUI_FillSCR(TCOLOR dat)
void GUI_Point(uint16 x, uint8 y, TCOLOR color)
uint8 GUI_ReadPoint(uint16 x, uint8 y, TCOLOR *ret)
void GUI_Exec(void)
根據使用OLED的不同,將對應的OLED驅動函數對應上接口。
3、功能調用。
測試移植
/* USER CODE BEGIN Includes */
#include "config.h"
/* USER CODE END Includes */
/* USER CODE BEGIN 2 */
GUI_Initialize(); //ZLG GUI
GUI_SetColor(1,0);
/* USER CODE END 2 */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
///周立功GUI
GUI_PutString(40, 50, "ABCDEF"); //字符串
uint8 const charfontT[]={
0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0xFF,0xFE,0x01,0x00,0x01,0x00,
0x02,0x80,0x02,0x80,0x04,0x40,0x04,0x40,0x0A,0x20,0x11,0x10,0x21,0x08,0xC0,0x06,
};
uint8 const charfontT2[]={
0x00,0x00,0x7C,0x00,0x45,0xFC,0x49,0x04,0x49,0x04,0x51,0x04,0x49,0x04,0x49,0x04,
0x45,0xFC,0x45,0x04,0x45,0x04,0x69,0x04,0x51,0x04,0x41,0x04,0x41,0xFC,0x41,0x04
};
GUI_PutHZ(60,0,(uint8 *)charfontT,16,16);
GUI_LoadPic(73,0,(uint8 *)charfontT2,16,16); //函數執行方式是逐行的,所以字符也需要逐行的數組
GUI_Exec();
}
效果圖:

4、字幕數組分析
先了解字符是按什么順序計算的。


所以逐行方式的“太” 計算出來的16*16像素的數組是:
0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0xFF,0xFE,0x01,0x00,0x01,0x00,
0x02,0x80,0x02,0x80,0x04,0x40,0x04,0x40,0x0A,0x20,0x11,0x10,0x21,0x08,0xC0,0x06,
顯示漢字時,導入顯示即可。如果需要顯示圖片,也是采用同樣的方式導入BMP圖片設置像素行和列的大小后取模。
注意;需要將BMP格式的圖片轉換為位圖,軟件可以用Photoshop之類的進行圖片處理。
