劉正翔
摘 要近年來,新興的OLED技術(shù)以其優(yōu)越的性能受到眾多應(yīng)用廠商的青睞。本文以STM32控制OLED顯示屏為例,通過介紹模塊硬件特性,闡述如何用STM32控制顯示屏,并給出關(guān)鍵的讀寫驅(qū)動(dòng)源碼,對(duì)OLED驅(qū)動(dòng)的應(yīng)用者具有一定的借鑒意義。
【關(guān)鍵詞】STM32 OLED 顯示屏
近年來,一種新興的有機(jī)發(fā)光二極管顯示器OLED,以其優(yōu)越的性能,在眾多的顯示屏器件中脫穎而出,廣泛應(yīng)用于商業(yè)領(lǐng)域和軍事領(lǐng)域中。傳統(tǒng)的小尺寸顯示屏大多采用LCD液晶顯示,雖然有較好的亮度和較低的功耗,但需要單獨(dú)給背光才可清晰看清楚顯示屏的數(shù)據(jù)信息,且液晶屏在黑位水平、對(duì)比度、厚度、視角、顏色均勻性等方面的性能,較之OLED性能相差甚遠(yuǎn)。
1 OLED屏硬件接口設(shè)計(jì)
為縮短研發(fā)周期,國內(nèi)一些公司將OLED屏組裝成模塊并引出模塊控制引腳。客戶只要根據(jù)模塊引腳即可控制OLED模塊進(jìn)行顯示。經(jīng)過比較,這里以廣州星翼電子科技有限公司推出的ATK-0.96 OLED模塊為例,介紹該顯示模塊屏與主控芯片的硬件接口電路設(shè)計(jì)。
該模塊工作溫度為-40~+70℃,內(nèi)部自帶升壓電路,分辨率為128*64像素,采用SSD1306驅(qū)動(dòng)芯片,僅需3.3V供電即可。該模塊支持8位6800并口、8位8080并口、I2C總線、4線SPI總線等四種通信接口方式,通過背面兩個(gè)焊點(diǎn)可設(shè)置模塊接口方式:都為高電平時(shí),為8位8080并口模式。模塊出廠默認(rèn)該模式。
本文即是采用默認(rèn)的8080并口模式,通過排針與外部的STM32通信,使用到的引腳與LCD液晶模塊大同小異:除了電源與接地引腳外,主要的引腳為CS片選信號(hào);RW寫入數(shù)據(jù)信號(hào);RS讀取數(shù)據(jù)信號(hào);D[0-7]8位雙向數(shù)據(jù)線信號(hào);RST復(fù)位;DC數(shù)據(jù)或指令選擇信號(hào)等。為了控制OLED模塊只要先選擇輸入的是指令還是數(shù)據(jù),然后設(shè)置片選引腳為低電平,設(shè)置寫信號(hào)使能并將數(shù)據(jù)寫到數(shù)據(jù)線上,即可進(jìn)行數(shù)據(jù)的讀寫操作。
由于STM32的GPIO端口都是16位的,為了與模塊連接,只要選擇STM32其中一個(gè)PA端口(也可選擇其他通用端口)中的5個(gè)通用引腳作為模塊的控制信號(hào)線,再選擇另一個(gè)PB端口的低8位通用引腳作為數(shù)據(jù)線與模塊通信即可。這里選擇PA端口用做控制信號(hào),PB端口用作數(shù)據(jù)線。由于引腳連接較為簡單,不再圖示。具體是:PA0連DC腳,PA1連片選CS,PA2連RD腳,PA3連RW腳,PA4連RST腳。PB0-PB7連數(shù)據(jù)線D0-D7腳。
2 OLED模塊的程序設(shè)計(jì)
2.1 初始化程序設(shè)計(jì)
OLED屏與液晶屏類似,在應(yīng)用前都需要進(jìn)行初始化。整個(gè)初始化工作為一系列顯示控制芯片的設(shè)置工作,主要包括關(guān)閉顯示、設(shè)置時(shí)鐘分頻因子、設(shè)置顯示偏移、設(shè)置內(nèi)存地址、行列起始地址等。每個(gè)顯示模塊廠商均提供該初始化源碼,由于每個(gè)廠家提供的初始化源碼不同,這里就不再詳細(xì)闡述,讀者可查看廠家說明書,直接參考源碼即可。
2.2 讀寫數(shù)據(jù)/指令
進(jìn)行顯示屏模塊的讀寫操作,實(shí)際上就是與模塊內(nèi)的控制芯片進(jìn)行通信。若進(jìn)行寫數(shù)據(jù)/指令,則設(shè)置DC為低電平選擇指令線,拉低片選并設(shè)置RW上升沿,使得數(shù)據(jù)寫入到顯示模塊中。數(shù)據(jù)寫入顯示模塊即寫入到顯存與屏幕對(duì)應(yīng)的位置。若進(jìn)行讀數(shù)據(jù),則設(shè)置DC為高電平選擇數(shù)據(jù)線。然后拉低片選并設(shè)置RD上升沿,使得數(shù)據(jù)鎖存到數(shù)據(jù)線上,即可在引腳上可讀取到數(shù)據(jù)。具體的時(shí)序圖讀者可參考廠家說明書。下面以向顯示模塊進(jìn)行一次寫操作的函數(shù)為例說明。
Void WR_Byte()
{
RS_Set(); //DC=1表示寫數(shù)據(jù)
CS_Clr(); //拉低片選
WR_Clr(); //WR的上升沿開始寫入數(shù)據(jù)
WR_Set();
CS_Set();
RS_Set();
}
若要向顯示模塊寫入一個(gè)字節(jié)數(shù)據(jù),則在寫操作函數(shù)基礎(chǔ)上送入數(shù)據(jù)即可。由于主控芯片的IO端口是16位的,因此需要屏蔽高8位,只送入低8位,以避免不必要的影響。因此向顯示模塊寫入一個(gè)字節(jié)的源碼只要添加下面這行代碼即可:
GPIOB->ODR=(GPIOB->ODR&0xff00)|(x&0x00FF);
讀操作與寫操作類似,這里就不詳細(xì)闡述。
2.3 顯存編碼思路
輸入OLED模塊的數(shù)據(jù)之所以能顯示到屏幕上,是因?yàn)閮?nèi)部有一個(gè)顯存,該顯存與模塊屏幕上的像素點(diǎn)是一一對(duì)應(yīng)的關(guān)系。只要把數(shù)據(jù)送到顯存對(duì)應(yīng)的地址上,就會(huì)按顯存的地址顯示到屏幕上。SSD1306的顯存為128*64bit,分為8頁,每頁128個(gè)字節(jié)??梢园扬@存想象成一個(gè)屏幕,屏幕上的每個(gè)像素點(diǎn)就是顯存的一個(gè)存儲(chǔ)位置?,F(xiàn)在考慮,若要畫一個(gè)圖形或漢字,是否直接寫入字節(jié)就可以實(shí)現(xiàn)全部的情況?由于每次寫入都是按字節(jié)寫入的。也就是說,每次都必須寫入8個(gè)像素點(diǎn)。若有一次寫入時(shí),8位像素點(diǎn)中,低2位的像素點(diǎn)剛好是相鄰圖形的一個(gè)組成部分,此時(shí)再寫入完整一個(gè)字節(jié),就會(huì)把原來的圖形覆蓋掉2個(gè)像素點(diǎn)。為解決該問題,最簡單的解決方法是,先將該字節(jié)的8個(gè)位讀取出來,按要求修改完寫入的位,然后重新寫入。該方法缺陷是,每次都要先讀取,再寫入,消耗了時(shí)間。另一種方法,新建一個(gè)128*8字節(jié)的二維數(shù)組GRAM[i][j],修改時(shí),直接在數(shù)據(jù)上修改,修改完一次性寫到OLED的顯存里。此思路雖然方便STM32對(duì)該模塊的控制,但需要一定內(nèi)存空間,因此對(duì)內(nèi)存小的單片機(jī)可能就不太合適。
3 結(jié)論
本文闡述了OLED顯示屏模塊的結(jié)構(gòu)、硬件電路設(shè)計(jì)及軟件關(guān)鍵讀寫函數(shù)編寫等。通過項(xiàng)目實(shí)踐,對(duì)選用的顯示模塊應(yīng)用可能遇到的問題進(jìn)行總結(jié),給出顯示屏硬件接口電路,及其關(guān)鍵驅(qū)動(dòng)源代碼,對(duì)顯示屏應(yīng)用有一定的借鑒意義。
參考文獻(xiàn)
[1]翁夢(mèng)婷.OLED顯示驅(qū)動(dòng)控制電路的設(shè)計(jì)[D].浙江大學(xué)碩士學(xué)位論文,2016(01).
[2]張洋,劉軍.原子教你玩STM32(庫函數(shù)版)第2版[M].北京:航空航天大學(xué)出版社,2015(11).
[3]劉火良,楊森.STM32庫開發(fā)實(shí)戰(zhàn)指南[M].北京:機(jī)械工業(yè)出版社,2013(06).
作者單位
福州職業(yè)技術(shù)學(xué)院 福建省福州市 350108