在電子設備的顯示領域,OLED 顯示屏憑借其出色的顯示效果和低功耗等優(yōu)勢,得到了廣泛應用。本文將聚焦于兩種不同尺寸的 OLED 顯示屏 ——0.96 寸和 0.91 寸,它們均采用 4 引腳 I2C 接口,這種接口在數(shù)據(jù)傳輸和控制方面具有獨特的優(yōu)勢。

值得一提的是,經(jīng)過項目測試發(fā)現(xiàn),本文所介紹的驅動方式和代碼也完全適用于 1.54 寸 SSD1309 主控的 1.54 寸 OLED 和 1.29 寸 CH1115 主控的 OLED 屏。如果需要更大的屏幕可以選用這兩款,但是他們的分辨率仍然是 126*64,只是顯示的字體和圖案可以更大。
0.96 英寸 OLED 顯示屏工作電壓范圍為 3.3 - 5V,內(nèi)置 3.3V LDO,其 I2C 通信接口電平為 3.3V。像素點陣規(guī)模達到 128x64,意味著共有 8192 顆 LED 參與顯示,驅動 IC 采用 SSD1306。而 0.91 英寸 OLED 顯示屏同樣工作在 3.3 - 5V 電壓下,內(nèi)置 3.3V LDO,I2C 通信接口電平也是 3.3V,不過其像素點陣規(guī)模為 128x32,僅有 4096 顆 LED,驅動 IC 同樣為 SSD1306。由此可見,0.91 英寸的像素點規(guī)模只有 0.96 英寸的一半,除此之外其余參數(shù)基本相同。接下來將主要介紹 0.96 英寸顯示屏的使用方法。
該 OLED 顯示屏的接口定義清晰明確。VCC 為模塊電源正,可接入 3.3 - 5V 電源;GND 是模塊電源地;SCL 為模塊 I2C 總線時鐘信號;SDA 則是模塊 I2C 總線數(shù)據(jù)信號。在硬件設計方面,模塊內(nèi)置了型號為 662K 的 3.3V LDO,因此支持 3.3 - 5V 供電。同時,模塊已經(jīng)板載了 SCL 和 SDA 線的上拉電阻,且上拉到了 3.3V。如果單片機是 5V 的,只要將 IO 配置為開漏輸出,就可以直接接入到模塊,不過需要注意的是,3.3V 能否被 5V 單片機識別為高電平,這需要查看單片機的數(shù)據(jù)手冊,一般情況下是沒有問題的。此外,當其他 I2C 從機掛接到同一個 I2C 總線時,無需再外接 I2C 總線的上拉電阻。模塊的 I2C 從機地址為:0111 10 [SA0] [RW],其中 SA0 是硬件地址選擇位,當 SA0 接高電平時,地址中的 SA0 就是 1,當 SA0 接低電平時,地址中的 SA0 就是 0。模塊出廠的時候,一般 SA0 是接的低電平,用戶可以自己動手修改模塊后面的電阻來改變 SA0 為高電平,這也意味著,同一個 I2C 總線多支持掛接 2 個 OLED 模塊。

