今天在做毕业设计时候,为了让内容显示更加好看,我在考虑使用整点原子探索者显示任意大小汉字,发现正点原子的开发板历程中都是通过SD卡内容读取,而且相对来说比较麻烦,下面介绍一种可以通过数据存储少量汉字的方法。
这个方法是借鉴一个博主的方法,但是他的只能固定显示16*16或者24*24的方法,本来想引用下那位博主的文章,但因为扒的文章太多的情况,我也没有找到,非常感谢这位博主的文章。
我在这个基础上对函数做了一些修改,可以实现显示任意大小的汉字,但是目前显示的长宽必须相等,不相等的情况我还没尝试过。
首先对PCtoLC2002的设置
目前这个地方需要注意一点,就是字模每行显示数据的设置和在外框中的设计要一样。
首先贴出函数(此函数是我借鉴博主的原版,非常感谢这位博主)
void Test_Show_DESIGNER_Font24(u16 x,u16 y,u8 index,u16 color)
{
u8 temp,t,t1;
u16 y0=y;
for(t=0;t<72;t++)//每个24*24的汉字点阵 有72个字节
{
if(t<24)temp=Designer[index*3][t]; //前24个字节
else if(t<48)temp=Designer[index*3+1][t-24]; //中24个字节
else temp=Designer[index*3+2][t-48]; //后24个字节
for(t1=0;t1<8;t1++)
{
if(temp&0x80)LCD_Draw_Point(x,y,color);//画实心点
else LCD_Draw_Point(x,y,BACK_COLOR); //画空白点(使用背景色)
temp<<=1;
y++;
if((y-y0)==24)
{
y=y0;
x++;
break;
}
}
}
}
Designer是我个人命名的二维数组名字,移植时可以进行修改。首先我们对这个函数做一个分析
这是我生成的一组数组,我们首先对这个数组进行一个分析,24*24等于576,总共有72字节的长度。每个字有三行,每行长度是24,所以代码的写法如下
for(t=0;t<72;t++)//每个24*24的汉字点阵 有72个字节
{
if(t<24)temp=SCHOOL_CLASS[index*3][t]; //前24个字节
else if(t<48)temp=SCHOOL_CLASS[index*3+1][t-24]; //中24个字节
else temp=SCHOOL_CLASS[index*3+2][t-48]; //后24个字节
for(t1=0;t1<8;t1++)//处理一个字节
所以当我们想将字体编程48乘48大小时,我们可以做一个类比
48乘48 字体每行长度是48,总共六行,总共288字节,所以修改后的代码为:
void Test_Show_title_Font48(u16 x,u16 y,u8 index,u16 color)
{
u16 temp,t,t1;
u16 y0=y;
for(t=0;t<288;t++)//每个48*48的汉字点阵 有288个字节 需要进行六次判断
{
if(t<48)temp=title[index*6][t]; //前48个字节 1
else if(t<96)temp=title[index*6+1][t-48]; //48~96个字节 2
else if(t<144)temp=title[index*6+2][t-96]; //96~144个字节 3
else if(t<192)temp=title[index*6+3][t-144]; //4
else if(t<240)temp=title[index*6+4][t-192]; //5
else if(t<288)temp=title[index*6+5][t-240]; //6
for(t1=0;t1<8;t1++)
{
if(temp&0x80)LCD_Draw_Point(x,y,color);//画实心点
else LCD_Draw_Point(x,y,BACK_COLOR); //画空白点(使用背景色)
temp<<=1;
y++;
if((y-y0)==48)
{
y=y0;
x++;
break;
}
}
}
}
因此我们可以通过这个方法对这个函数修改,可以实现任意大小汉字的显示。
顺便写一下图片的显示函数:
关于图片的配置:
注意分辨率的大小需要一样,不然会造成显示的图片混乱问题,后续直接调用以下函数既可。
#define LCD_HEIGHT 800 //此处是你的屏幕分辨率
#define LCD_WIDTH 480
/****************************************************
函数名:LCD_DrawPoint
形参:x,y:坐标
返回值:POINT_COLOR:此点的颜色
函数功能:画点函数
****************************************************/
void LCD_DrawPoint_user(u16 x,u16 y,u16 c)
{
LCD_SetCursor(x,y); //设置光标位置
LCD_WriteRAM_Prepare(); //开始写入GRAM
LCD->LCD_RAM=c;
}
/**************************************************************************
***** 函数名: LCD_Show_Photo()
***** 功能: 显示指定大小图片
***** 参数: x0 开始位置,y0开始位置 ,high高度,width 宽度 ,bmp 图片数据数组
***** 返回值: 无
****************************************************************************/
void LCD_Show_Photo(int x0,int y0,int width,int high,const unsigned char photo[])
{
int x,y;
u32 c;
int p = 0;
for( y = y0 ; y < (high+y0) ; y++ )
{
for( x = x0 ; x < (width+x0) ; x++ )
{
c = photo[p+1] | (photo[p]<<8) ;
//竖屏
if ( ( (x) < LCD_WIDTH) && ( (y) < LCD_HEIGHT) )
//横屏
//if ( ( (x) < LCD_HEIGHT) && ( (y) < LCD_WIDTH) )
LCD_DrawPoint_user(x,y,c);
p = p + 2 ;
}
}
}