STM32+LCD任意字符显示

适用于少量显示;

以下是代码,下面会简要的说明如何显示任意字符,包括但不限于汉字、英文、数字;

/* 显示索引占一个字节的字符
 * 参数:【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()    函数就是在指定坐标画指定颜色的点,需修改成所使用的对应函数。

 

参考资料:

普中STM32F407开发板相关资料

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值