为OLED屏添加GUI支持3:字库

Posted zhchoutai

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为OLED屏添加GUI支持3:字库相关的知识,希望对你有一定的参考价值。

为OLED屏添加GUI支持3:字库


本文博客链接:http://blog.csdn.net/jdh99,作者:jdh,转载请注明.

 

环境:

主机:WIN10

开发环境:MDK5.13

MCU:STM32F103


说明:
       GUI中有字库方能显示汉字。英文,数字等。英文数字等ASCII码128个字符保存显示easy。但汉字数万,假设不用字库芯片,用软件保存。则flash明显不够。所以仅仅加入须要显示的汉字。
       本GUI用的显示方法,能够easy的显示不同字体,不同字号的汉字和ASCII码。



源码及步骤:

1.用工具FontCvt.exe(emwin自带工具)选择须要的字体,字号。以及须要的字符(汉字。ASCII)并生成相应的.c文件


2.将此.c文件转换为指定格式。下面为微软雅黑20号字体的转换后源文件:

FHZ20.c

/**
* Copyright (c), 2015-2025
* @file FHZ20.c
* @brief 20号汉字字库,字体微软雅黑
* @author jdh
* @date 2015/9/6
* @date 2015/9/7
* @date 2015/9/9
*/

/*********************************************************************
*							头文件
**********************************************************************/

#include "font.h"

/*********************************************************************
*							静态变量
**********************************************************************/

/**
* @brief 字符:空
*/
  
unsigned char Hz20_0020[ 20] = { /* code 0020, SPACE */
  ________,
  ________,
  ________,
  ________,
  ________,
  ________,
  ________,
  ________,
  ________,
  ________,
  ________,
  ________,
  ________,
  ________,
  ________,
  ________,
  ________,
  ________,
  ________,
  ________};

unsigned char Hz20_002E[ 20] = { /* code 002E, FULL STOP */
  ________,
  ________,
  ________,
  ________,
  ________,
  ________,
  ________,
  ________,
  ________,
  ________,
  ________,
  ________,
  ________,
  ________,
  _XX_____,
  _XX_____,
  ________,
  ________,
  ________,
  ________};

unsigned char Hz20_0030[ 20] = { /* code 0030, DIGIT ZERO */
  ________,
  ________,
  ________,
  ________,
  ________,
  ___XXX__,
  __X__X__,
  _X____X_,
  _X____X_,
  _X____X_,
  _X____X_,
  _X____X_,
  _X____X_,
  _X____X_,
  __X__X__,
  __XXX___,
  ________,
  ________,
  ________,
  ________};

unsigned char Hz20_0031[ 20] = { /* code 0031, DIGIT ONE */
  ________,
  ________,
  ________,
  ________,
  ________,
  ____X___,
  __XXX___,
  _XX_X___,
  ____X___,
  ____X___,
  ____X___,
  ____X___,
  ____X___,
  ____X___,
  ____X___,
  ____X___,
  ________,
  ________,
  ________,
  ________};

unsigned char Hz20_0032[ 20] = { /* code 0032, DIGIT TWO */
  ________,
  ________,
  ________,
  ________,
  ________,
  __XXXX__,
  _X___XX_,
  ______X_,
  ______X_,
  ______X_,
  _____X__,
  ___XX___,
  __XX____,
  _XX_____,
  _X______,
  _XXXXXX_,
  ________,
  ________,
  ________,
  ________};

unsigned char Hz20_0033[ 20] = { /* code 0033, DIGIT THREE */
  ________,
  ________,
  ________,
  ________,
  ________,
  __XXX___,
  _X___X__,
  _____X__,
  _____X__,
  ____XX__,
  __XX____,
  ____XX__,
  _____X__,
  _____X__,
  _X__XX__,
  __XXX___,
  ________,
  ________,
  ________,
  ________};

unsigned char Hz20_0034[ 20] = { /* code 0034, DIGIT FOUR */
  ________,
  ________,
  ________,
  ________,
  ________,
  _____X__,
  ____XX__,
  ___XXX__,
  ___X_X__,
  __X__X__,
  _XX__X__,
  XX___X__,
  XXXXXXXX,
  _____X__,
  _____X__,
  _____X__,
  ________,
  ________,
  ________,
  ________};

unsigned char Hz20_0035[ 20] = { /* code 0035, DIGIT FIVE */
  ________,
  ________,
  ________,
  ________,
  ________,
  _XXXXX__,
  _X______,
  _X______,
  _X______,
  _X______,
  _XXXXX__,
  _____XX_,
  ______X_,
  ______X_,
  _____XX_,
  _XXXX___,
  ________,
  ________,
  ________,
  ________};

