#函数实现
/**********************************************
* @brief 显示图片 (后期加上参数检验)
* @param x0 : 列地址-起(0~127)
y0 : 页地址-起(0~7)
x1 : 列地址-终(0~127)
y1 : 页地址-终(0~7)
BMP: 存储图片的数组
* @retval None
**********************************************/
void OLED_DrawBMP(unsigned char x0, unsigned char y0,unsigned char x1, unsigned char y1,unsigned char BMP[])
{
unsigned int j=0;
unsigned char x,y;
/* 不知道有啥用 */
// if(y1%8==0) y=y1/8;
// else y=y1/8+1;
for(y=y0;y<y1;y++)
{
OLED_Set_Pos(x0,y);//显存操作的单位是页
for(x=x0;x<x1;x++)
{
OLED_WR_Byte(BMP[j++],OLED_DATA);
}
}
}
#原理
我使用的是0.96寸的OLED显式模块,128×64像素
太硬件的原理就不说了,这里我主要是想说明如何让一个像素亮起来的
SSD1306里有对应128*64像素的128*64bit 的GDDRAM显存
这样的话,每个像素点就对应显存中的1位,该位为1表示亮,为0表示不亮
SSD1306是将128*64bit的显存分了8页(page),以页为单位来操作。这样每个页为128字节(Btye);每页中对应的字节成为列,也即将显存分为128列(不好理解的话想象成矩阵,8页就是8行,每行128列)
这里先忽略图片的取膜方式和走向,这根据用的平台不同而不同
当你有了一张图片的字摸时,假设你的图片大小是24*24像素,这时你的字摸大小为24*24/8=72 Byte的一维数组
因为SSD1306是按照页分组的,那么我们应该先确定这张图占用了几页
图片横向(不妨设为x)占用24个像素,纵向(不妨设为y)占用24个像素,占用的显存空间如下图所示:
对显存的每页进行操作时,要先向芯片发送页地址和起始列地址进行定位,即OLED_Set_Pos(x0,y);
然后以字节为单位填充24个字节的数据,重复3次,完成向显存写入图片对应的字摸。
根据如上所示的函数,我们如果要把这张图显示在左上角,就要将x0,y0设为0,x1,y1分别设为24和3,表示一行有24个像素点,总共跨越3个页面