1 簡單介紹和引腳說明
拿到手的OLED不會用, 有程序看不懂, 怎麼辦? 從引腳開始看起. 如果你知道引腳都是幹嘛的, 自然就能看懂驅動代碼.
先來看一下引腳說明:
GND | VCC | D0 | D1 | RES | DC | CS |
---|---|---|---|---|---|---|
電源地 | 電源正(3~5.5V) | SPI 時鐘管腳 | SPI 數據管腳 | 復位管腳 | 數據和命令控制管腳 | 片選管腳 |
很顯然, GND和VCC接供電電源,沒電一切免談.D0, D1,爲SPI接口引腳, 完成數據或者命令的傳輸, 對於SPI協議不瞭解的,建議好好學習該協議的相關資料, 畢竟較爲常用. CS爲片選引腳, 拉低時傳輸纔有效. DC呢,用來選擇寫數據還是還是寫命令. 拉低爲寫命令, 拉高爲寫數據. 例如當需要設置對比度, 設置x,y座標等, 用的是寫命令; 當顯示像素點時, 用的是寫數據. RES爲復位引腳,低電平復位,在初始化時拉低一段時間實現復位, 爲後續工作做好準備.
2 驅動代碼
2.1 初始化
2.1.1 引腳配置
普通引腳即可,全部配置爲推輓輸出.
2.2 OLED初始化
先復位,
OLED_RST_Set();
delay_ms(100);
OLED_RST_Clr(); //拉低200ms實現復位
delay_ms(200);
OLED_RST_Set();
接下來開始寫相關命令(這裏主要是配置SSD1306(OLED驅動芯片)的寄存器, 詳見對應的數據手冊), 摘取部分代碼:
OLED_WR_Byte(0xAE,OLED_CMD);//--turn off oled panel(關閉oled面板顯示)
OLED_WR_Byte(0x00,OLED_CMD);//---set low column address
OLED_WR_Byte(0x10,OLED_CMD);//---set high column address
OLED_WR_Byte(0x40,OLED_CMD);//--set start line address Set Mapping RAM Display Start Line (0x00~0x3F)
OLED_WR_Byte(0x81,OLED_CMD);//--set contrast control register(設置對比度控制控制寄存器)
//寫0x81命令後,緊接着寫入相應數值(0-255),數值越大亮度越大
OLED_WR_Byte(0xCF,OLED_CMD); // Set SEG Output Current Brightness(0xCF表示亮度大小)
......
最後是開啓oled面板, 清除屏幕, 設置座標爲原點
OLED_WR_Byte(0xAF,OLED_CMD); /*display ON*/
OLED_Clear();
OLED_Set_Pos(0,0);
2.2 功能函數
2.2.1 傳輸一個Byte的函數
void OLED_WR_Byte(u8 dat,u8 cmd)
{
u8 i;
if(cmd) //cmd爲1,拉高DC
OLED_DC_Set();
else //cmd爲0,拉低DC
OLED_DC_Clr();
OLED_CS_Clr();//拉低片選信號
for(i=0;i<8;i++)//for循環完成一個字節的傳輸,每個CLK的上升沿,傳輸一個bit,參考spi傳輸時序圖
{
OLED_SCLK_Clr();
if(dat&0x80)
OLED_SDIN_Set();
else
OLED_SDIN_Clr();
OLED_SCLK_Set();
dat<<=1;
}
OLED_CS_Set(); //拉高片選信號
OLED_DC_Set(); //拉高DC
}
傳輸時序圖:
2.2.2 顯示一個char的函數
void OLED_ShowChar(u8 x,u8 y,u8 chr)
{
unsigned char c=0,i=0;
c=chr-' ';//得到偏移值
if(x>Max_Column-1){x=0;y=y+2;} //x超過最後一列, 換行
if(SIZE ==16)//8*16
{
OLED_Set_Pos(x,y); //設置座標,其中x爲列地址,y爲頁地址,參考下圖分頁情況
for(i=0;i<8;i++) //顯示8*16點陣的上半部分
OLED_WR_Byte(F8X16[c*16+i],OLED_DATA);
OLED_Set_Pos(x,y+1);//光標移到下一頁
for(i=0;i<8;i++) //顯示8*16點陣的下半部分,參考下圖顯示示意圖
OLED_WR_Byte(F8X16[c*16+i+8],OLED_DATA);
}
else //6*8
{
OLED_Set_Pos(x,y+1);
for(i=0;i<6;i++)
OLED_WR_Byte(F6x8[c][i],OLED_DATA);
}
}
分頁情況:
8*16格式的字符顯示示意圖, 從左到右, 從上到下, 先顯示上半部分, 然後光標移至下一頁, 繼續顯示下半部分
其他顯示的功能函數, 都是基於字符顯示, 有興趣的自行研究
3 驅動代碼鏈接
https://download.csdn.net/download/weixin_40134414/12302024
寫的不夠詳細不夠深入, 後續有更好的理解再繼續補充.