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之类的进行图片处理。