zoukankan      html  css  js  c++  java
  • 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之类的进行图片处理。

      

  • 相关阅读:
    Android基础
    Android基础
    Java小项目——多线程弹球
    Java小项目——抽奖系统
    Java小项目——五子棋
    Java小项目——画板
    Java基础——swing登录界面
    Java基础——类的继承
    实验室资料说明
    20180919 百信、百度面试
  • 原文地址:https://www.cnblogs.com/siyun/p/14903416.html
Copyright © 2011-2022 走看看