STM32 ZLGGUI移植 驱动单色OLED

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

  

原文地址:https://www.cnblogs.com/siyun/p/14903416.html