单色显示屏GUI库simpleGUI使用自定义中文字体资源

simpleGUI单色显示屏GUI库开源库里的demo包含中文字体资源,不过里面是全部的中文字体,占用flash太多

如何使用自定义字体资源,只制作自己需要的中文字体,这里以宋体12号字体为例

字体结构体定义

const SGUI_FONT_RES FONT_Song_H12 =
{
    /*SGUI_INT                      iHalfWidth*/        6,
    /*SGUI_INT                      iFullWidth*/        12,
    /*SGUI_INT                      iHeight*/           12,
    /*SGUI_FN_IF_GET_CHAR_INDEX     fnGetIndex*/        GetCharIndex_Song,
    /*SGUI_FN_IF_GET_DATA           fnGetData*/         GetFontData_Song,
    /*SGUI_FN_IF_STEP_NEXT          fnStepNext*/        StepNext_Song,
    /*SGUI_FN_IF_IS_FULL_WIDTH      fnIsFullWidth*/     IsFullWidth_Song
};

字体取模,使用PCtoLCD工具

定义资源数组

定义中文字体编码数组,keil默认GBK编码,所以中文字体的话,可以使用下面的网站查询字体编码

https://bianma.supfree.net/chaye.asp?id=7ECF

然后实现字体资源结构体中定义的四个函数就可以了

整体代码如下:

font_song.h

#ifndef _FONT_SONG_H
#define _FONT_SONG_H


#include "SGUI_Typedef.h"

extern const SGUI_FONT_RES FONT_Song_H12;

#endif

font_song.c

#include "font_song.h"

static SGUI_INT GetGBKIndex(SGUI_UINT32 uiUnicode);

SGUI_SIZE GetFontData_Song(SGUI_SIZE sStartAddr, SGUI_BYTE* pDataBuffer, SGUI_SIZE sReadSize);
SGUI_INT GetCharIndex_Song(SGUI_UINT32 uiCode);
SGUI_CSZSTR StepNext_Song(SGUI_CSZSTR cszSrc, SGUI_UINT32* puiCode);
SGUI_BOOL IsFullWidth_Song(SGUI_UINT32 uiCode);

const SGUI_FONT_RES FONT_Song_H12 =
{
    /*SGUI_INT                      iHalfWidth*/        6,
    /*SGUI_INT                      iFullWidth*/        12,
    /*SGUI_INT                      iHeight*/           12,
    /*SGUI_FN_IF_GET_CHAR_INDEX     fnGetIndex*/        GetCharIndex_Song,
    /*SGUI_FN_IF_GET_DATA           fnGetData*/         GetFontData_Song,
    /*SGUI_FN_IF_STEP_NEXT          fnStepNext*/        StepNext_Song,
    /*SGUI_FN_IF_IS_FULL_WIDTH      fnIsFullWidth*/     IsFullWidth_Song
};

