生活随笔
收集整理的這篇文章主要介紹了
STM32利用库函数驱动OLED
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
使用的1.3寸OLED是I2C接口的對外有四個引腳,分別是VCC、GND、SCL、SDL。
首先看一下運行的效果圖:
成功在小屏幕上顯示“你好”。
首先,我們需要配置好STM32的I2C外設,和GPIO的模式。
PB6—>SCL
PB7—>SDA
GPIO口配置為開漏輸出模式。
void GPIO_Config()
{GPIO_InitTypeDef GPIO_STRUCT;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);GPIO_STRUCT.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;GPIO_STRUCT.GPIO_Mode = GPIO_Mode_AF_OD;GPIO_STRUCT.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB,&GPIO_STRUCT);
}void IIC_Config()
{I2C_InitTypeDef I2C_STRUCT;RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1,ENABLE);I2C_DeInit(I2C1);I2C_STRUCT.I2C_Mode = I2C_Mode_I2C;I2C_STRUCT.I2C_DutyCycle = I2C_DutyCycle_2;I2C_STRUCT.I2C_OwnAddress1 = 0x90;I2C_STRUCT.I2C_Ack = I2C_Ack_Enable;I2C_STRUCT.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;I2C_STRUCT.I2C_ClockSpeed =400000 ;I2C_Init(I2C1,&I2C_STRUCT);I2C_Cmd(I2C1,ENABLE);}```
I2C的配置:
I2C_Mode:配置I2C的工作模式為I2C。
I2C_DutyCycle:配置時鐘線的占空比,這里配置占空比為2:1.
I2C_OwnAddress1:peizhi STM32的I2C設備自己的地址。
I2C_Ack:接收應答,每接收到一個字節就返回一個應答。
I2C_AcknowledgedAddress:選擇I2C的尋址模式,這個根據連接的設備來進行選擇。
I2C_ClockSpeed:設置I2C的傳輸速率,最大不得高于400kHz。
配置好以后使能I2C外設。配置完成以后我們就要使用I2C來驅動OLED進行顯示了。
第一步我們需要構建一個發送的最小單元,什么意思呢?就是定義一個函數,這個函數主要用來進行命令和數據的發送。為什么要這個樣子呢?因為I2C在通信時過程比較繁瑣,如果每次發送數據或者命令都要來配置一下的話,代碼量會大大增加,并且程序的結構性也會被破壞,不利于閱讀。
void WriteByte(uint8_t addr,uint8_t data)
{
while(I2C_GetFlagStatus(I2C1,I2C_FLAG_BUSY));
I2C_GenerateSTART(I2C1,ENABLE);
while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT));
I2C_Send7bitAddress(I2C1,0x78,I2C_Direction_Transmitter);while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));I2C_SendData(I2C1,addr);
while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED));
I2C_SendData(I2C1,data);
while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED));I2C_GenerateSTOP(I2C1,ENABLE);
}’’’
這個就是發送的最小單元,在這里面接收兩個參數,一個是地址,一個是數據。
內部實現的流程如下:
1、利用while循環判斷I2C總線是否處于繁忙狀態。
2、產生一個開始信號
3,、等待I2C_EVENT_MASTER_MODE_SELECT
4、發送目標設備的地址,也就是OLED屏幕的地址。
5,、等待事件I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED
6、發送地址
7、等待事件I2C_EVENT_MASTER_BYTE_TRANSMITTED
8、發送數據
9、等待事件I2C_EVENT_MASTER_BYTE_TRANSMITTED
10、產生一個停止信號。
到此我們的最小發送單元配置完成。當我們再次發送命令和數據時不需要再這么復雜的敲寫代碼,直接調用該函數即可。
以下為發送命令和發送數據的封裝函數:
void Write_Cmd(unsigned char command)
{WriteByte(0x00,command);
}void Write_Dat(unsigned char data)
{WriteByte(0x40,data);
}
工欲善其事必先利其器,上面我們已經將如何發送數據寫好了,下面我們就直接使用上面的函數來進行初始化等就可以了。
OLED屏幕的初始化:
void OLED_Init(void)
{int i = 10000;while(i--);//這個延時是必要的,沒有使用定時器,就簡單的寫了個延時Write_Cmd(0xae);//開顯示Write_Cmd(0x20);//設置內存尋址模式Write_Cmd(0x10);//00水平尋址01垂直10頁面尋址Write_Cmd(0xb0);//為頁面尋址模式設置頁面開始地址0-7Write_Cmd(0xc8);//設置COM輸出掃描方向Write_Cmd(0x00);//設置低列地址Write_Cmd(0x10);//設置高列地址Write_Cmd(0x40);//設置起始行地址Write_Cmd(0x81);//以下的使用的就去查找手冊看一下吧!Write_Cmd(0xff);Write_Cmd(0xa1);Write_Cmd(0xa6);Write_Cmd(0xa8);Write_Cmd(0x3f);Write_Cmd(0xa4);Write_Cmd(0xd3);Write_Cmd(0x00);Write_Cmd(0xd5);Write_Cmd(0xf0);Write_Cmd(0xd9);Write_Cmd(0x22);Write_Cmd(0xda);Write_Cmd(0x12);Write_Cmd(0xdb);Write_Cmd(0x20);Write_Cmd(0x8d);Write_Cmd(0x14);Write_Cmd(0xaf);
}
初始完成,我們先來看一下OLED的屏幕的各個像素地址:
OLED的分別率是128x64.即是有128X64個像素點。所有的像素按照行分為8頁,按列分為8段,每段里面有8行16列。
通常像素原點為左上角的(0,0)像素點,我們設置圖像時,通常按照坐標來進行設置,但是我們設置的像素坐標需要轉換為對應的地址。
void OLED_SetPos(unsigned char x,unsigned char y)
{Write_Cmd(0xb0+y);Write_Cmd(((x&0xf0)>>4)|0x10);Write_Cmd((x&0x0f)|0x01);
}
剩余的代碼如下:
void OLED_Fill(unsigned char fill_data)
{unsigned char m,n;for(m = 0;m < 8;m++){Write_Cmd(0xb0+m);Write_Cmd(0x00);Write_Cmd(0x10);for(n = 0;n < 130;n++){Write_Dat(fill_data);}}}void OLED_CLS(void)
{OLED_Fill(0x00);
}void OLED_ON(void)
{Write_Cmd(0x8d);Write_Cmd(0x14);Write_Cmd(0xaf);
}void OLED_OFF(void)
{Write_Cmd(0x8d);Write_Cmd(0x10);Write_Cmd(0xae);
}
其中Write_Dat(0xf0);在屏幕上的像素分布如下:
所以在利用取模工具時,需要注意高低位的情況。
總結
以上是生活随笔為你收集整理的STM32利用库函数驱动OLED的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。