首先是看開發指南有一段話不能理解:
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顯存存放格式。
圖片2是例程中定義的OLED_GRAM[128][8]。
圖片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的芯片手冊。