适用于少量显示;
以下是代码,下面会简要的说明如何显示任意字符,包括但不限于汉字、英文、数字;
/* 显示索引占一个字节的字符
* 参数:【x,y】起始坐标;【cn】要显示的数据的起始地址;【len】数据个数
*/
void LCD_ShowFont(u16 x, u16 y, u8 *cn, u8 len)
{
u8 j, wordNum, a;
u16 color,i;
u16 x0=x;
u16 y0=y;
for(a = 0; a<len; a++)
{
for (wordNum=0; wordNum<12; wordNum++)
{ //wordNum扫描字库的字数
if ((CnChar16x33[wordNum].Index[0]==*cn))
// &&(CnChar32x29[wordNum].Index[1]==*(cn+1)))
{
for(i=0; i<66; i++)
{ //MSK的位数
color=CnChar16x33[wordNum].Msk[i];
for(j=0;j<8;j++)
{
if((color&0x80)==0x80)
{
LCD_DrawFRONT_COLOR(x,y,FRONT_COLOR);
}
else
{
LCD_DrawFRONT_COLOR(x,y,BACK_COLOR);
}
color<<=1;
x++;
if((x-x0)==16)
{
x=x0;
y++;
if((y-y0)==33)
{
y=y0;
}
}
}//for(j=0;j<8;j++)结束
}
}
} //for (wordNum=0; wordNum<12; wordNum++)结束
cn += 1;
x += 16;
x0=x;
}
}
这里主要用索引所占的字节来区分汉字,中文输入占两个字节,英文输入占一个字节(大概);
随要显示的字符不同,修改以下数据:
其中wordNum是点阵数据集的字数;【第11行】
i是点阵数据数组Msk的下标,大小 = 字符宽 * 字符高 / 8 也就是单个字符点阵数据所占字节数【第16行】,要注意这个变量的大小,这里为16位,最大也就65536,如果单个字符的点阵数据超过这个值,就得修改成32位的;
x-x0 字符宽度【第31行】;
y-y0 字符高度【第35行】;
【第45行】每个字符的间隔;
取模软件可在参考资料中获得;
字符取模方式:C51格式,横向取模
例如取得的数据如下:
/*-- 文字: 0 --*/
/*-- 楷体24; 此字体下对应的点阵为:宽x高=16x33 --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xC0,0x0F,0xF0,0x1F,0xF8,
0x3E,0x78,0x3C,0x3C,0x78,0x3C,0x78,0x1E,0x78,0x1E,0x78,0x1E,0xF8,0x1E,0xF0,0x1E,
0xF0,0x1E,0xF0,0x1E,0xF0,0x1E,0xF8,0x1E,0x78,0x1E,0x78,0x1E,0x78,0x3C,0x3C,0x3C,
0x3E,0x7C,0x1F,0xF8,0x0F,0xF0,0x07,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,
需手动在头部添加索引,如下:
/*-- 文字: 0 --*/
/*-- 楷体24; 此字体下对应的点阵为:宽x高=16x33 --*/
"0",0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xC0,0x0F,0xF0,0x1F,0xF8,
0x3E,0x78,0x3C,0x3C,0x78,0x3C,0x78,0x1E,0x78,0x1E,0x78,0x1E,0xF8,0x1E,0xF0,0x1E,
0xF0,0x1E,0xF0,0x1E,0xF0,0x1E,0xF8,0x1E,0x78,0x1E,0x78,0x1E,0x78,0x3C,0x3C,0x3C,
0x3E,0x7C,0x1F,0xF8,0x0F,0xF0,0x07,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,
完整的点阵数据集,例如:
// ------------------ 字模的数据结构定义 ------------------------ //
struct Cn16CharTypeDef // 字模数据结构
{
unsigned char Index[1]; // 字符内码索引,一个字符占一个字节【汉字内码索引,一个汉字占两个字节】
unsigned char Msk[66]; // 点阵码数据(16*33/8)
};
struct Cn16CharTypeDef const CnChar16x33[]=
{
/*-- 文字: 0 --*/
/*-- 楷体24; 此字体下对应的点阵为:宽x高=16x33 --*/
"0",0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xC0,0x0F,0xF0,0x1F,0xF8,
0x3E,0x78,0x3C,0x3C,0x78,0x3C,0x78,0x1E,0x78,0x1E,0x78,0x1E,0xF8,0x1E,0xF0,0x1E,
0xF0,0x1E,0xF0,0x1E,0xF0,0x1E,0xF8,0x1E,0x78,0x1E,0x78,0x1E,0x78,0x3C,0x3C,0x3C,
0x3E,0x7C,0x1F,0xF8,0x0F,0xF0,0x07,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,
/*-- 文字: 1 --*/
/*-- 楷体24; 此字体下对应的点阵为:宽x高=16x33 --*/
"1",0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x01,0xC0,0x03,0xC0,
0x07,0xC0,0x0F,0xC0,0x3F,0xC0,0x3F,0xC0,0x3B,0xC0,0x03,0xC0,0x03,0xC0,0x03,0xC0,
0x03,0xC0,0x03,0xC0,0x03,0xC0,0x03,0xC0,0x03,0xC0,0x03,0xC0,0x03,0xC0,0x03,0xC0,
0x03,0xC0,0x03,0xC0,0x03,0xC0,0x01,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,
/*-- 文字: 2 --*/
/*-- 楷体24; 此字体下对应的点阵为:宽x高=16x33 --*/
"2",0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xC0,0x1F,0xF0,0x3F,0xF8,
0x3E,0x7C,0x78,0x3C,0x78,0x3E,0x70,0x3E,0x00,0x3C,0x00,0x3C,0x00,0x3C,0x00,0x78,
0x00,0xF8,0x00,0xF0,0x01,0xE0,0x03,0xC0,0x07,0xC0,0x0F,0x80,0x1F,0x00,0x3E,0x00,
0x3C,0x00,0x7F,0xFE,0x7F,0xFE,0x7F,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,
/*-- 文字: 3 --*/
/*-- 楷体24; 此字体下对应的点阵为:宽x高=16x33 --*/
"3",0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xC0,0x0F,0xF0,0x1F,0xF8,
0x3E,0x7C,0x7C,0x3C,0x78,0x3E,0x78,0x1E,0x00,0x3C,0x00,0x3C,0x00,0xF8,0x03,0xF0,
0x03,0xF8,0x00,0xFC,0x00,0x3C,0x00,0x3E,0x00,0x1E,0x70,0x1E,0x78,0x1E,0x78,0x3E,
0x7E,0x7C,0x3F,0xF8,0x1F,0xF0,0x07,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,
/*-- 文字: 4 --*/
/*-- 楷体24; 此字体下对应的点阵为:宽x高=16x33 --*/
"4",0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x78,0x00,0x78,
0x00,0xF8,0x01,0xF8,0x03,0xF8,0x03,0xF8,0x07,0xF8,0x0F,0xF8,0x0F,0x78,0x1E,0x78,
0x3C,0x78,0x3C,0x78,0x78,0x78,0xF0,0x78,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x78,
0x00,0x78,0x00,0x78,0x00,0x78,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,
/*-- 文字: 5 --*/
/*-- 楷体24; 此字体下对应的点阵为:宽x高=16x33 --*/
"5",0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0xFC,0x3F,0xFC,
0x3F,0xFC,0x3C,0x00,0x3C,0x00,0x38,0x00,0x78,0x00,0x7F,0xF0,0x7F,0xF8,0x7F,0xFC,
0xF8,0x3C,0x00,0x3E,0x00,0x1E,0x00,0x1E,0x00,0x1E,0x70,0x1E,0xF0,0x3E,0xF0,0x3C,
0x78,0xFC,0x7F,0xF8,0x3F,0xF0,0x0F,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,
/*-- 文字: 6 --*/
/*-- 楷体24; 此字体下对应的点阵为:宽x高=16x33 --*/
"6",0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0xF0,0x01,0xE0,
0x03,0xE0,0x03,0xC0,0x07,0x80,0x0F,0x80,0x0F,0x00,0x1F,0xE0,0x3F,0xF8,0x3F,0xFC,
0x7E,0x3E,0x78,0x1E,0x78,0x0F,0x78,0x0F,0xF8,0x0F,0x78,0x0F,0x78,0x1F,0x78,0x1E,
0x7E,0x3E,0x3F,0xFC,0x1F,0xF8,0x07,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,
/*-- 文字: 7 --*/
/*-- 楷体24; 此字体下对应的点阵为:宽x高=16x33 --*/
"7",0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0xFF,0x7F,0xFF,
0x7F,0xFE,0x00,0x1E,0x00,0x3C,0x00,0x3C,0x00,0x78,0x00,0x78,0x00,0xF0,0x00,0xF0,
0x01,0xE0,0x01,0xE0,0x03,0xC0,0x03,0xC0,0x03,0xC0,0x07,0x80,0x07,0x80,0x07,0x80,
0x0F,0x00,0x0F,0x00,0x0F,0x00,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,
/*-- 文字: 8 --*/
/*-- 楷体24; 此字体下对应的点阵为:宽x高=16x33 --*/
"8",0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x80,0x1F,0xF0,0x3F,0xF8,
0x3C,0x7C,0x78,0x3C,0x78,0x3C,0x78,0x3C,0x78,0x3C,0x78,0x3C,0x3F,0xF8,0x1F,0xF0,
0x3F,0xF8,0x7F,0xFC,0x78,0x3E,0xF8,0x1E,0xF0,0x1E,0xF0,0x1E,0xF0,0x1E,0xF8,0x3E,
0x7C,0x7C,0x7F,0xFC,0x3F,0xF8,0x0F,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,
/*-- 文字: 9 --*/
/*-- 楷体24; 此字体下对应的点阵为:宽x高=16x33 --*/
"9",0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xC0,0x1F,0xF0,0x3F,0xF8,
0x7F,0xFC,0x78,0x3C,0xF8,0x3E,0xF0,0x1E,0xF0,0x1E,0xF0,0x3E,0xF0,0x3E,0xF8,0x3C,
0x7C,0xFC,0x7F,0xF8,0x3F,0xF8,0x07,0xF0,0x01,0xF0,0x01,0xE0,0x03,0xC0,0x03,0xC0,
0x07,0x80,0x0F,0x80,0x0F,0x00,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,
/*-- 文字: : --*/
/*-- 楷体24; 此字体下对应的点阵为:宽x高=16x33 --*/
":",0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x80,0x07,0xC0,
0x07,0xC0,0x07,0xC0,0x03,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x07,0x80,0x07,0xC0,0x07,0xC0,0x07,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,
/*-- 文字: / --*/
/*-- 楷体24; 此字体下对应的点阵为:宽x高=16x33 --*/
"/",0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x0F,0x00,0x0E,0x00,0x1C,
0x00,0x1C,0x00,0x38,0x00,0x38,0x00,0x70,0x00,0x70,0x00,0xE0,0x01,0xE0,0x01,0xC0,
0x03,0x80,0x03,0x80,0x07,0x00,0x07,0x00,0x0E,0x00,0x1E,0x00,0x1C,0x00,0x3C,0x00,
0x38,0x00,0x70,0x00,0x70,0x00,0xE0,0x00,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,
};
显示汉字同理,只需修改点阵数据结构体中的索引占两个字节,并将函数 LCD_ShowFont() 中的第14行取消注释即可;
函数中的 LCD_DrawFRONT_COLOR() 函数就是在指定坐标画指定颜色的点,需修改成所使用的对应函数。
参考资料: