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