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