任克強,王傳強
(江西理工大學信息工程學院,江西 贛州 341000)
常用的顯示屏有LED、LCD、OLED 等[1-2],小型OLED 屏幕以其顯示效果好、顯示質量優(yōu)、價格便宜等特點,被廣泛地應用在小型嵌入式系統(tǒng)、單片機系統(tǒng)、電子產(chǎn)品等領域[3-5]。OLED 屏幕的驅動方式主要有8080 并口、IIC、SPI 等驅動方式[6-8]。對于8080 并口驅動方式,可使用高端處理器模擬8080接口時序或者使用帶有FSMC 接口的處理器完成驅動;對于IIC 和SPI 驅動方式,一些低端的處理器通過模擬時序也可以實現(xiàn)OLED 屏幕的驅動,但增加了處理器的負擔,并且OLED 屏幕顯示的字符、漢字、圖片等信息都需要取模后寫入到內部程序存儲器中,需占用大量的內存空間,對于內存較小的處理器,很容易被占滿,導致處理器無法處理其他任務[9-10]。
針對上述問題,本文設計了一種串口控制的小型OLED 屏幕驅動顯示系統(tǒng)。該系統(tǒng)采用了低成本的MCU 方案,外擴FLASH 存儲器用于存儲16×16、24×24、32×32 三種尺寸的GB2312 中文字庫[11];系統(tǒng)通過串口通道完成與外界的數(shù)據(jù)交換,實現(xiàn)OLED 屏幕上數(shù)字、字符、漢字、圖像等信息的顯示;因此只需要具有串口功能的處理器或者通過IO 口模擬串口功能即可使用該系統(tǒng),從而使得OLED 屏幕的使用得到簡化,一般的處理器均可使用OLED屏幕,擴展了OLED 屏幕的適應性和應用范圍。
本文設計的OLED 驅動顯示系統(tǒng)主要由OLED屏幕、接口轉換電路、STC8F1K08S2 處理器和W25Q16 FLASH 存儲器組成。系統(tǒng)硬件組成如圖1所示。
圖1 系統(tǒng)硬件框圖
本文使用的STC8F1K08S2 處理器采用SOP16封裝,體積小,易于嵌入,不需要配合任何外圍電路即可使用;內置晶振,頻率可選,最小5.529 6 MHz,最大27 MHz,本文選用22.118 4 MHz;處理器有14個IO 接口,內置硬件SPI 電路,并使用內置SPI 實現(xiàn)W25Q16 數(shù)據(jù)讀寫。本文將OLED 屏幕通過硬件接口轉換為SPI 驅動接口,并使用處理器IO 模擬SPI 時序實現(xiàn)對OLED 的驅動,之所以沒有使用硬件SPI,主要是避免2 個SPI 器件在驅動中互相影響。
W25Q16 內部Block 的內存劃分如表1 所示。
表1 W25Q16 內部Block 劃分
W25Q16 具有2 Mbyte 的FLASH 存儲空間,劃分為32 個Block,每個Block 有64 kbyte 空間[12]。在這些空間存儲了3 種尺寸 GB2312 字庫:256 kbyte 的16×16 尺寸字庫、576 kbyte 的24×24 尺寸字庫、1 024 kbyte 的32×32 尺寸字庫。字庫在FLASH 中地址分配如表2 所示,根據(jù)字庫的存儲地址和字庫尺寸,可以計算出不同字的偏移地址,根據(jù)偏移地址可以讀取字庫數(shù)據(jù)進行顯示。
表2 字庫在FLASH 中地址分配
小型OLED 屏幕有0.42、0.49、0.91、0.96、1.3 寸等多種不同尺寸,都可以通過硬件轉換成SPI 驅動方式與本系統(tǒng)連接。對于不同驅動IC 的OLED 屏幕,主要是屏幕的初始化不同,上層對屏幕的各種操作是相同的,因此可以根據(jù)不同驅動IC 調用不同初始化函數(shù)即可。本文采用0.96 寸驅動IC 為SSD1306 和1.3 寸驅動IC 為SH1106 兩種OLED 進行驅動測試。
系統(tǒng)軟件流程如圖2 所示。首先對系統(tǒng)和各個模塊進行初始化操作,打開串口接收中斷,然后進入系統(tǒng)控制部分,等待外部處理器發(fā)來的設置波特率指令,串口波特率控制指令如表3 所示,可通過發(fā)送對應的控制指令改變系統(tǒng)的波特率,從而可以適應不同性能的處理器,波特率設置完成后,將該波特率保存并覆蓋原有的默認波特率,系統(tǒng)初始默認波特率為9 600 bit/s。為了防止用戶設置外部處理器波特率出現(xiàn)不一致情況,在OLED 上電后會在屏幕顯示5 s 當前波特率。設置完波特率,等待串口接收來自外部的數(shù)據(jù)顯示和設置坐標指令:0x01 代表接收數(shù)字數(shù)據(jù),0x02 代表接收字符或者漢字數(shù)據(jù),0x03 代表接收圖像數(shù)據(jù);坐標軸為X軸和Y軸,X軸范圍0~127,Y軸范圍為0~7。通過指令對系統(tǒng)設置后,就開始接收來自外部處理器發(fā)來的數(shù)據(jù),驅動OLED 顯示相應的內容。
表3 串口波特率控制指令
圖2 系統(tǒng)軟件流程圖
通過串口將字庫文件寫入W25Q16 FLASH 中,為了準確判斷字庫文件是否成功地寫入到FLASH中,首先獲取各尺寸字庫的結束地址(即尾地址),然后根據(jù)尾地址和存儲在W25Q16 中的首地址進行計算可得各尺寸字庫在W25Q16 中的尾地址,字庫尾地址如表4 所示。在寫入過程中,串口每接收到一個數(shù)據(jù),地址自動加1,通過地址對比,就可判斷字庫文件是否成功寫入。字庫寫入程序流程如圖3 所示,三種尺寸的字庫依次寫入,首先寫入16×16 的,從W25Q16 的0 地址開始寫,每寫入1 byte,地址數(shù)據(jù)加1,直到地址等于0x03FE41 完成16×16 字庫的寫入;然后設置偏移地址為 0x040000,并從0x040000 開始寫入24×24 字庫,每寫1 byte 地址加1,直到地址等于0x0CFC11 完成24×24 字庫寫入;最后設置偏移地址為0x0D0000,并從0x0D0000 開始寫入32×32 字庫,每寫1 byte 地址加1,直到地址等于0x1CF901 完成32×32 字庫寫入。
表4 字庫尾地址
圖3 字庫寫入程序流程圖
在GB2312 中將漢字劃分為94 個區(qū),每個區(qū)有94 個位,即區(qū)和位。通過漢字的區(qū)和位就可以確定一個漢字在字庫中的偏移地址,然后就可以確定漢字的點陣數(shù)據(jù)。一個漢字是由兩個擴展的ASCII 碼表示,一個用來存放區(qū)碼,另一個用來存放位碼,也可以說漢字的高字節(jié)和低字節(jié),并且在區(qū)碼和位碼上分別加上了32,因此可以通過式(1)、式(2)求出漢字的區(qū)碼和位碼。
計算出區(qū)碼和位碼,根據(jù)式(3)可獲取漢字在字庫中的偏移地址,然后通過訪問該偏移地址,即可獲取該地址中存放的漢字點陣數(shù)據(jù)。
OLED 采用模擬4 線SPI 的方式進行驅動,驅動時序如圖4 所示。CS 在低電平時,芯片被選中,開始數(shù)據(jù)通信,在SCLK 低電平時,SDIN 作為信號線,而在每個SCLK 的上升沿,SDIN 會發(fā)出1 bit 數(shù)據(jù),在每個周期發(fā)送8 bit 的數(shù)據(jù),然后CS 拉高,完成一次數(shù)據(jù)通信。
圖4 OLED 4 線SPI 驅動時序
整個OLED 上層驅動主要包括波特率修改函數(shù)、顯示選擇函數(shù)、坐標定位函數(shù)、字體選擇函數(shù)、數(shù)字顯示函數(shù)、字符漢字顯示函數(shù)、圖像顯示函數(shù)。上述函數(shù)的數(shù)據(jù)均讀取自串口接收的數(shù)據(jù)。由于GB2312 中的每個字符都占有2 byte,因此對于單字節(jié)的字符可調用處理器內部的取模數(shù)據(jù),漢字調用外部FLASH 字庫數(shù)據(jù)。
在硬件方面,整個系統(tǒng)與市場上較流行的小型OLED 模塊相差無幾,兩者對比如圖5 所示,左邊為本文設計制作的OLED 驅動系統(tǒng),右邊為市場上較流行的小型OLED 模塊。
圖5 OLED 模塊對比圖
為了測試本文設計的小型OLED 屏幕驅動顯示系統(tǒng)的性能,通過控制OLED 驅動顯示,并調整不同的波特率,對數(shù)字、字符、漢字、圖像進行測試。
通過設定不同的坐標值,將不同尺寸的數(shù)字、字符、漢字進行顯示,顯示測試結果如圖6 所示。通過測試,整體顯示效果流暢,漢字、字符、數(shù)字能準確識別,顯示無亂碼現(xiàn)象,顯示位置可任意設置。
圖6 不同尺寸字體顯示測試
對圖像顯示進行測試,將一幅圖像完整顯示在屏幕上,測試結果如圖7 所示。顯示一張圖片,一次讀取的數(shù)據(jù)較多,由于不同波特率下數(shù)據(jù)讀取速率不同,因此圖片顯示的流暢度存在差異,在9 600 bit/s及以上波特率顯示效果較為流暢,刷新速率較快。在9 600 bit/s 以下波特率,顯示刷新速度較慢,在對速度要求不高的低端處理器可使用。
圖7 圖像顯示測試
OLED 屏幕被廣泛地應用在小型嵌入式系統(tǒng)、單片機系統(tǒng)、電子產(chǎn)品等,但OLED 屏幕的顯示內容需采用取字模的方式,很容易使得內存被占滿或溢出,并且OLED 屏幕的驅動也具有一定的復雜度。為方便用戶使用OLED 屏幕,本文采用MCU 控制方案,外加FLASH 芯片,通過串口對OLED 屏幕進行控制;可使用多種處理器通過串口或者模擬串口的方式進行OLED 屏幕驅動;本系統(tǒng)加入了3 種漢字字庫,大量節(jié)約了處理器的程序存儲空間;所有驅動都已載入本系統(tǒng),用戶不需考慮OLED 屏幕的驅動問題,只需通過串口發(fā)送指令數(shù)據(jù)即可完成驅動,簡化了OLED 屏幕的驅動使用。針對不同性能的處理器,可調節(jié)波特率,以適應不同處理器性能。由于使用串口通信,也可以使用藍牙等串口無線通信模塊,進行無線數(shù)據(jù)傳輸,拓展了OLED 的應用場景和適應范圍。經(jīng)測試整個系統(tǒng)運行穩(wěn)定可靠,可在不同波特率下正確接收串口指令和數(shù)據(jù),能夠正常顯示數(shù)字、字符、漢字和圖像,顯示效果流暢,能夠較好地滿足各種OLED 屏幕的顯示需求。