该函数是在原子例程的实验中直接修改而来的。
//在指定位置显示一个字符
//x,y:起始坐标
//num:要显示的字符:" "--->"~"
//size:字体大小 12/16/32
//mode:叠加方式(1)还是非叠加方式(0)
void LCD_ShowChar(u16 x,u16 y,u8 num,u8 size,u8 mode)
{
u8 temp,t1,t;
u16 y0=y;
u16 colortemp=POINT_COLOR;
//设置窗口
num=num-' ';//得到偏移后的值
if(!mode) //非叠加方式
{
for(t=0;t<size;t++)
{
if(size==12)temp=asc2_1206[num][t]; //调用1206字体
else if(size==16) temp=asc2_1608[num][t]; //调用1608字体
else if(size==32) temp=asc2_1616[num][t]; //调用1616汉字字体
for(t1=0;t1<8;t1++)
{
if(temp&0x80)POINT_COLOR=colortemp;
else POINT_COLOR=BACK_COLOR;
LCD_DrawPoint(x,y);
temp<<=1;
y++;
if(x>=lcddev.width){POINT_COLOR=colortemp;return;}//超区域了
if(size==32)
{
if((y-y0)==16)
{
y=y0;
x++;
if(x>=lcddev.width){POINT_COLOR=colortemp;return;}//超区域了
break;
}
}
else if((y-y0)==size)
{
y=y0;
x++;
if(x>=lcddev.width){POINT_COLOR=colortemp;return;}//超区域了
break;
}
}
}
}else//叠加方式
{
for(t=0;t<size;t++)
{
if(size==12)temp=asc2_1206[num][t]; //调用1206字体
else if(size==16)temp=asc2_1608[num][t]; //调用1608字体
else if(size==32) temp=asc2_1616[num][t];
for(t1=0;t1<8;t1++)
{
if(temp&0x80)LCD_DrawPoint(x,y);
temp<<=1;
y++;
if(x>=lcddev.height){POINT_COLOR=colortemp;return;}//超区域了
if(size==32)
{
if((y-y0)==16)
{
y=y0;
x++;
if(x>=lcddev.width){POINT_COLOR=colortemp;return;}//超区域了
break;
}
}
else if((y-y0)==size)
{
y=y0;
x++;
if(x>=lcddev.width){POINT_COLOR=colortemp;return;}//超区域了
break;
}
}
}
}
  OINT_COLOR=colortemp;
}
最后是在添加一个数组即可:
const unsigned char asc2_1616[95][32]={
{
0x08,0x20,0x06,0x20,0x40,0x7E,0x31,0x80,0x00,0x00,0x49,0x00,0x6A,0xFF,0x5C,0x92
,0x48,0x92,0xFE,0xFE,0x88,0x92,0x9C,0x92,0xAA,0xFF,0x09,0x00,0x01,0x00,0x00,0x00},/*"潘",0*/
};
调用时如下 LCD_ShowChar(30,160,'0'+1,32,0) ;
即起始坐标为(30,160),显示文字为数组asc2_1616的第一个元素,大小为16*16,非叠加方式。
缺点是每次显示只能显示一个汉字,如需显示其他汉字在 数组asc2_1616添加相应的元素即可。
|