#函數實現
/**********************************************
* @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個頁面