unsigned char Hz20_0036[ 20] = { /* code 0036, DIGIT SIX */
  ________,
  ________,
  ________,
  ________,
  ________,
  ___XXX__,
  __X_____,
  _X______,
  _X______,
  _X_XXX__,
  _XX__XX_,
  _X____X_,
  _X____X_,
  _X____X_,
  __X__X__,
  ___XXX__,
  ________,
  ________,
  ________,
  ________};

unsigned char Hz20_0037[ 20] = { /* code 0037, DIGIT SEVEN */
  ________,
  ________,
  ________,
  ________,
  ________,
  XXXXXXX_,
  _____X__,
  _____X__,
  ____X___,
  ____X___,
  ___X____,
  ___X____,
  ___X____,
  __X_____,
  __X_____,
  __X_____,
  ________,
  ________,
  ________,
  ________};

unsigned char Hz20_0038[ 20] = { /* code 0038, DIGIT EIGHT */
  ________,
  ________,
  ________,
  ________,
  ________,
  __XXXX__,
  _XX__XX_,
  _X____X_,
  _X____X_,
  __X__X__,
  __XXXX__,
  _XX__XX_,
  _X____X_,
  _X____X_,
  _XX__XX_,
  __XXXX__,
  ________,
  ________,
  ________,
  ________};

unsigned char Hz20_0039[ 20] = { /* code 0039, DIGIT NINE */
  ________,
  ________,
  ________,
  ________,
  ________,
  __XXXX__,
  __X__X__,
  _X____X_,
  _X____X_,
  _X____X_,
  _XX__XX_,
  __XXX_X_,
  ______X_,
  _____X__,
  __X__X__,
  __XXX___,
  ________,
  ________,
  ________,
  ________};

unsigned char Hz20_006D[ 40] = { /* code 006D, LATIN SMALL LETTER M */
  ________,________,
  ________,________,
  ________,________,
  ________,________,
  ________,________,
  ________,________,
  ________,________,
  ________,________,
  _X_XXX__,XXX_____,
  _XX__XXX,___X____,
  _X____X_,___X____,
  _X____X_,___X____,
  _X____X_,___X____,
  _X____X_,___X____,
  _X____X_,___X____,
  _X____X_,___X____,
  ________,________,
  ________,________,
  ________,________,
  ________,________};

unsigned char Hz20_CBD1[ 40] = { /* code 641C */
  ________,________,
  ________,________,
  ________,________,
  ________,________,
  ________,________,
  __X___XX,X_______,
  __X__XX_,XXXXX___,
  XXXXXX__,X___X___,
  __X__XXX,X_XXX___,
  __X__X__,X___X___,
  __XX_XXX,XXXXX___,
  _XXXX___,X_______,
  X_X__XXX,XXXX____,
  __X___X_,__XX____,
  __X____X,_XX_____,
  __X____X,XX______,
  XXX_XXX_,__XXXX__,
  ________,________,
  ________,________,
  ________,________};

unsigned char Hz20_CBF7[ 40] = { /* code 7D22 */
  ________,________,
  ________,________,
  ________,________,
  ________,________,
  ________,________,
  _______X,________,
  _XXXXXXX,XXXXX___,
  _______X,________,
  _XXXXXXX,XXXXX___,
  _X___X__,XX__X___,
  _X_XXXXX,X___X___,
  ______X_,_XX_____,
  ____XX__,__XX____,
  __XXXXXX,XXXXX___,
  ____X__X,_X______,
  __XX___X,__XX____,
  XX__XXXX,____X___,
  ________,________,
  ________,________,
  ________,________};

/**
* @brief 字符:正
*/
  
unsigned char Hz20_D5FD[ 40] = { /* code 6B63 */
  ________,________,
  ________,________,
  ________,________,
  ________,________,
  ________,________,
  _XXXXXXX,XXXXX___,
  _______X,________,
  _______X,________,
  __X____X,________,
  __X____X,________,
  __X____X,XXXXX___,
  __X____X,________,
  __X____X,________,
  __X____X,________,
  __X____X,________,
  __X____X,________,
  XXXXXXXX,XXXXXX__,
  ________,________,
  ________,________,
  ________,________};

/**
* @brief 字符:常
*/
  
unsigned char Hz20_B3A3[ 40] = { /* code 5E38 */
  ________,________,
  ________,________,
  ________,________,
  ________,________,
  ________,________,
  __XX__X_,__XX____,
  ___XX_X_,_XX_____,
  _XXXXXXX,XXXXX___,
  _X______,____X___,
  _X_XXXXX,XXX_X___,
  ___X____,__X_____,
  ___XXXXX,XXX_____,
  _______X,________,
  __XXXXXX,XXXX____,
  __X____X,___X____,
  __X____X,_XXX____,
  _______X,________,
  ________,________,
  ________,________,
  ________,________};