在 SSD1306 的 I2C 協(xié)議中,控制字節(jié)起著關鍵作用,其控制位的格式為:[Co][D/C#][000000]。在發(fā)送指令字節(jié)或者數(shù)據(jù)字節(jié)前,需要先發(fā)送一個控制字節(jié),通過控制字節(jié)中的 D/C# 位,來告訴 SSD1306,接下來發(fā)送的一個字節(jié)是指令還是數(shù)據(jù)。這里我們先不考慮控制字節(jié)中 Co 位的作用,這樣就可以編寫出發(fā)送單個字節(jié)的指令和單個字節(jié)的數(shù)據(jù)的函數(shù)。發(fā)送單個字節(jié)指令的流程為:起始信號【從機地址,ACK】【控制字節(jié),ACK】【單字節(jié)的指令,ACK】結束信號;發(fā)送單個字節(jié)顯存數(shù)據(jù)的流程為:起始信號【從機地址,ACK】【控制字節(jié),ACK】【單字節(jié)的數(shù)據(jù),ACK】結束信號。然而,每次發(fā)送一個指令或者數(shù)據(jù)字節(jié),都要開啟完整的 I2C 通信時序流程,會造成大量的通信時間浪費,特別是在快速刷屏的時候。為了提高效率,當控制字節(jié)中 Co = 0,且 D/C# = 1 時,則接下來可以連續(xù)發(fā)送任意多個顯存數(shù)據(jù)字節(jié),直到產(chǎn)生停止信號。通過在 0.91 英寸 OLED 屏幕上測試發(fā)現(xiàn),使用 150KHz I2C 總線,刷完一幀屏幕,使用單個發(fā)送字節(jié)顯存數(shù)據(jù)函數(shù)需要大約 100ms,而使用性發(fā)送多個顯存數(shù)據(jù)的函數(shù)則只需要大約 33ms,速度提升非常明顯。

理解 SSD1306 數(shù)據(jù)手冊中的指令集對于正確驅動 OLED 顯示屏至關重要。以截取的 3 條指令為例,指令 A 用于設置頁地址,它由連續(xù)的 3 個字節(jié)組成,個字節(jié) 0x22 代表指令碼,用于標識指令功能本身,后面的兩個字節(jié) A [2:0] 和 B [2:0] 則是兩個指令參數(shù),指令參數(shù)是指令運行時所需的參數(shù)數(shù)據(jù)。指令 B 比較特殊,它將指令碼和指令參數(shù)融合為了一個字節(jié),高位部分固定為 [10110],低位部分 [X2,X1,X0] 則用于編碼指令參數(shù)。指令 C 只有一個固定的指令碼,沒有指令參數(shù),類似于 C 語言中的無參數(shù)函數(shù)。表格的列 D/C#,用于告訴我們,發(fā)送對應的字節(jié)時,需要將 D/C# 位設置為 0 還是 1。D/C# = 0 代表發(fā)送的是指令性相關的數(shù)據(jù),這些字節(jié)數(shù)據(jù)被 SSD1306 接收并解析,主要用于改變屏幕的工作參數(shù);D/C# = 1 代表發(fā)送的是顯示數(shù)據(jù)字節(jié),這些字節(jié)將被寫入到 SSD1306 的顯存 GDDRAM 中作為顯示數(shù)據(jù)使用。

驅動芯片 SSD1306 帶有一個 128x64 bit 大小的 GDDRAM,用于存放顯示數(shù)據(jù),也就是所謂的顯存。顯存中的數(shù)據(jù)與顯示內(nèi)容是息息相關的,具體來說,顯存中的每一個 bit 對應一顆像素點,如果顯存中的某個 bit 為 1,則它對應的那顆像素 LED 被點亮,否則是熄滅的。GDDRAM 支持 3 種內(nèi)存尋址模式,分別為頁尋址模式、水平尋址模式和垂直尋址模式,其中頁尋址模式為常用。當使用頁尋址模式時,GDDRAM 被劃分為 8 個頁:PAGE0 - PAGE7,每個頁由 128 個字節(jié)組成。通過單片機向 GDDRAM 中寫入數(shù)據(jù)時,需要指定 2 個地址:頁地址和列地址,這樣才能定位到 GDDRAM 中的一個的字節(jié)存儲單元。在頁尋址模式下,每次寫入一個字節(jié)的顯示數(shù)據(jù),列地址自動增 1。當列地址超過 127 時,會自動回歸到 0,但頁指針不會改變,除非使用指令重新設置指向其他的頁。設置頁地址和列地址需要通過查看 SSD1306 的指令表,其中列地址需要拆成 2 部分寫入,用條指令發(fā)送列地址值的低 4bit 部分,用第二條指令發(fā)送列地址值的高 4bit 部分。配置尋址模式為頁尋址模式時,先發(fā)送指令碼 0x20,來告訴屏幕要現(xiàn)在要設置內(nèi)存尋址模式,然后發(fā)送指令參數(shù):0x00 水平地址模式,0x01 垂直模式,0x02 頁地址模式。芯片復位后默認就是頁尋址模式。

在 OLED 顯示屏上顯示圖片和漢字,需要借助 Pctolcd2002 這款取模軟件。以顯示圖片為例,首先要準備一張尺寸與 OLED 屏顯示需求同等比例的圖片,例如要在 0.96 英寸 OLED 上顯示一張 128 寬,64 高的圖片,則準備一張 378x189 的意法半導體 logo 圖片。用 Windows 自帶的畫圖軟件打開它,調(diào)整大小為想要的像素規(guī)模,然后保存為 BMP 格式。接著打開 Pctolcd2002 軟件,將菜單欄【模式】修改為圖形模式,通過【文件】【打開】選中上一步生成的 BMP 圖像。點擊工具欄的【齒輪】按鈕,在彈出的界面中按照特定要求進行配置,配置完成后點擊【確定】返回主界面。在主界面中,若生成的點陣預覽圖有細節(jié)瑕疵,可以使用鼠標進行修補,左鍵增加一個像素,右鍵取消一個像素。點擊主界面右下角的【生成子模】按鈕,即可輸出子模字節(jié)數(shù)據(jù)。將這個子模數(shù)據(jù)以一維字節(jié)數(shù)組的形式定義在 C 程序中,就可以使用了。由于【取模方式】用的是【列行式】,對于頁尋址模式非常方便。顯示漢字時,打開 Pctolcd2002 軟件,將菜單欄【模式】修改為字符模式,【選擇字體】,設置【字寬和字高】。在下方輸入需要取模的漢字,然后點擊【生成字?!?。實際使用過程中,為了達到比較好的顯示效果,漢字一般使用 16x16 寬和高。Pctolcd2002 軟件把每一個漢字當做一個基本的圖像來進行取模,且按照輸入的文字依次進行取模。在顯示漢字的時候,要先按順序顯示每個字的上半部分,然后換到下一個 page,再按順序顯示每個字的下半部分。
不同尺寸的 OLED 顯示屏在初始化序列上略有差異。對于 0.96 寸 IIC 接口 OLED,初始化時首先要初始化驅動 I2C 總線的引腳,延時 200ms 等待 OLED 穩(wěn)定。然后依次發(fā)送一系列指令,如關閉顯示、設置列地址、頁地址、對比度控制、掃描方向等參數(shù),開啟電荷泵并打開 OLED 面板,同時清除屏幕顯示。而 0.91 寸 IIC 接口 OLED 的初始化過程類似,但部分指令參數(shù)有所不同,同樣需要初始化 I2C 總線引腳,延時等待穩(wěn)定后,發(fā)送相應的指令來配置屏幕的工作參數(shù),打開顯示并清除屏幕。
通過以上對 OLED 顯示屏 I2C 接口的詳細介紹,我們可以全面了解其從硬件設計到軟件編程,再到圖片和漢字顯示的整個過程,為在實際項目中應用 OLED 顯示屏提供了堅實的理論基礎和實踐指導。
關鍵詞:I2C 接口