图片的显示
这个图片的取模方式和第三讲一样
先附上代码
//x,y:起点坐标
//sizex,sizey,图片长宽
//BMP[]:要写入的图片数组
//mode:0,反色显示;1,正常显示
void OLED_ShowPicture(u8 x,u8 y,u8 sizex,u8 sizey,u8 BMP[],u8 mode)
{
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,mode);
else OLED_DrawPoint(x,y,!mode);
temp>>=1;
y++;
}
x++;
if((x-x0)==sizex)
{
x=x0;
y0=y0+8;
}
y=y0;
}
}
}
sizey=sizey/8+((sizey%8)?1:0)
代表算出纵坐标有多少个字节,距离64*128的图片,纵坐标有8个字节
for(n=0;n<sizey;n++)
最大循环把这8个字节全部写入显存,由于取模是行列式,一定要注意这里的取模方式,所以没写完一个字节,横坐标要++
for(i=0;i<sizex;i++)
temp=BMP[j];
从数组0元素开始取,取完j++
每个数组元素有8个bit
for(m=0;m<8;m++)
{
if(temp&0x01)OLED_DrawPoint(x,y,mode);
else OLED_DrawPoint(x,y,!mode);
temp>>=1;
y++;
}
然后调用画点函数,由于是低位像素再显存的上方,所以 从低位取temp>>=1; y++ 就是纵坐标+1
整个字节写完后 x加1
if((x-x0)==sizex)
如果写完了一行,x=x0 x0记录的是图片的初始横坐标,y0需要下降8行,y=y0,记录y0是方便下一次直接+8,从新定位y的地址
切记这个函数的取模方式是行列式,如果你的取模不一样,那么需要修改此函数