/**
* @brief 字符:超
*/
  
unsigned char Hz20_B3AC[ 40] = { /* code 8D85 */
  ________,________,
  ________,________,
  ________,________,
  ________,________,
  ________,________,
  ___X__XX,XXXXX___,
  ___X____,X___X___,
  XXXXXX__,X___X___,
  ___X___X,____X___,
  ___X__X_,_XXX____,
  XXXXXX__,________,
  ___X___X,XXXXX___,
  _X_X___X,____X___,
  _X_XXX_X,____X___,
  _X_X___X,XXXXX___,
  X_XX____,________,
  X__XXXXX,XXXXXX__,
  ________,________,
  ________,________,
  ________,________};

/**
* @brief 字符:距
*/

unsigned char Hz20_BEE0[ 40] = { /* code 8DDD */
  ________,________,
  ________,________,
  ________,________,
  ________,________,
  ________,________,
  _XXXX__X,XXXXXX__,
  _X__X__X,________,
  _X__X__X,________,
  _XXXX__X,________,
  _X_X___X,XXXXX___,
  ___X___X,____X___,
  _X_XXX_X,____X___,
  _X_X___X,XXXXX___,
  _X_X___X,____X___,
  _X_X___X,________,
  _X_XXX_X,________,
  XXX____X,XXXXXX__,
  ________,________,
  ________,________,
  ________,________};

/**
* @brief 字符:失
*/

unsigned char Hz20_CAA7[ 40] = { /* code 5931 */
  ________,________,
  ________,________,
  ________,________,
  ________,________,
  ________,________,
  ___X___X,________,
  ___X___X,________,
  __XXXXXX,XXXXX___,
  __X____X,________,
  _X_____X,________,
  _______X,________,
  _XXXXXXX,XXXXXX__,
  ______XX,________,
  ______X_,X_______,
  ____XX__,_X______,
  __XX____,__XX____,
  XX______,____XX__,
  ________,________,
  ________,________,
  ________,________};

/**
* @brief 字符:踪
*/
  
unsigned char Hz20_D7D9[ 40] = { /* code 8E2A */
  ________,________,
  ________,________,
  ________,________,
  ________,________,
  ________,________,
  _XXXX___,_XX_____,
  _X__X_XX,XXXXXX__,
  _X__X_X_,_____X__,
  _XXXX___,________,
  _X_X___X,XXXXX___,
  ___X____,________,
  _X_XX_XX,XXXXXX__,
  _X_X____,_X______,
  _X_X___X,_X_X____,
  _X_X__X_,_X__X___,
  XXX_XX__,_X___X__,
  _______X,XX______,
  ________,________,
  ________,________,
  ________,________};

/*********************************************************************
*							函数
**********************************************************************/

/**
* @brief 得到字体高度
* @param font:字体
* @retval 高度
*/

uint8_t GB18030_20X20_get_height(void)
{
	return 20;
}

/**
* @brief 得到地址
* @param font:字体
* @param ch:待读取的字符
* @param addr:数据存储地址
* @retval 读取结果.0:失败,1:成功
*/

