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個頁面


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM