SSD1306俗讲5

汉字的显示
如果理解了前面所讲,那么这节讲的完全可以领会,取模方式和第三节一样

//显示汉字
//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(size1
24)
{temp=Hzk2[num][i];}//调用2424字体
else if(size1==32)
{temp=Hzk3[num][i];}//调用32
32字体
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个格
并且每次写完一个字节 都要记录纵坐标的地址

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值