uint8_t GB18030_20X20_get_address(uint16_t ch,struct _Font_Type *font_type,uint32_t *addr) 
{ 
	switch (ch)
	{
		//空
		case 0x0020:
		{
			font_type->width = 4;
			font_type->height = 20;
			font_type->size = 20;
			*addr = (uint32_t)Hz20_0020;
			break;
		}
		//.
		case 0x002E:
		{
			font_type->width = 3;
			font_type->height = 20;
			font_type->size = 20;
			*addr = (uint32_t)Hz20_002E;
			break;
		}
		//0
		case 0x0030:
		{
			font_type->width = 8;
			font_type->height = 20;
			font_type->size = 20;
			*addr = (uint32_t)Hz20_0030;
			break;
		}
		//1
		case 0x0031:
		{
			font_type->width = 8;
			font_type->height = 20;
			font_type->size = 20;
			*addr = (uint32_t)Hz20_0031;
			break;
		}
		//2
		case 0x0032:
		{
			font_type->width = 8;
			font_type->height = 20;
			font_type->size = 20;
			*addr = (uint32_t)Hz20_0032;
			break;
		}
		//3
		case 0x0033:
		{
			font_type->width = 8;
			font_type->height = 20;
			font_type->size = 20;
			*addr = (uint32_t)Hz20_0033;
			break;
		}
		//4
		case 0x0034:
		{
			font_type->width = 8;
			font_type->height = 20;
			font_type->size = 20;
			*addr = (uint32_t)Hz20_0034;
			break;
		}
		//5
		case 0x0035:
		{
			font_type->width = 8;
			font_type->height = 20;
			font_type->size = 20;
			*addr = (uint32_t)Hz20_0035;
			break;
		}
		//6
		case 0x0036:
		{
			font_type->width = 8;
			font_type->height = 20;
			font_type->size = 20;
			*addr = (uint32_t)Hz20_0036;
			break;
		}
		//7
		case 0x0037:
		{
			font_type->width = 8;
			font_type->height = 20;
			font_type->size = 20;
			*addr = (uint32_t)Hz20_0037;
			break;
		}
		//8
		case 0x0038:
		{
			font_type->width = 8;
			font_type->height = 20;
			font_type->size = 20;
			*addr = (uint32_t)Hz20_0038;
			break;
		}
		//9
		case 0x0039:
		{
			font_type->width = 8;
			font_type->height = 20;
			font_type->size = 20;
			*addr = (uint32_t)Hz20_0039;
			break;
		}
		//m
		case 0x006D:
		{
			font_type->width = 13;
			font_type->height = 20;
			font_type->size = 40;
			*addr = (uint32_t)Hz20_006D;
			break;
		}
		//搜
		case 0xCBD1:
		{
			font_type->width = 14;
			font_type->height = 20;
			font_type->size = 40;
			*addr = (uint32_t)Hz20_CBD1;
			break;
		}
		//索
		case 0xCBF7:
		{
			font_type->width = 14;
			font_type->height = 20;
			font_type->size = 40;
			*addr = (uint32_t)Hz20_CBF7;
			break;
		}
		//正
		case 0xD5FD:
		{
			font_type->width = 14;
			font_type->height = 20;
			font_type->size = 40;
			*addr = (uint32_t)Hz20_D5FD;
			break;
		}
		//常
		case 0xB3A3:
		{
			font_type->width = 14;
			font_type->height = 20;
			font_type->size = 40;
			*addr = (uint32_t)Hz20_B3A3;
			break;
		}
		//超
		case 0xB3AC:
		{
			font_type->width = 14;
			font_type->height = 20;
			font_type->size = 40;
			*addr = (uint32_t)Hz20_B3AC;
			break;
		}
		//距
		case 0xBEE0:
		{
			font_type->width = 14;
			font_type->height = 20;
			font_type->size = 40;
			*addr = (uint32_t)Hz20_BEE0;
			break;
		}
		//失
		case 0xCAA7:
		{
			font_type->width = 14;
			font_type->height = 20;
			font_type->size = 40;
			*addr = (uint32_t)Hz20_CAA7;
			break;
		}
		//踪
		case 0xD7D9:
		{
			font_type->width = 14;
			font_type->height = 20;
			font_type->size = 40;
			*addr = (uint32_t)Hz20_D7D9;
			break;
		}
		default:
		{
			return 0;
		}
	}
	
	return 1;
}




3.将相应的字体宏定义填入字库文件头文件里

/**
* @brief 17*17点阵GB18030汉字
*/


#define GB18030_20X20    2



font.h

/**
* Copyright (c), 2015-2025
* @file font.h
* @brief 字库文件头文件
* @author jdh
* @date 2015/9/6
* @date 2015/9/7
*/

#ifndef _FONT_H_
#define _FONT_H_

/*********************************************************************
*							头文件
**********************************************************************/

#include "inf_lcd.h"

/*********************************************************************
*							宏定义
**********************************************************************/

/**
* @brief 点阵字符宏定义
*/

#define	________	0x0
#define	_______X	0x1
#define	______X_	0x2
#define	______XX	0x3
#define	_____X__	0x4
#define	_____X_X	0x5
#define	_____XX_	0x6
#define	_____XXX	0x7
#define	____X___	0x8
#define	____X__X	0x9
#define	____X_X_	0xa
#define	____X_XX	0xb
#define	____XX__	0xc
#define	____XX_X	0xd
#define	____XXX_	0xe
#define	____XXXX	0xf
#define	___X____	0x10
#define	___X___X	0x11
#define	___X__X_	0x12
#define	___X__XX	0x13
#define	___X_X__	0x14
#define	___X_X_X	0x15
#define	___X_XX_	0x16
#define	___X_XXX	0x17
#define	___XX___	0x18
#define	___XX__X	0x19
#define	___XX_X_	0x1a
#define	___XX_XX	0x1b
#define	___XXX__	0x1c
#define	___XXX_X	0x1d
#define	___XXXX_	0x1e
#define	___XXXXX	0x1f
#define	__X_____	0x20
#define	__X____X	0x21
#define	__X___X_	0x22
#define	__X___XX	0x23
#define	__X__X__	0x24
#define	__X__X_X	0x25
#define	__X__XX_	0x26
#define	__X__XXX	0x27
#define	__X_X___	0x28
#define	__X_X__X	0x29
#define	__X_X_X_	0x2a
#define	__X_X_XX	0x2b
#define	__X_XX__	0x2c
#define	__X_XX_X	0x2d
#define	__X_XXX_	0x2e
#define	__X_XXXX	0x2f
#define	__XX____	0x30
#define	__XX___X	0x31
#define	__XX__X_	0x32
#define	__XX__XX	0x33
#define	__XX_X__	0x34
#define	__XX_X_X	0x35
#define	__XX_XX_	0x36
#define	__XX_XXX	0x37
#define	__XXX___	0x38
#define	__XXX__X	0x39
#define	__XXX_X_	0x3a
#define	__XXX_XX	0x3b
#define	__XXXX__	0x3c
#define	__XXXX_X	0x3d
#define	__XXXXX_	0x3e
#define	__XXXXXX	0x3f
#define	_X______	0x40
#define	_X_____X	0x41
#define	_X____X_	0x42
#define	_X____XX	0x43
#define	_X___X__	0x44
#define	_X___X_X	0x45
#define	_X___XX_	0x46
#define	_X___XXX	0x47
#define	_X__X___	0x48
#define	_X__X__X	0x49
#define	_X__X_X_	0x4a
#define	_X__X_XX	0x4b
#define	_X__XX__	0x4c
#define	_X__XX_X	0x4d
#define	_X__XXX_	0x4e
#define	_X__XXXX	0x4f
#define	_X_X____	0x50
#define	_X_X___X	0x51
#define	_X_X__X_	0x52
#define	_X_X__XX	0x53
#define	_X_X_X__	0x54
#define	_X_X_X_X	0x55
#define	_X_X_XX_	0x56
#define	_X_X_XXX	0x57
#define	_X_XX___	0x58
#define	_X_XX__X	0x59
#define	_X_XX_X_	0x5a
#define	_X_XX_XX	0x5b
#define	_X_XXX__	0x5c
#define	_X_XXX_X	0x5d
#define	_X_XXXX_	0x5e
#define	_X_XXXXX	0x5f
#define	_XX_____	0x60
#define	_XX____X	0x61
#define	_XX___X_	0x62
#define	_XX___XX	0x63
#define	_XX__X__	0x64
#define	_XX__X_X	0x65
#define	_XX__XX_	0x66
#define	_XX__XXX	0x67
#define	_XX_X___	0x68
#define	_XX_X__X	0x69
#define	_XX_X_X_	0x6a
#define	_XX_X_XX	0x6b
#define	_XX_XX__	0x6c
#define	_XX_XX_X	0x6d
#define	_XX_XXX_	0x6e
#define	_XX_XXXX	0x6f
#define	_XXX____	0x70
#define	_XXX___X	0x71
#define	_XXX__X_	0x72
#define	_XXX__XX	0x73
#define	_XXX_X__	0x74
#define	_XXX_X_X	0x75
#define	_XXX_XX_	0x76
#define	_XXX_XXX	0x77
#define	_XXXX___	0x78
#define	_XXXX__X	0x79
#define	_XXXX_X_	0x7a
#define	_XXXX_XX	0x7b
#define	_XXXXX__	0x7c
#define	_XXXXX_X	0x7d
#define	_XXXXXX_	0x7e
#define	_XXXXXXX	0x7f
#define	X_______	0x80
#define	X______X	0x81
#define	X_____X_	0x82
#define	X_____XX	0x83
#define	X____X__	0x84
#define	X____X_X	0x85
#define	X____XX_	0x86
#define	X____XXX	0x87
#define	X___X___	0x88
#define	X___X__X	0x89
#define	X___X_X_	0x8a
#define	X___X_XX	0x8b
#define	X___XX__	0x8c
#define	X___XX_X	0x8d
#define	X___XXX_	0x8e
#define	X___XXXX	0x8f
#define	X__X____	0x90
#define	X__X___X	0x91
#define	X__X__X_	0x92
#define	X__X__XX	0x93
#define	X__X_X__	0x94
#define	X__X_X_X	0x95
#define	X__X_XX_	0x96
#define	X__X_XXX	0x97
#define	X__XX___	0x98
#define	X__XX__X	0x99
#define	X__XX_X_	0x9a
#define X__XX_XX	0x9b
#define X__XXX__	0x9c
#define X__XXX_X	0x9d
#define	X__XXXX_	0x9e
#define	X__XXXXX	0x9f
#define	X_X_____	0xa0
#define	X_X____X	0xa1
#define	X_X___X_	0xa2
#define	X_X___XX	0xa3
#define	X_X__X__	0xa4
#define	X_X__X_X	0xa5
#define	X_X__XX_	0xa6
#define	X_X__XXX	0xa7
#define	X_X_X___	0xa8
#define	X_X_X__X	0xa9
#define	X_X_X_X_	0xaa
#define	X_X_X_XX	0xab
#define	X_X_XX__	0xac
#define	X_X_XX_X	0xad
#define	X_X_XXX_	0xae
#define	X_X_XXXX	0xaf
#define	X_XX____	0xb0
#define X_XX___X	0xb1
#define	X_XX__X_	0xb2
#define	X_XX__XX	0xb3
#define	X_XX_X__	0xb4
#define	X_XX_X_X	0xb5
#define	X_XX_XX_	0xb6
#define	X_XX_XXX	0xb7
#define	X_XXX___	0xb8
#define	X_XXX__X	0xb9
#define	X_XXX_X_	0xba
#define	X_XXX_XX	0xbb
#define	X_XXXX__	0xbc
#define	X_XXXX_X	0xbd
#define	X_XXXXX_	0xbe
#define	X_XXXXXX	0xbf
#define	XX______	0xc0
#define	XX_____X	0xc1
#define	XX____X_	0xc2
#define	XX____XX	0xc3
#define	XX___X__	0xc4
#define	XX___X_X	0xc5
#define	XX___XX_	0xc6
#define	XX___XXX	0xc7
#define	XX__X___	0xc8
#define	XX__X__X	0xc9
#define	XX__X_X_	0xca
#define	XX__X_XX	0xcb
#define	XX__XX__	0xcc
#define	XX__XX_X	0xcd
#define	XX__XXX_	0xce
#define XX__XXXX	0xcf
#define	XX_X____	0xd0
#define	XX_X___X	0xd1
#define	XX_X__X_	0xd2
#define	XX_X__XX	0xd3
#define	XX_X_X__	0xd4
#define	XX_X_X_X	0xd5
#define	XX_X_XX_	0xd6
#define	XX_X_XXX	0xd7
#define	XX_XX___	0xd8
#define	XX_XX__X	0xd9
#define	XX_XX_X_	0xda
#define	XX_XX_XX	0xdb
#define	XX_XXX__	0xdc
#define	XX_XXX_X	0xdd
#define	XX_XXXX_	0xde
#define	XX_XXXXX	0xdf
#define	XXX_____	0xe0
#define	XXX____X	0xe1
#define	XXX___X_	0xe2
#define	XXX___XX	0xe3
#define	XXX__X__	0xe4
#define	XXX__X_X	0xe5
#define	XXX__XX_	0xe6
#define	XXX__XXX	0xe7
#define	XXX_X___	0xe8
#define	XXX_X__X	0xe9
#define	XXX_X_X_	0xea
#define	XXX_X_XX	0xeb
#define	XXX_XX__	0xec
#define	XXX_XX_X	0xed
#define	XXX_XXX_	0xee
#define	XXX_XXXX	0xef
#define	XXXX____	0xf0
#define	XXXX___X	0xf1
#define	XXXX__X_	0xf2
#define	XXXX__XX	0xf3
#define	XXXX_X__	0xf4
#define	XXXX_X_X	0xf5
#define	XXXX_XX_	0xf6
#define	XXXX_XXX	0xf7
#define	XXXXX___	0xf8
#define	XXXXX__X	0xf9
#define	XXXXX_X_	0xfa
#define	XXXXX_XX	0xfb
#define	XXXXXX__	0xfc
#define	XXXXXX_X	0xfd
#define	XXXXXXX_	0xfe
#define	XXXXXXXX	0xff

/*********************************************************************
*							字体定义
**********************************************************************/

/**
* @brief 17*17点阵GB18030汉字
*/

#define GB18030_17X17				1

/**
* @brief 17*17点阵GB18030汉字
*/

#define GB18030_20X20				2

/**
* @brief 24*24点阵GB18030汉字
*/

#define GB18030_24X24				3

/**
* @brief 30*30点阵GB18030汉字
*/

#define GB18030_30X30				4

/**
* @brief 37*37点阵粗体GB18030汉字
*/

#define GB18030_37X37B				5

/**
* @brief 40*40点阵粗体GB18030汉字
*/

#define GB18030_40X40B				6

/**
* @brief 48*48点阵GB18030汉字
*/

#define GB18030_48X48				7

/*********************************************************************
*							数据结构
**********************************************************************/

/**
* @brief 字体结构
*/

struct _Font_Type
{
	uint8_t width;
	uint8_t height;
	uint8_t size;
};

/*********************************************************************
*							函数
**********************************************************************/

/**
* @brief 得到字体高度
* @param font:字体
* @retval 高度
*/

uint8_t font_get_height(uint8_t font);

/**
* @brief 读取字库
* @param font:字体
* @param c:待读取的字符
* @param font_type:返回的字体信息
* @param addr:数据存储地址
* @retval 读取结果.0:失败,1:成功
*/

