从0开始点亮OLED屏幕(五)OLED显示汉字,图片

1.OLED显示汉字:

size1/8+size1%8的作用是取出汉字所占页数,乘上字宽也就得出需要写的次数。(一次写8个竖着的像素点,原理前文有介绍过)利用画点函数吧八个竖着的像素数据画出来,x就往下自增1,当x的增量为字宽时,就移到下一页继续写,这个就是现实汉字的原理了。如果是从我第一篇文章看起,这个还是很容易理解的

//显示汉字
//x,y:起点坐标
//num:汉字对应的序号	
void OLED_ShowChinese(u8 x,u8 y,u8 num,u8 size1)
{
	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);
			temp>>=1;
			y++;
		}
		x++;
		if((x-x0)==size1)
		{x=x0;y0=y0+8;}
		y=y0;
	}
}

2.OLED显示图片

下面是OLED显示图片的代码:

//x,y:起点坐标
//sizex,sizey,图片长宽
//BMP[]:要写入的图片数组
void OLED_ShowPicture(u8 x,u8 y,u8 sizex,u8 sizey,u8 BMP[])
{
	u16 j=0;
	u8 i,n,temp,m;
	u8 x0=x,y0=y;
	sizey=sizey/8+((sizey%8)?1:0);
	for(n=0;n<sizey;n++)
	{
		 for(i=0;i<sizex;i++)
		 {
				temp=BMP[j];
				j++;
				for(m=0;m<8;m++)
				{
					if(temp&0x01)
                        OLED_DrawPoint(x,y);
					temp>>=1;
					y++;
				}
				x++;
				if((x-x0)==sizex)
				{
					x=x0;
					y0=y0+8;
				}
				y=y0;
			}
	 }
}

下面是利用取模软件取一张图片 

点击生成再保存到数组里面

u8 CL[] = {
0x80,0xE0,0xF0,0xF0,0xF0,0xF0,0xF8,0xFE,0xFF,0xFF,0xFF,0xFF,0xFE,0xF0,0xF0,0xF0,0xF0,0xF0,0xE0,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x41,0xF1,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF3,
0xE1,0xE1,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xE1,0x00,0xE0,0xF0,0xF8,0xF8,0xF0,0xE0,0xE0,0xF0,0xF8,0xF8,0xF8,0xF0,
0xE0,0x00,0x00,0x00,0x00,0x00,0x01,0x03,0x03,0x03,0x03,0x07,0x1F,0x3F,0x3F,0x3F,0x3F,0x1F,0x03,0x03,0x03,0x73,0xFB,
0xFC,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0x8F,0x87,0x8F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFC,0xFC,0xF8,0x70,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x19,0x3F,0x7F,0x7F,0x7F,0x7F,0x3F,0x3F,
0x3F,0x7F,0x7F,0x7F,0x7F,0x3F,0x01,0x01,0x00,0x00,/*双齿轮.bmp",0*/
/* (37 X 31 )*/
};

 其像素为/* (37 X 31 )*/,接下来主函数调用此函数

OLED_ShowPicture(0,0,37,31,CL);
OLED_Refresh();//更新显示

 当然主函数得包含此头文件#include "BMP.h",就可以显示出来了:

                                                           

是不是一模一样?当然调用显示图片函数其大小一定要输入正确,否则无法正常显示,比如 我代码这样写:

OLED_ShowPicture(0,0,48,48,CL);        OLED_Refresh();//更新显示 

                                

而OLED是这么显示的,乱码(第一张),根据程序的写法有关的,其中影响最大的是x坐标,y坐标不会影响到图片正常显示,只是空余地方会显示乱码比如代码这样写:OLED_ShowPicture(0,0,37,48,CL);        OLED_Refresh();//更新显示,第二张图片。我们程序是这么写的for(i=0;i<sizex;i++),也就是当宽度输入错误,它会把下一页数据继续写,也就是图片错位了。比如你有十个苹果,你每天只能吃两个才能正常吃五天,但是你第一天直接吃了五个,也就是本该后来再吃的你一天吃完了,你会发现你第二天的苹果已经吃了,你就继续吃后面的,也就导致图片显示错误。

  • 9
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值