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++),也就是当宽度输入错误,它会把下一页数据继续写,也就是图片错位了。比如你有十个苹果,你每天只能吃两个才能正常吃五天,但是你第一天直接吃了五个,也就是本该后来再吃的你一天吃完了,你会发现你第二天的苹果已经吃了,你就继续吃后面的,也就导致图片显示错误。