STM32-OLED屏幕顯示教程
1.OLED屏幕介紹(點擊黃色字體領(lǐng)相關(guān)資料)
OLED即有機發(fā)光管(Organic Light-Emitting Diode,OLED)。OLED顯示技術(shù)具有自發(fā)光、廣視角、幾乎無窮高的對比度、較低功耗、極高反應速度、可用于繞曲性面板、使用溫度范圍廣、構(gòu)造及制程簡單等有點,被認為是下一代的平面顯示屏新興應用技術(shù)。
OLED顯示和傳統(tǒng)的LCD顯示不同,其可以自發(fā)光,所以不需要背光燈,這使得OLED顯示屏相對于LCD顯示屏尺寸更薄,同時顯示效果更優(yōu)。 常用的OLED屏幕有藍色、黃色、白色等幾種。屏的大小為0.96寸,像素點為 128*64,所以我們稱為0.96oled屏或者12864屏。
OLED屏幕特點
1.模塊尺寸:23.7 *23.8mm
2.電源電壓:3.3-5.5V
3.驅(qū)動芯片:SSD1306
4.測試平臺:提供 k60/k10,9s12XS128,51,stm32,stm8等單片機
OLED屏幕接線說明
OLED屏幕顯存
OLED本身是沒有顯存的,他的現(xiàn)存是依賴SSD1306提供的,而SSD1306提供一塊顯存。
SSD1306顯存總共為128*64bit大小,SSD1306將這些顯存分成了8頁。每頁包含了128個字節(jié)。
OLED屏幕原理
STM32內(nèi)部建立一個緩存(共128*8個字節(jié)),每次修改的時候,只是修改STM32上的緩存(實際上就是SRAM),修改完后一次性把STM32上的緩存數(shù)據(jù)寫入到OLED的GRAM。這個方法也有壞處,對于SRAM很小的單片機(51系列)就比較麻煩。
OLED屏幕常用指令
· 命令0X81: 設(shè)置對比度。包含兩個字節(jié),第一個0X81為命令,隨后方法是的一個字節(jié)要設(shè)置這個對比度,值越大屏幕越亮。
·命令0XAE/0XAF: 0XAE為關(guān)閉顯示命令,0XAF為開啟顯示命令
·0X8D: 包含兩個字節(jié),第一個為命令字,第二個為設(shè)置值,第二個字節(jié)的BIT2表示電荷泵的開關(guān)狀態(tài),該位為1開啟電荷泵,為0則關(guān)閉。模塊初始化的時候,這個必須要開啟,否則看不到屏幕顯示。
·命令0XB0~B7:用于設(shè)置頁地址,其低三位的值對應GRAM頁地址。
·命令0X00~0X0F:用于設(shè)置顯示時的起始列地址低四位。
·命令0X10~0X1F: 用于設(shè)置顯示時的起始列地址高四位。
2.OLED屏幕顯示一個點的思路
OLED屏幕分為頁尋址模式,水平地址模式,垂直地址模式。
這里主要介紹用的最多的頁尋址模式,頁尋址模式如下圖,把整個OLED屏幕分成了八頁,說白了就是把OLED的屏幕把寬平均分成了八份。比如想要在第0列第三行的開頭顯示一個點那就是按位來配置,0000 0100(0x08)。
3.配置OLED屏幕
我們配置硬件IIC的步驟就是根據(jù)下面這張時序圖,發(fā)送一次數(shù)據(jù)后不斷獲取不同的應答即可。
硬件IIC配置
#include "stm32f10x.h" #include "oled.h" void IIC_Configuration(void) {
GPIO_InitTypeDef GPIO_InitStructure;
I2C_InitTypeDef I2C_InitStructure;
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE );
RCC_APB1PeriphClockCmd( RCC_APB1Periph_I2C1, ENABLE ); //PB6--SCL PB7--SDL GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
I2C_DeInit(I2C1);
I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
I2C_InitStructure.I2C_ClockSpeed = 400000;
I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
I2C_InitStructure.I2C_OwnAddress1 = 0x30;
I2C_Init(I2C1, &I2C_InitStructure);
I2C_Cmd(I2C1, ENABLE);
} void I2C_WriteByte(uint8_t addr,uint8_t data) { while( I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY)); //檢查IIC總線是否繁忙 I2C_GenerateSTART(I2C1, ENABLE); //開啟IIC,發(fā)送起始信號 while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)); //EV5主模式 I2C_Send7bitAddress(I2C1, OLED_ADDRESS , I2C_Direction_Transmitter); //發(fā)送OLED地址 while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)); //檢查EV6 I2C_SendData(I2C1, addr); //發(fā)送寄存器地址 while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTING));
I2C_SendData(I2C1, data); //發(fā)送數(shù)據(jù) while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTING));
I2C_GenerateSTOP(I2C1, ENABLE);
}
完整代碼可進群免費領(lǐng)取!!!
嵌入式物聯(lián)網(wǎng)的學習之路非常漫長,不少人因為學習路線不對或者學習內(nèi)容不夠?qū)I(yè)而錯失高薪offer。不過別擔心,我為大家整理了一份150多G的學習資源,基本上涵蓋了嵌入式物聯(lián)網(wǎng)學習的所有內(nèi)容。點擊下方鏈接,0元領(lǐng)取學習資源,讓你的學習之路更加順暢!記得點贊、關(guān)注、收藏、轉(zhuǎn)發(fā)哦!
- 贊