• 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个页面

  • 相关阅读:
    数组——遍历
    数组常用方法——汇总
    箭头函数
    overflow:auto产生的滚动条在安卓系统下能平滑滚动,而在ios下滚动不平滑
    浅谈过载保护
    tornado中使用torndb,连接数过高的问题
    如何开启并查看博客园MetaWeblog接口的xml-RPC协议访问地址
    aardio陷阱(转)
    aardio获取公网IP地址代码
    sql常用函数学习笔记整理
  • 原文地址:https://www.cnblogs.com/Irvingcode/p/14390738.html
Copyright © 2020-2023  润新知