欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

关于 TFT LCD 模块的一些问题 (2) - LCD 显示屏字体、字型

最编程 2024-06-02 14:10:38
...
字体中12*6等代表的意义
根据选择的字体1206或1608,它们表示字符是12个像素高或16个像素高(对应第一个for),字符的宽度是6或8(对应嵌套的for),通过for来遍历像素定义中的每一个数字0或1,1的时候显示该像素点,0的时候不显示,这样就能够显示出文字了。

叠加方式就是不管原来的底色是什么,当像素为1的时候就显示该点,为0的时候什么也不做。
非叠加方式就是为1的时候显示该点,为0的时候显示底色。
void LCD_ShowChar(u16 x,u16 y,u8 num,u8 size,u8 mode)
{
#if USE_HORIZONTAL==1 //横屏模式
#define MAX_CHAR_POSX 312
#define MAX_CHAR_POSY 232
#else //竖屏模式
#define MAX_CHAR_POSX 232
#define MAX_CHAR_POSY 312
#endif
u8 temp;
u8 pos,t;
u16 x0=x;
u16 colortemp=POINT_COLOR; //字体的颜色
if(x>MAX_CHAR_POSX||y>MAX_CHAR_POSY)return;
//设置窗口
num=num-' ';//得到偏移后的值
if(!mode) //非叠加方式
{
for(pos=0;pos<size;pos++)
{
if(size==12)temp=asc2_1206[num][pos];//调用1206字体
else temp=asc2_1608[num][pos]; //调用1608字体
for(t=0;t<size/2;t++)
{
if(temp&0x01)POINT_COLOR=colortemp;
else POINT_COLOR=BACK_COLOR;
LCD_DrawPoint(x,y);
temp>>=1;
x++;
}
x=x0;
y++;
}
}else//叠加方式
{
for(pos=0;pos<size;pos++)
{
if(size==12)temp=asc2_1206[num][pos];//调用1206字体
else temp=asc2_1608[num][pos]; //调用1608字体
for(t=0;t<size/2;t++)
{
if(temp&0x01)LCD_DrawPoint(x+t,y+pos);//画一个点
temp>>=1;
}
}
}
POINT_COLOR=colortemp;
}

字符字节计算
每个32*32的汉字点阵 有128个字节 (高32个像素点*宽32个像素点,每一个像素点是一位,32*32=32*4*8=128*8位=128字节)
u8 csize=(size/8+((size%8)?1:0))*(size);//得到字体一个字符对应点阵集所占的字节数