zoukankan      html  css  js  c++  java
  • 为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,"正")






  • 相关阅读:
    Python 更新pip报错:Could not install packages due to an EnvironmentError: [WinError 5] 拒绝访问
    Vs code 配置(1)-win10
    博客园主题--sukura
    log4j
    安装ant问题
    freemarker string= null
    学习随想
    j2ee学习资料收集
    eclipse + marven
    好文mark
  • 原文地址:https://www.cnblogs.com/zhchoutai/p/7039550.html
Copyright © 2011-2022 走看看