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之類的進行圖片處理。

 

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM