汉字的显示
如果理解了前面所讲,那么这节讲的完全可以领会,取模方式和第三节一样
//显示汉字
//x,y:起点坐标
//num:汉字对应的序号
//mode:0,反色显示;1,正常显示
void OLED_ShowChinese(u8 x,u8 y,u8 num,u8 size1,u8 mode)
{
u8 m,temp;
u8 x0=x,y0=y;
u16 i,size3=(size1/8+((size1%8)?1:0))*size1; //得到字体一个字符对应点阵集所占的字节数
for(i=0;i<size3;i++)
{
if(size1==16)
{temp=Hzk1[num][i];}//调用16*16字体
else if(size1==24)
{temp=Hzk2[num][i];}//调用24*24字体
else if(size1==32)
{temp=Hzk3[num][i];}//调用32*32字体
else if(size1==64)
{temp=Hzk4[num][i];}//调用64*64字体
else return;
for(m=0;m<8;m++)
{
if(temp&0x01)OLED_DrawPoint(x,y,mode);
else OLED_DrawPoint(x,y,!mode);
temp>>=1;
y++;
}
x++;
if((x-x0)==size1)
{x=x0;y0=y0+8;}
y=y0;
}
}
u16 i,size3=(size1/8+((size1%8)?1:0))*size1; //得到字体一个字符对应点阵集所占的字节数
老样子,以前第一步第一是干这个
for(i=0;i<size3;i++)最大的循环 把一个汉字所有的字节循环一遍就可以把整个显示出
实际是取数组的 某一字节 代表某个字
if(size116)
{temp=Hzk1[num][i];}//调用16*16字体
else if(size124)
{temp=Hzk2[num][i];}//调用2424字体
else if(size1==32)
{temp=Hzk3[num][i];}//调用3232字体
else if(size1==64)
{temp=Hzk4[num][i];}//调用64*64字体
else return;
依次取字节
注意这一段,这里没有采用标准的字库,一般情况下 12864只会显示很少一部分,可以根据需要自己生成字库,而且一个GB2312 500K左右,单片机不用外置存储很难放下。
取出这个字的 第一个字节后,从它的最低位开始显示,然后temp>>=1,这里再强调一次,这是因为取模是逆向,每显示一个bit后 纵坐标++
显示完8个bit 后 ,横坐标++,这里再次强调因为是行列式取模
if((x-x0)==size1)
{x=x0;y0=y0+8;}
y=y0;
当x++到最后一列,
需要把x再次重新定位为初始地址,纵坐标需要比上次下降8个格
并且每次写完一个字节 都要记录纵坐标的地址