首先是看開發指南有一段話不能理解:

OLED_GRAM[128][8]中的 128 代表列數(x 座標) ,而 8 代表的是頁,每頁又包含 8 行,
總共 64 行(y 座標) 。從高到低對應行數從小到大。比如,我們要在 x=100,y=29 這個點寫入
1,則可以用這個句子實現:
OLED_GRAM[100][4]|=1<<2;
一個通用的在點(x,y)置 1 表達式為:
OLED_GRAM[x][7-y/8]|=1<<(7-y%8);

然後就在網上找了找,有人説就是將座標轉換為GRAM地址。還是不能理解,然後找到一篇相對容易理解的,記錄一下


接下來進入正題

如圖片1所示,這是OLED顯存存放格式。

OLED_Refresh_Gram_php

 

圖片2是例程中定義的OLED_GRAM[128][8]。

OLED_Refresh_Gram_OLED_Refresh_Gram_02

 

 圖片3是原例程中OLED_Refresh_Gram()函數,以i=0為例:

step1:  執行OLED_WR_Byte (0xb0+0,OLED_CMD);
           即設置OLED顯存頁指針指向第0頁。

step2:  執行OLED_WR_Byte (0x00,OLED_CMD);
                 OLED_WR_Byte (0x10,OLED_CMD); 
           即設置OLED顯存列指針指向第0列。

step3:  執行for(n=0;n<128;n++)
                      OLED_WR_Byte(OLED_GRAM[n][0],OLED_DATA); 
           當n=0時,將OLED_GRAM[0][0]寫入OLED顯存的0頁0列;然後,OLED顯存列指針加1,即指向0頁2列;
           當n=1時,將OLED_GRAM[1][0]寫入OLED顯存的0頁1列;然後,OLED顯存列指針加1,即指向0頁3列;
           ...
           一直到n=127,將OLED_GRAM[127][0]寫入OLED顯存的0頁127列;然後,OLED顯存列指針返回,即指向第0列;

這樣,就將OLED_GRAM的第0列寫入到OLED顯存的第0頁裏了。

這裏,有一個問題需要注意,SSD1306的哪個指令指定了頁指針、列指針的行走方式呢?個人估計應該存在於圖片4當中,在SSD1306的芯片手冊中缺乏詳細的指令例子説明,對SSD1306指令比較熟悉的大神可以討論一下。

總結:1.理解OLED_GRAM的定義,需要仔細閲讀OLED_Refresh_Gram()函數的執行過程;
         2.要理解OLED_Refresh_Gram()的執行過程,需要理解頁指針、列指針的行走方式,這需要仔細閲讀SSD1306的芯片手冊。

OLED_Refresh_Gram_php_03

 

 

OLED_Refresh_Gram_OLED_Refresh_Gram_04