uint8_t font_read(uint8_t font,uint16_t c,struct _Font_Type *font_type,uint32_t *addr);

#endif



4.将相应的接口填入字库文件源文件里

/**
* @brief 得到字体高度
* @param font:字体
* @retval 高度
*/


extern uint8_t GB18030_20X20_get_height(void);


/**
* @brief 得到地址
* @param font:字体
* @param ch:待读取的字符
* @param addr:数据存储地址
* @retval 读取结果.0:失败,1:成功
*/


extern uint8_t GB18030_20X20_get_address(uint16_t ch,struct _Font_Type *font_type,uint32_t *addr);


font_get_height函数与font_read函数也须要做相应改动。


font.c:

/**
* Copyright (c), 2015-2025
* @file font.c
* @brief 字库文件主文件
* @author jdh
* @date 2015/9/6
* @date 2015/9/7
*/

/*********************************************************************
*							头文件
**********************************************************************/

#include "font.h"
#include "string.h"

/**
* @brief 得到字体高度
* @param font:字体
* @retval 高度
*/

extern uint8_t GB18030_17X17_get_height(void);

/**
* @brief 得到地址
* @param font:字体
* @param ch:待读取的字符
* @param addr:数据存储地址
* @retval 读取结果.0:失败,1:成功
*/

extern uint8_t GB18030_17X17_get_address(uint16_t ch,struct _Font_Type *font_type,uint32_t *addr);

/**
* @brief 得到字体高度
* @param font:字体
* @retval 高度
*/

extern uint8_t GB18030_20X20_get_height(void);

/**
* @brief 得到地址
* @param font:字体
* @param ch:待读取的字符
* @param addr:数据存储地址
* @retval 读取结果.0:失败,1:成功
*/

extern uint8_t GB18030_20X20_get_address(uint16_t ch,struct _Font_Type *font_type,uint32_t *addr);

/**
* @brief 得到字体高度
* @param font:字体
* @retval 高度
*/

extern uint8_t GB18030_24X24_get_height(void);
	
/**
* @brief 得到地址
* @param font:字体
* @param ch:待读取的字符
* @param addr:数据存储地址
* @retval 读取结果.0:失败,1:成功
*/

extern uint8_t GB18030_24X24_get_address(uint16_t ch,struct _Font_Type *font_type,uint32_t *addr);

/**
* @brief 得到字体高度
* @param font:字体
* @retval 高度
*/

extern uint8_t GB18030_30X30_get_height(void);
	
/**
* @brief 得到地址
* @param font:字体
* @param ch:待读取的字符
* @param addr:数据存储地址
* @retval 读取结果.0:失败,1:成功
*/

extern uint8_t GB18030_30X30_get_address(uint16_t ch,struct _Font_Type *font_type,uint32_t *addr);

/**
* @brief 得到字体高度
* @param font:字体
* @retval 高度
*/

uint8_t GB18030_37X37B_get_height(void);

/**
* @brief 得到地址
* @param font:字体
* @param ch:待读取的字符
* @param addr:数据存储地址
* @retval 读取结果.0:失败,1:成功
*/

uint8_t GB18030_37X37B_get_address(uint16_t ch,struct _Font_Type *font_type,uint32_t *addr);

/**
* @brief 得到字体高度
* @param font:字体
* @retval 高度
*/

uint8_t GB18030_40X40B_get_height(void);

/**
* @brief 得到地址
* @param font:字体
* @param ch:待读取的字符
* @param addr:数据存储地址
* @retval 读取结果.0:失败,1:成功
*/

uint8_t GB18030_40X40B_get_address(uint16_t ch,struct _Font_Type *font_type,uint32_t *addr);

/**
* @brief 得到字体高度
* @param font:字体
* @retval 高度
*/

uint8_t GB18030_48X48_get_height(void);

/**
* @brief 得到地址
* @param font:字体
* @param ch:待读取的字符
* @param addr:数据存储地址
* @retval 读取结果.0:失败,1:成功
*/

uint8_t GB18030_48X48_get_address(uint16_t ch,struct _Font_Type *font_type,uint32_t *addr);

/*********************************************************************
*							静态变量
**********************************************************************/

///**
//* @brief 字体结构
//*/

//static struct _Font_Type Font_Type[FONT_NUM + 1];

///*********************************************************************
//*							静态函数
//**********************************************************************/

///**
//* @brief 初始化字体类型
//*/

//static void init_font_type(void);

/*********************************************************************
*							函数
**********************************************************************/

