若是16*16点的汉字,x座标在显示一个汉字之后应该是加16,不知你用多大的字?x加的多少?
我的思路一般是在内存中绘图然后整体刷新到显示屏。
绘图函数:
//-------------------------------------------------------
//绘图
//x,y为座标,w为宽度,h为高度,buf为数据
//m 为模式:B0:0正常,1取反,B2&B1:00正常,01:OR,10:AND,11:XOR
//-------------------------------------------------------
void GUI_DrawPic(S16 x0,S16 y0,S16 w,S16 h,U8 m,U8* buf)
{
S16 x,y,bs,px=0,dx=0,dw,m1,n=0;
U16 temp;
U16 ps;
dw=(w+7)>>3;//图像数组横向占用的字节数
//一个横向16位里可能有3个字节
px=x0&0x07;//x方向的偏移(余数)
bs=px;//起始位
m1=(m>>1)&0x03;//模式
for(x=x0;(x<x0+w)&&(x<LCD_WIDTH);x++)
{
n++;//显示点数统计
if(((x&0x07)==0x07)||((x+1)==(x0+w)||((x+1)==LCD_WIDTH)))//横向8位
{
for(y=y0;(y<y0+h)&&(y<LCD_HEIGHT);y++)
{
ps=y-y0;
ps=ps*dw+dx;//数组中的位置
temp=((U16)buf[ps-1]<<8)|buf[ps];//连续取两个字节
if(m&BIT(0))temp=~temp;//数据取反
//temp=(temp>>px)&((0xff<<(8-n))>>bs);//从bs位开始取n个位
temp=(temp>>px)&((U8)(0xff<<(8-n))>>bs);
//---------------------------对绘图模式的处理->
if((n<8)||(m>0))//小于8位,或在非正常模式,需要读出原位置的数据来处理
ps=GUI_Buf_Read(x>>3,y);//LCD_Read16(x>>4,y);
if(m1==0)//正常
{
if(n<8)
{
temp=ps&(~((U8)(0xff<<(8-n))>>bs))|temp;
//将读出的数从bs位开始n个位清0,再或上temp
}
}
else if(m1==1)//OR
{
temp|=ps;
}
else if(m1==2)//AND
{
temp&=ps;
}
else if(m1==3)//XOR
{
temp^=ps;
}
//---------------------------对绘图模式的处理<-
GUI_Buf_Write(x>>3,y,temp);
}
dx++;//数组指向下一个
if(n>8)dx++;//数据位多于8个,就要再向下移一个字节
px&=0x07;//偏移没那么多了
n=0;//数据位清0
bs=0;//之后的起始位就为0了
}
}
}
显示汉字:
//--------------------------------------------------
// 显示一个字
//--------------------------------------------------
void GUI_PutChar(U16 asc)
{
U8 w,h,i;
U16 id;
U8* p;
if(asc>0xA0A0)//汉字,16*16
{
for(i=0;i<ARRLEN(CH16x16_tab);i++)//
{
id=MAKE16(CH16x16_tab[i].id[0],CH16x16_tab[i].id[1]);
if(asc==id)
{
w=pGUIFont->Width*2;//两个字符宽
h=pGUIFont->Height;
p=CH16x16_tab[i].buf;//字库
GUI_DrawPic(GUI_Px,GUI_Py,w,h,GUIFont_Dm,p);//画图
break;
}
}
GUI_Px+=w;
}
else//英文
{
if(asc < pGUIFont->AscFirst)return;
if(asc > pGUIFont->AscLast)return;
w=pGUIFont->Width;
h=pGUIFont->Height;
p=pGUIFont->lib;
p+=(asc-pGUIFont->AscFirst)* pGUIFont->BPL * pGUIFont->Height;//找到字母所在的地址
GUI_DrawPic(GUI_Px,GUI_Py,w,h,GUIFont_Dm,p);
GUI_Px+=pGUIFont->Width;
}
}
|