void Show_Str(u16 x,u16 y,u16 width,u16 height,u8*str,u8 size,u8 mode)
{
u16 x0=x;
u16 y0=y;
u8 bHz=0; //×Ö·û»òÕßÖÐÎÄ
while(*str!=0)//Êý¾Ýδ½áÊø
{
if(!bHz)
{
if(*str>0x80)bHz=1;//ÖÐÎÄ
else //×Ö·û
{
if(x>(x0+width-size/2))//»»ÐÐ
{
y+=size;
x=x0;
}
if(y>(y0+height-size))break;//Ô½½ç·µ»Ø
if(*str==13)//»»ÐзûºÅ
{
y+=size;
x=x0;
str++;
}
else LCD_ShowChar(x,y,*str,size,mode);//ÓÐЧ²¿·ÖдÈë
str++;
x+=size/2; //×Ö·û,Ϊȫ×ÖµÄÒ»°ë
}
}else//ÖÐÎÄ
{
bHz=0;//Óкº×Ö¿â
if(x>(x0+width-size))//»»ÐÐ
{
y+=size;
x=x0;
}
if(y>(y0+height-size))break;//Ô½½ç·µ»Ø
Show_Font(x,y,str,size,mode); //ÏÔʾÕâ¸öºº×Ö,¿ÕÐÄÏÔʾ
str+=2;
x+=size;//ÏÂÒ»¸öºº×ÖÆ«ÒÆ
}
}
}
void Get_HzMat(unsigned char *code,unsigned char *mat,u8 size)
{
unsigned char qh,ql;
unsigned char i;
unsigned long foffset;
u8 csize=(size/8+((size%8)?1:0))*(size);//µÃµ½×ÖÌåÒ»¸ö×Ö·û¶ÔÓ¦µãÕó¼¯ËùÕ¼µÄ×Ö½ÚÊý
qh=*code;
ql=*(++code);
if(qh<0x81||ql<0x40||ql==0xff||qh==0xff)//·Ç ³£Óúº×Ö
{
for(i=0;i<csize;i++)*mat++=0x00;//Ìî³äÂú¸ñ
return; //½áÊø·ÃÎÊ
}
if(ql<0x7f)ql-=0x40;//×¢Òâ!
else ql-=0x41;
qh-=0x81;
foffset=((unsigned long)190*qh+ql)*csize; //µÃµ½×Ö¿âÖеÄ×Ö½ÚÆ«ÒÆÁ¿
switch(size)
{
case 12:
SPI_Flash_Read(mat,foffset+ftinfo.f12addr,24);
break;
case 16:
SPI_Flash_Read(mat,foffset+ftinfo.f16addr,32);
break;
case 24:
SPI_Flash_Read(mat,foffset+ftinfo.f24addr,72);
break;
}
}
//ÏÔʾһ¸öÖ¸¶¨´óСµÄºº×Ö
//x,y :ºº×ÖµÄ×ø±ê
//font:ºº×ÖGBKÂë
//size:×ÖÌå´óС
//mode:0,Õý³£ÏÔʾ,1,µþ¼ÓÏÔʾ
void Show_Font(u16 x,u16 y,u8 *font,u8 size,u8 mode)
{
u8 temp,t,t1;
u16 y0=y;
u8 dzk[72];
u8 csize=(size/8+((size%8)?1:0))*(size);//µÃµ½×ÖÌåÒ»¸ö×Ö·û¶ÔÓ¦µãÕó¼¯ËùÕ¼µÄ×Ö½ÚÊý
if(size!=12&&size!=16&&size!=24)return; //²»Ö§³ÖµÄsize
Get_HzMat(font,dzk,size); //µÃµ½ÏàÓ¦´óСµÄµãÕóÊý¾Ý
for(t=0;t<csize;t++)
{
temp=dzk[t]; //µÃµ½µãÕóÊý¾Ý
for(t1=0;t1<8;t1++)
{
if(temp&0x80)LCD_Fast_DrawPoint(x,y,POINT_COLOR);
else if(mode==0)LCD_Fast_DrawPoint(x,y,BACK_COLOR);
temp<<=1;
y++;
if((y-y0)==size)
{
y=y0;
x++;
break;
}
}
}
}
//ÔÚÖ¸¶¨Î»ÖÿªÊ¼ÏÔʾһ¸ö×Ö·û´®
//Ö§³Ö×Ô¶¯»»ÐÐ
//(x,y):ÆðÊ¼×ø±ê
//width,height:ÇøÓò
//str :×Ö·û´®
//size :×ÖÌå´óС
//mode:0,·Çµþ¼Ó·½Ê½;1,µþ¼Ó·½Ê½
void Show_Str(u16 x,u16 y,u16 width,u16 height,u8*str,u8 size,u8 mode)
{
u16 x0=x;
u16 y0=y;
u8 bHz=0; //×Ö·û»òÕßÖÐÎÄ
while(*str!=0)//Êý¾Ýδ½áÊø
{
if(!bHz)
{
if(*str>0x80)bHz=1;//ÖÐÎÄ
else //×Ö·û
{
if(x>(x0+width-size/2))//»»ÐÐ
{
y+=size;
x=x0;
}
if(y>(y0+height-size))break;//Ô½½ç·µ»Ø
if(*str==13)//»»ÐзûºÅ
{
y+=size;
x=x0;
str++;
}
else LCD_ShowChar(x,y,*str,size,mode);//ÓÐЧ²¿·ÖдÈë
str++;
x+=size/2; //×Ö·û,Ϊȫ×ÖµÄÒ»°ë
}
}else//ÖÐÎÄ
{
bHz=0;//Óкº×Ö¿â
if(x>(x0+width-size))//»»ÐÐ
{
y+=size;
x=x0;
}
if(y>(y0+height-size))break;//Ô½½ç·µ»Ø
Show_Font(x,y,str,size,mode); //ÏÔʾÕâ¸öºº×Ö,¿ÕÐÄÏÔʾ
str+=2;
x+=size;//ÏÂÒ»¸öºº×ÖÆ«ÒÆ
}
}
}
//ÔÚÖ¸¶¨¿í¶ÈµÄÖмäÏÔʾ×Ö·û´®
//Èç¹û×Ö·û³¤¶È³¬¹ýÁËlen,ÔòÓÃShow_StrÏÔʾ
//len:Ö¸¶¨ÒªÏÔʾµÄ¿í¶È
void Show_Str_Mid(u16 x,u16 y,u8*str,u8 size,u8 len)
{
u16 strlenth=0;
strlenth=strlen((const char*)str);
strlenth*=size/2;
if(strlenth>len)Show_Str(x,y,lcddev.width,lcddev.height,str,size,1);
else
{
strlenth=(len-strlenth)/2;
Show_Str(strlenth+x,y,lcddev.width,lcddev.height,str,size,1);
}
}
本文介绍了一种用于嵌入式系统的中英文混合显示函数,该函数支持自动换行并能在指定区域内显示字符串。文章详细解释了如何根据不同字体大小获取字符点阵数据,并展示了如何在屏幕上绘制这些字符。
676

被折叠的 条评论
为什么被折叠?