const SGUI_BYTE RES_FONT_SONG_H12[] = {
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*" ",0*/

0x00,0x00,0x7C,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,/*"!",1*/

0x00,0x04,0x03,0x04,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*""",2*/

0x90,0xFC,0x90,0xFC,0x90,0x00,0x00,0x03,0x00,0x03,0x00,0x00,/*"#",3*/

0x18,0x24,0xFE,0x44,0x88,0x00,0x01,0x02,0x07,0x02,0x01,0x00,/*"$",4*/

0x38,0x44,0xF8,0xD0,0x2C,0xC0,0x00,0x03,0x00,0x01,0x02,0x01,/*"%",5*/

0xC0,0x38,0xE4,0x18,0xE0,0x20,0x01,0x02,0x02,0x01,0x02,0x01,/*"&",6*/

0x04,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"'",7*/

0x00,0x00,0xF8,0x06,0x01,0x00,0x00,0x00,0x00,0x03,0x04,0x00,/*"(",8*/

0x00,0x01,0x06,0xF8,0x00,0x00,0x00,0x04,0x03,0x00,0x00,0x00,/*")",9*/

0x90,0x60,0xF8,0x60,0x90,0x00,0x00,0x00,0x01,0x00,0x00,0x00,/*"*",10*/

0x00,0x20,0x20,0xF8,0x20,0x20,0x00,0x00,0x00,0x00,0x00,0x00,/*"+",11*/

0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x03,0x00,0x00,0x00,0x00,/*",",12*/

0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x00,0x00,0x00,0x00,0x00,/*"-",13*/

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,/*".",14*/

0x00,0x00,0xC0,0x30,0x0C,0x02,0x04,0x03,0x00,0x00,0x00,0x00,/*"/",15*/

0xF8,0x04,0x04,0x04,0xF8,0x00,0x01,0x02,0x02,0x02,0x01,0x00,/*"0",16*/

0x00,0x08,0xFC,0x00,0x00,0x00,0x00,0x02,0x03,0x02,0x00,0x00,/*"1",17*/

0x18,0x84,0x44,0x24,0x18,0x00,0x03,0x02,0x02,0x02,0x02,0x00,/*"2",18*/

0x08,0x04,0x24,0x24,0xD8,0x00,0x01,0x02,0x02,0x02,0x01,0x00,/*"3",19*/

0xC0,0xA0,0x98,0xFC,0x80,0x00,0x00,0x00,0x02,0x03,0x02,0x00,/*"4",20*/

0x7C,0x24,0x24,0x24,0xC4,0x00,0x01,0x02,0x02,0x02,0x01,0x00,/*"5",21*/

0xF0,0x48,0x24,0x24,0xC8,0x00,0x01,0x02,0x02,0x02,0x01,0x00,/*"6",22*/

0x00,0x04,0xC4,0x34,0x0C,0x00,0x00,0x00,0x03,0x00,0x00,0x00,/*"7",23*/

0xD8,0x24,0x24,0x24,0xD8,0x00,0x01,0x02,0x02,0x02,0x01,0x00,/*"8",24*/

0x38,0x44,0x44,0x24,0xF8,0x00,0x01,0x02,0x02,0x01,0x00,0x00,/*"9",25*/

0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,/*":",26*/

0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x00,/*";",27*/

0x00,0x60,0x90,0x08,0x04,0x00,0x00,0x00,0x00,0x01,0x02,0x00,/*"<",28*/

0x50,0x50,0x50,0x50,0x50,0x50,0x00,0x00,0x00,0x00,0x00,0x00,/*"=",29*/

0x00,0x04,0x08,0x90,0x60,0x00,0x00,0x02,0x01,0x00,0x00,0x00,/*">",30*/

0x18,0x04,0xC4,0x24,0x18,0x00,0x00,0x00,0x02,0x00,0x00,0x00,/*"?",31*/

0xF0,0x08,0xE4,0xF4,0x84,0x78,0x00,0x01,0x02,0x02,0x02,0x01,/*"@",32*/

0x00,0xE0,0x9C,0xF0,0x80,0x00,0x02,0x03,0x00,0x00,0x03,0x02,/*"A",33*/

0x04,0xFC,0x24,0x24,0xD8,0x00,0x02,0x03,0x02,0x02,0x01,0x00,/*"B",34*/

0xF8,0x04,0x04,0x04,0x0C,0x00,0x01,0x02,0x02,0x02,0x01,0x00,/*"C",35*/

0x04,0xFC,0x04,0x04,0xF8,0x00,0x02,0x03,0x02,0x02,0x01,0x00,/*"D",36*/

0x04,0xFC,0x24,0x74,0x0C,0x00,0x02,0x03,0x02,0x02,0x03,0x00,/*"E",37*/

0x04,0xFC,0x24,0x74,0x0C,0x00,0x02,0x03,0x02,0x00,0x00,0x00,/*"F",38*/

0xF0,0x08,0x04,0x44,0xCC,0x40,0x00,0x01,0x02,0x02,0x01,0x00,/*"G",39*/

0x04,0xFC,0x20,0x20,0xFC,0x04,0x02,0x03,0x00,0x00,0x03,0x02,/*"H",40*/

0x04,0x04,0xFC,0x04,0x04,0x00,0x02,0x02,0x03,0x02,0x02,0x00,/*"I",41*/

0x00,0x04,0x04,0xFC,0x04,0x04,0x0C,0x08,0x08,0x07,0x00,0x00,/*"J",42*/

0x04,0xFC,0x24,0x50,0x8C,0x04,0x02,0x03,0x02,0x00,0x03,0x02,/*"K",43*/

0x04,0xFC,0x04,0x00,0x00,0x00,0x02,0x03,0x02,0x02,0x02,0x03,/*"L",44*/

0xFC,0x3C,0xC0,0x3C,0xFC,0x04,0x03,0x00,0x03,0x00,0x03,0x02,/*"M",45*/

0x04,0xFC,0x30,0xC4,0xFC,0x04,0x02,0x03,0x02,0x00,0x03,0x00,/*"N",46*/

0xF8,0x04,0x04,0x04,0xF8,0x00,0x01,0x02,0x02,0x02,0x01,0x00,/*"O",47*/

0x04,0xFC,0x24,0x24,0x18,0x00,0x02,0x03,0x02,0x00,0x00,0x00,/*"P",48*/

0xF8,0x84,0x84,0x04,0xF8,0x00,0x01,0x02,0x02,0x07,0x05,0x00,/*"Q",49*/

0x04,0xFC,0x24,0x64,0x98,0x00,0x02,0x03,0x02,0x00,0x03,0x02,/*"R",50*/

0x18,0x24,0x24,0x44,0x8C,0x00,0x03,0x02,0x02,0x02,0x01,0x00,/*"S",51*/

0x0C,0x04,0xFC,0x04,0x0C,0x00,0x00,0x02,0x03,0x02,0x00,0x00,/*"T",52*/

0x04,0xFC,0x00,0x00,0xFC,0x04,0x00,0x01,0x02,0x02,0x01,0x00,/*"U",53*/

0x04,0x7C,0x80,0xE0,0x1C,0x04,0x00,0x00,0x03,0x00,0x00,0x00,/*"V",54*/

0x3C,0xC0,0x7C,0xC0,0x3C,0x00,0x00,0x03,0x00,0x03,0x00,0x00,/*"W",55*/

0x04,0x9C,0x60,0x9C,0x04,0x00,0x02,0x03,0x00,0x03,0x02,0x00,/*"X",56*/

0x04,0x3C,0xC0,0x3C,0x04,0x00,0x00,0x02,0x03,0x02,0x00,0x00,/*"Y",57*/

0x0C,0x84,0x64,0x1C,0x04,0x00,0x02,0x03,0x02,0x02,0x03,0x00,/*"Z",58*/

0x00,0x00,0xFF,0x01,0x01,0x00,0x00,0x00,0x07,0x04,0x04,0x00,/*"[",59*/

0x04,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"'",60*/

0x00,0x01,0x01,0xFF,0x00,0x00,0x00,0x04,0x04,0x07,0x00,0x00,/*"]",61*/

0x00,0x02,0x01,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"^",62*/

0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x08,0x08,0x08,0x08,0x08,/*"_",63*/

0x00,0x01,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"`",64*/

0x00,0x40,0xA0,0xA0,0xC0,0x00,0x00,0x01,0x02,0x02,0x03,0x02,/*"a",65*/

0x02,0xFE,0x20,0x20,0xC0,0x00,0x00,0x03,0x02,0x02,0x01,0x00,/*"b",66*/

0x00,0xC0,0x20,0x20,0x60,0x00,0x00,0x01,0x02,0x02,0x01,0x00,/*"c",67*/

0x00,0xC0,0x20,0x22,0xFE,0x00,0x00,0x01,0x02,0x02,0x03,0x02,/*"d",68*/

0x00,0xC0,0xA0,0xA0,0xC0,0x00,0x00,0x01,0x02,0x02,0x02,0x00,/*"e",69*/

0x00,0x20,0xFC,0x22,0x22,0x04,0x00,0x02,0x03,0x02,0x02,0x00,/*"f",70*/

0x00,0x40,0xA0,0xA0,0x60,0x20,0x00,0x05,0x0A,0x0A,0x0A,0x04,/*"g",71*/

0x02,0xFE,0x20,0x20,0xC0,0x00,0x02,0x03,0x02,0x00,0x03,0x02,/*"h",72*/

0x00,0x20,0xE6,0x00,0x00,0x00,0x00,0x02,0x03,0x02,0x00,0x00,/*"i",73*/

0x00,0x00,0x20,0xE6,0x00,0x00,0x08,0x08,0x08,0x07,0x00,0x00,/*"j",74*/

0x02,0xFE,0x80,0x60,0x20,0x00,0x02,0x03,0x00,0x01,0x02,0x00,/*"k",75*/

0x02,0x02,0xFE,0x00,0x00,0x00,0x02,0x02,0x03,0x02,0x02,0x00,/*"l",76*/

0xE0,0x20,0xE0,0x20,0xC0,0x00,0x03,0x00,0x03,0x00,0x03,0x00,/*"m",77*/

0x20,0xE0,0x20,0x20,0xC0,0x00,0x02,0x03,0x02,0x00,0x03,0x02,/*"n",78*/

0x00,0xC0,0x20,0x20,0xC0,0x00,0x00,0x01,0x02,0x02,0x01,0x00,/*"o",79*/

0x20,0xE0,0x20,0x20,0xC0,0x00,0x08,0x0F,0x0A,0x02,0x01,0x00,/*"p",80*/

0x00,0xC0,0x20,0x20,0xE0,0x00,0x00,0x01,0x02,0x0A,0x0F,0x08,/*"q",81*/

0x20,0xE0,0x40,0x20,0x20,0x00,0x02,0x03,0x02,0x00,0x00,0x00,/*"r",82*/

0x00,0x60,0xA0,0xA0,0x20,0x00,0x00,0x02,0x02,0x02,0x03,0x00,/*"s",83*/

0x00,0x20,0xF8,0x20,0x20,0x00,0x00,0x00,0x03,0x02,0x02,0x00,/*"t",84*/

0x20,0xE0,0x00,0x20,0xE0,0x00,0x00,0x01,0x02,0x02,0x03,0x02,/*"u",85*/

0x20,0xE0,0x00,0xE0,0x20,0x00,0x00,0x00,0x03,0x00,0x00,0x00,/*"v",86*/

0x60,0x80,0xE0,0x80,0x60,0x00,0x00,0x03,0x00,0x03,0x00,0x00,/*"w",87*/

0x20,0x60,0x80,0x60,0x20,0x00,0x02,0x03,0x00,0x03,0x02,0x00,/*"x",88*/

0x20,0xE0,0x00,0x00,0xE0,0x20,0x08,0x08,0x05,0x03,0x00,0x00,/*"y",89*/

0x00,0x20,0xA0,0x60,0x20,0x00,0x00,0x02,0x03,0x02,0x02,0x00,/*"z",90*/

0x00,0x00,0x20,0xFF,0x01,0x00,0x00,0x00,0x00,0x07,0x04,0x00,/*"{",91*/

0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x0F,0x00,0x00,/*"|",92*/

0x00,0x01,0xDF,0x20,0x00,0x00,0x00,0x04,0x07,0x00,0x00,0x00,/*"}",93*/

0x02,0x01,0x01,0x02,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"~",94*/


0x22,0x44,0x00,0xC0,0x5F,0xD5,0x55,0xD5,0x5F,0xC0,0x00,0x00,0x04,0x02,0x09,0x0F,
0x08,0x0F,0x08,0x0F,0x08,0x0F,0x08,0x00,/*"温",0*/

0x11,0x22,0x80,0x3E,0x2A,0xEA,0x2A,0xEA,0x2A,0x3E,0x80,0x00,0x04,0x02,0x08,0x09,
0x08,0x0F,0x08,0x0F,0x08,0x09,0x08,0x00,/*"湿",1*/

0x00,0xFE,0x0A,0x8A,0xBE,0xAA,0xAB,0xAA,0xBE,0x8A,0x0A,0x00,0x08,0x07,0x00,0x08,
0x09,0x0A,0x04,0x04,0x0A,0x09,0x08,0x00,/*"度",2*/

0x10,0x11,0xF2,0x00,0x50,0xCF,0x41,0x41,0x4F,0xD0,0x10,0x00,0x00,0x00,0x07,0x02,
0x08,0x08,0x05,0x02,0x05,0x08,0x08,0x00,/*"设",3*/

0x10,0x17,0xD5,0x55,0x57,0x7D,0x57,0x55,0xD5,0x17,0x10,0x00,0x08,0x08,0x0F,0x08,
0x08,0x0E,0x08,0x08,0x0F,0x08,0x08,0x00,/*"置",4*/

0x40,0x48,0x49,0x4A,0x48,0xF8,0x48,0x4A,0x49,0x48,0x40,0x00,0x08,0x08,0x04,0x02,
0x01,0x00,0x01,0x02,0x04,0x08,0x08,0x00,/*"关",5*/

0x20,0x21,0x21,0x21,0x21,0xFF,0x21,0x21,0x21,0x21,0x20,0x00,0x00,0x00,0x00,0x08,
0x08,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,/*"于",6*/

0x98,0xD4,0xB3,0x88,0x40,0xA2,0x92,0x8A,0x96,0xA2,0x40,0x00,0x04,0x04,0x02,0x02,
0x08,0x08,0x08,0x0F,0x08,0x08,0x08,0x00,/*"经",7*/

0x98,0xD4,0xB3,0x08,0x44,0x54,0x54,0xFF,0x54,0x54,0xC4,0x00,0x04,0x04,0x02,0x02,
0x00,0x00,0x00,0x0F,0x00,0x02,0x03,0x00,/*"纬",8*/

};

static const SGUI_UINT32 s_arrSongGBKTable[] = {
    0xCEC2, // 温
	  0xCAAA, // 湿
    0xB6C8, // 度
	  0xC9E8, // 设
		0xD6C3, // 置
	  0xB9D8, // 关
	  0xD3DA, // 于
	  0xBEAD, // 经
	  0xCEB3, // 纬
};

SGUI_SIZE GetFontData_Song(SGUI_SIZE sStartAddr, SGUI_BYTE* pDataBuffer, SGUI_SIZE sReadSize)
{
    /*----------------------------------*/
    /* Variable Declaration             */
    /*----------------------------------*/
    SGUI_SIZE                   sReadCount;
    const SGUI_BYTE*            pSrc = RES_FONT_SONG_H12+sStartAddr;
    SGUI_BYTE*                  pDest = pDataBuffer;

    /*----------------------------------*/
    /* Initialize                       */
    /*----------------------------------*/
    pSrc =                      RES_FONT_SONG_H12+sStartAddr;
    pDest =                     pDataBuffer;

    /*----------------------------------*/
    /* Process                          */
    /*----------------------------------*/
    if(NULL != pDataBuffer)
    {
        for(sReadCount=0; sReadCount<sReadSize; sReadCount++)
        {
            *pDest++ = *pSrc++;
        }
    }
    return sReadCount;
}

SGUI_INT GetCharIndex_Song(SGUI_UINT32 uiCode)
{
    /*----------------------------------*/
    /* Variable Declaration             */
    /*----------------------------------*/
    SGUI_INT                    iIndex = SGUI_INVALID_INDEX;
		SGUI_UINT8									uiLowByte;
		SGUI_INT len = sizeof(s_arrSongGBKTable)/sizeof(SGUI_UINT32);
	
    if((uiCode > 0x19) && (uiCode < 0x7F))
    {
        iIndex = uiCode - (0x20);
    }
    else
    {			
			iIndex = GetGBKIndex(uiCode);
			iIndex = 95 + (iIndex * 2);
    }
		
    return iIndex;
		
}

SGUI_CSZSTR StepNext_Song(SGUI_CSZSTR cszSrc, SGUI_UINT32* puiCode)
{
    /*----------------------------------*/
    /* Variable Declaration             */
    /*----------------------------------*/
    const SGUI_CHAR*            pcNextChar;
    SGUI_UINT32                 uiCode;

    /*----------------------------------*/
    /* Initialize                       */
    /*----------------------------------*/
    pcNextChar =                cszSrc;
    uiCode =                    0;

    /*----------------------------------*/
    /* Process                          */
    /*----------------------------------*/
    if(NULL != pcNextChar)
    {
        do
        {
            uiCode = (SGUI_BYTE)(*pcNextChar++);
            if(uiCode < 0x7F)
            {
                break;
            }
            uiCode = uiCode<<8;
            uiCode |= (SGUI_BYTE)(*pcNextChar++);
        }while(0);
    }
    *puiCode = uiCode;

    return pcNextChar;
}

SGUI_BOOL IsFullWidth_Song(SGUI_UINT32 uiCode)
{
    /*----------------------------------*/
    /* Variable Declaration             */
    /*----------------------------------*/
    SGUI_BOOL                   bReturn;

    /*----------------------------------*/
    /* Process                          */
    /*----------------------------------*/
    if(uiCode < 0x7F)
    {
        bReturn = SGUI_FALSE;
    }
    else
    {
        bReturn = SGUI_TRUE;
    }

    return bReturn;
}

static SGUI_INT GetGBKIndex(SGUI_UINT32 uiUnicode)
{
    /*----------------------------------*/
    /* Variable Declaration             */
    /*----------------------------------*/
    SGUI_INT        iIndex = SGUI_INVALID_INDEX;
		SGUI_INT        iTableLen = sizeof(s_arrSongGBKTable) / sizeof(SGUI_UINT32);

    /*----------------------------------*/
    /* Process                          */
    /*----------------------------------*/
		for(int i=0;i<iTableLen;i++)
		{
			if(s_arrSongGBKTable[i] == uiUnicode)
			{
				iIndex = i;
				break;
			}
		}
	
    return iIndex;
}

最后显示字体时调用SGUI_Text_DrawText函数,传入自定义的字体就可以了

开始愉快的写界面吧😄

参考文档:

https://gitee.com/Polarix/simplegui/blob/Stable/Documents/How%20to%20create%20font%20data.md

https://blog.csdn.net/weixin_43614541/article/details/104581473

  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值