STM32使用OLED模块(SSD1306):OLED_DrawBMP()

#函数实现

/**********************************************
  * @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个像素,占用的显存空间如下图所示:

image-20210208201720995

对显存的每页进行操作时,要先向芯片发送页地址和起始列地址进行定位,即OLED_Set_Pos(x0,y);

然后以字节为单位填充24个字节的数据,重复3次,完成向显存写入图片对应的字摸。

根据如上所示的函数,我们如果要把这张图显示在左上角,就要将x0,y0设为0,x1,y1分别设为24和3,表示一行有24个像素点,总共跨越3个页面

posted @ 2021-02-08 20:18  cnwanglu  阅读(2177)  评论(0编辑  收藏  举报