STM32驅(qū)動0.96寸OLED液晶屏
目錄
序言
OLED簡介
模塊介紹
引腳定義
SSD1306控制芯片驅(qū)動
時(shí)序圖講解
SSD1306常用命令
命令設(shè)置SSD1306
如何顯示字符
測試結(jié)果
資料下載
序言
液晶屏通常作為嵌入式設(shè)備的顯示終端,用于顯示一些關(guān)鍵信息,將信息直接顯示在一塊小的液晶屏幕上。
液晶屏除了可以作為顯示終端外,還可以作為調(diào)試信息輸出的一個終端。
在調(diào)試硬件程序的時(shí)候,通常會對程序進(jìn)行調(diào)試,想輸出一些狀態(tài)或者信息來體現(xiàn)程序當(dāng)前的運(yùn)行狀態(tài),一般我們會選擇串口打印輸出內(nèi)容,或者LED的不同閃爍頻率代表不同狀態(tài),當(dāng)然我們也可以使用一個液晶屏來顯示不同內(nèi)容,這種方式也是十分的方便快捷的。
OLED簡介
OLED,即有機(jī)發(fā)光二極管(Organic Light-Emitting Diode),又稱為有機(jī)電激光顯示(Organic Electroluminesence Display, OELD)。OLED由于同時(shí)具備自發(fā)光,不需背光源、對比度高、厚度薄、視角廣、反應(yīng)速度快、可用于撓曲性面板、使用溫度范圍廣、構(gòu)造及制程較簡單等優(yōu)異之特性,被認(rèn)為是下一代的平面顯示器新興應(yīng)用技術(shù)。
LCD都需要背光,而OLED不需要,因?yàn)樗亲园l(fā)光的。這樣同樣的顯示,OLED效果要來得好一些。OLED的尺寸難以大型化,但是分辨率確可以做到很高。
模塊介紹
尺寸:0.96寸
控制芯片:SSD1306
管腳數(shù)量:7
引腳間距:2.54mm
分辨率:128*64,可以顯示漢字、ASCII、圖案,對比度高
可視角度:>160度
無需背光(OLED屏的特點(diǎn))
供電:3V-5V
有的模塊是不跟5V接口兼容的,使用前一定要確認(rèn)好。
引腳定義
GND:電源地
VCC:2.2V~5.5V
D0:SCL,CLK時(shí)鐘
D1:SDA,MOSI數(shù)據(jù)
RES:RST復(fù)位
D/C:數(shù)據(jù)/命令選擇
CS:片選,接地
此模塊可以采用SPI或IIC通信方式,最多只需要4個IO口既可驅(qū)動。
SPI電路連接:
GND---地
VCC---3.3V或5V
D0---接單片機(jī)IO,作為SPI總線的CLK時(shí)鐘引腳,時(shí)鐘
D1---接單片機(jī)IO,作為SPI總線的MOSI數(shù)據(jù)引腳,數(shù)據(jù)輸入
RES---接單片機(jī)IO
D/C---接單片機(jī)IO,高電平為寫數(shù)據(jù),低電平為寫命令
CS---片選,接地(可不連接單片機(jī)IO),選中SSD1306
IIC電路連接:
GND---地
VCC---3.3V或5V
D0---接單片機(jī)IO,作為IIC的SCL引腳
D1---接單片機(jī)IO,作為IIC的SDA引腳
CS---接地
SSD1306控制芯片驅(qū)動
時(shí)序圖講解
我們以STM32單片機(jī)為例,使用5個GPIO模擬SPI總線與SSD1306總線進(jìn)行通訊。
因?yàn)镾TM32與OLED屏的通訊只是單向數(shù)據(jù)傳輸,即只存在STM32向OLED屏發(fā)送數(shù)據(jù),不涉及到讀取返回?cái)?shù)據(jù),所以我們要實(shí)現(xiàn)顯示功能之前,需要根據(jù)SPI寫操作時(shí)序圖,先實(shí)現(xiàn)一個向SSD1306寫入一個字節(jié)的函數(shù)實(shí)現(xiàn)。
SSD1306使用4Wire SPI寫操作的時(shí)序圖
封裝一個向SSD1306寫入一個字節(jié)的函數(shù),
函數(shù)原型為:
void OLED_WR_Byte(uint8_t dat,uint8_t cmd);
其中:
dat為待寫入的數(shù)據(jù)或者命令;
cmd為數(shù)據(jù)或命令標(biāo)志,0表示命令;1表示數(shù)據(jù)。
由上面SPI操作的時(shí)序圖可知,IO引腳的時(shí)序如下所示:
首選看發(fā)送的字節(jié)是命令還是數(shù)據(jù),如果是命令,OLED_DC(D/C)引腳置0,即低電平;如果是數(shù)據(jù),OLED_DC(D/C)引腳置1,即高電平。
if(cmd)
OLED_DC_Set();
else
OLED_DC_Clr();
片選OLED_CS(CS)引腳置0,即拉低(硬件電路中CS引腳也可以直接與GND相連,這樣就不用操作CS引腳了)。
OLED_CS_Clr();
1個字節(jié)的數(shù)據(jù)有8位,將8位數(shù)據(jù)由高到低的順序發(fā)出,數(shù)據(jù)要在OLED_SCLK(D0)引腳的上升沿之前設(shè)置好,所以要先將OLED_SCLK(D0)置低,然后將一位數(shù)據(jù)送至OLED_SDIN(D1)引腳,然后將OLED_SCLK(D0)置高,這樣一位數(shù)據(jù)就發(fā)送出去了,如此循環(huán)8次,一個字節(jié)的數(shù)據(jù)就發(fā)送出去了。
for(i=0;i<8;i++)
{
OLED_SCLK_Clr();
if(dat&0x80)
OLED_SDIN_Set();
else
OLED_SDIN_Clr();
OLED_SCLK_Set();
dat<<=1;
}
8位數(shù)據(jù)發(fā)送完畢之后,將OLED_CS(CS)引腳拉高,即置1,恢復(fù)至初始狀態(tài)。
OLED_CS_Set();
OLED_CS_Set();
OLED_DC_Set();
*代碼完整實(shí)現(xiàn)
void OLED_WR_Byte(uint8_t dat,uint8_t cmd){
uint8_t i;
if(cmd)
OLED_DC_Set();
else
OLED_DC_Clr();
OLED_CS_Clr();
for(i=0;i<8;i++)
{
OLED_SCLK_Clr();
if(dat&0x80)
OLED_SDIN_Set();
else
OLED_SDIN_Clr();
OLED_SCLK_Set();
dat<<=1;
}
OLED_CS_Set();
OLED_CS_Set();
OLED_DC_Set();
}
SSD1306常用命令
其他命令,可以詳見SSD1306 datasheet的第28頁。從這頁開始,對SSD1306的指令有詳細(xì)的介紹。(手冊的下載鏈接,見文尾資料下載)
命令設(shè)置SSD1306
有了寫字節(jié)的函數(shù)封裝:
void OLED_WR_Byte(uint8_t dat,uint8_t cmd);
然后查詢手冊中的命令字,我們可以發(fā)送命令初始化SSD1306,比如:
關(guān)閉顯示面板
OLED_WR_Byte(0xAE,OLED_CMD);
設(shè)置頁地址模式
OLED_WR_Byte(0x20,OLED_CMD);
SSD1306有3種內(nèi)存尋址模式,分別是:
頁尋址模式(page addressing mode), 水平尋址模式(horizontal addressing mode)和垂直尋址模式(vertical addressing mode),分別對應(yīng)的命令字節(jié)為:20h、21h、22h,因?yàn)镺LED模塊復(fù)位之后默認(rèn)是 page addressing mode,所以下面只講頁尋址模式;其他兩種模式跟頁尋址模式的差異就是地址指針自增方式不一樣,詳情可以參考一下SSD1306的數(shù)據(jù)手冊。
如何顯示字符
在初始化OLED之后,如何在屏幕上顯示字符呢?
在這之前,先了解一下SSD1306內(nèi)部的RAM;SSD1306內(nèi)部有個SRAM稱為GDDRAM(Graphic Display Data RAM),大小是128 × 64 bits,被分為8個 PAGE,用于單色128×64點(diǎn)陣顯示,當(dāng)我們往這個RAM寫入數(shù)據(jù),就會顯示特定內(nèi)容,如圖:
上面'COL'的含義是GDDRAM列(column)
在頁尋址模式下,每當(dāng)對RAM進(jìn)行讀寫操作之后,列地址指針會自動+1,直到列地址指針指向列結(jié)束地址后,會重新指向列開始地址;而且在該模式下,一定要設(shè)置新的頁面和列地址才能訪問下一個頁面的內(nèi)容,所以設(shè)置顯示字符之前一般都會調(diào)用下面幾句語句來確定顯示位置:
OLED_WR_Byte (0xb0+i,OLED_CMD); //設(shè)置頁地址(0~7)
OLED_WR_Byte (0x00,OLED_CMD); //設(shè)置顯示位置—列低地址
OLED_WR_Byte (0x10,OLED_CMD); //設(shè)置顯示位置—列高地址
封裝設(shè)置顯示位置的函數(shù)如下:
void OLED_Set_Pos(unsigned char x, unsigned char y)
{
OLED_WR_Byte(0xb0+y,OLED_CMD);
OLED_WR_Byte(((x&0xf0)>>4)|0x10,OLED_CMD);
OLED_WR_Byte((x&0x0f)|0x01,OLED_CMD);
}
例如如果頁地址設(shè)為B2h,低列地址為03h,而高列地址為00h,那么也就意味著開始列是PAGE2的SEG3,而RAM的獲取指針定位到下圖中。而輸入的數(shù)據(jù)將會被寫入列3的位置。
所以確定好了顯示位置,直接輸出字符對應(yīng)的像素?cái)?shù)據(jù)數(shù)組就好了。
測試結(jié)果
測試電路連接:
GND---地
VCC---3.3V
D0---接PB9,作為SPI總線的CLK時(shí)鐘引腳,時(shí)鐘
D1---接PB8,作為SPI總線的MOSI數(shù)據(jù)引腳,數(shù)據(jù)輸入
RES---接PB7
D/C---接PB6,高電平為寫數(shù)據(jù),低電平為寫命令
CS---片選,接PB5,接地選中SSD1306
資料下載
微信公眾號后臺回復(fù)“OLED”,可以下載工程源碼及ssd1306的數(shù)據(jù)手冊。
推薦閱讀:
STM32單片機(jī)最小系統(tǒng)詳解
基于STM32固件庫的MDK5工程建立
修改Keil工程名稱并添加其他模塊文件
利用STM32F103C8T6最小系統(tǒng)板點(diǎn)亮流水燈
六月份的“每月一練”活動已經(jīng)開始投票了,六月份做什么,由你們決定。
感興趣的進(jìn)入下面鏈接投票哈。
2020.06 “每月一練”活動開始投票了
活動介紹及日程安排,詳見公眾號底部菜單欄“每月活動”。
免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺僅提供信息存儲服務(wù)。文章僅代表作者個人觀點(diǎn),不代表本平臺立場,如有問題,請聯(lián)系我們,謝謝!