/**
* @brief 得到字体高度
* @param font:字体
* @retval 高度
*/

uint8_t font_get_height(uint8_t font)
{
	switch (font)
	{
		case GB18030_17X17:
		{
			return GB18030_17X17_get_height();
		}
		case GB18030_20X20:
		{
			return GB18030_20X20_get_height();
		}
		case GB18030_24X24:
		{
			return GB18030_24X24_get_height();
		}
		case GB18030_30X30:
		{
			return GB18030_30X30_get_height();
		}
		case GB18030_37X37B:
		{
			return GB18030_37X37B_get_height();
		}
		case GB18030_40X40B:
		{
			return GB18030_40X40B_get_height();
		}
		case GB18030_48X48:
		{
			return GB18030_48X48_get_height();
		}
		default:
		{
			return 0;
		}
	}
}

/**
* @brief 读取字库
* @param font:字体
* @param c:待读取的字符
* @param font_type:返回的字体信息
* @param addr:数据存储地址
* @retval 读取结果.0:失败,1:成功
*/

uint8_t font_read(uint8_t font,uint16_t c,struct _Font_Type *font_type,uint32_t *addr)
{	
	switch (font)
	{
		case GB18030_17X17:
		{
			if (GB18030_17X17_get_address(c,font_type,addr))
			{
				return 1;
			}
			else
			{
				return 0;
			}
		}
		case GB18030_20X20:
		{
			if (GB18030_20X20_get_address(c,font_type,addr))
			{
				return 1;
			}
			else
			{
				return 0;
			}
		}
		case GB18030_24X24:
		{
			if (GB18030_24X24_get_address(c,font_type,addr))
			{
				return 1;
			}
			else
			{
				return 0;
			}
		}
		case GB18030_30X30:
		{
			if (GB18030_30X30_get_address(c,font_type,addr))
			{
				return 1;
			}
			else
			{
				return 0;
			}
		}
		case GB18030_37X37B:
		{
			if (GB18030_37X37B_get_address(c,font_type,addr))
			{
				return 1;
			}
			else
			{
				return 0;
			}
		}
		case GB18030_40X40B:
		{
			if (GB18030_40X40B_get_address(c,font_type,addr))
			{
				return 1;
			}
			else
			{
				return 0;
			}
		}
		case GB18030_48X48:
		{
			if (GB18030_48X48_get_address(c,font_type,addr))
			{
				return 1;
			}
			else
			{
				return 0;
			}
		}
		default:
		{
			return 0;
		}
	}
}



5.读取并显示可參考下面函数:
/**
* @brief 在指定位置显示单个字符
* @param x:x坐标
* @param y:y坐标
* @param font:字体
* @param c:字符
*/

void gui_disp_char_at(uint16_t x,uint16_t y,uint8_t font,uint16_t c)
{
	struct _Font_Type font_type;
	//uint8_t buf[100] = {0};
	uint8_t *buf_pt = 0;
	uint16_t i = 0;
	uint16_t j = 0;
	uint8_t k = 0;
	uint8_t bit = 0;
	uint8_t num_valid_bit = 0;
	uint8_t num_valid_byte = 0;
	
//	//读取字体信息
//	font_type = font_read_type(font);
	//读取字符信息
	font_read(font,c,&font_type,(uint32_t *)&buf_pt);
	//buf_pt = buf;
	
	//有效位数
	num_valid_bit = font_type.width % 8;
	//有效字节数
	num_valid_byte = font_type.width / 8;
	for (i = 0;i < font_type.height;i++)
	{
		for (j = 0;j < num_valid_byte;j++)
		{
			for (k = 0;k < 8;k++)
			{
				bit = (*buf_pt >> (7 - k)) & 0x1;
				gui_interface_draw_pixel(x + j * 8 + k,y + i,bit);
			}
			buf_pt++;
		}
		for (k = 0;k < num_valid_bit;k++)
		{
			bit = (*buf_pt >> (7 - k)) & 0x1;
			gui_interface_draw_pixel(x + j * 8 + k,y + i,bit);
		}
		if (num_valid_bit > 0)
		{
			buf_pt++;
		}
	}
}

例:
gui_disp_char_at(0,0,GB18030_20X20,"正")






以上是关于为OLED屏添加GUI支持3:字库的主要内容,如果未能解决你的问题,请参考以下文章

GUI图形屏在emWin应用中使用Unicode字库

STM32学习笔记——OLED屏

支持鸿蒙OS的产品级SSD1306 OLED屏驱动库(MIT许可证开源)

1.3寸OLED 12864 sh1106带中文字库液晶屏介绍

玩转X-CTR100 l OLED显示-SSD1306无字库

ESP8266+OLED屏实现cube3D效果展示