一步步學習0.96寸七針OLED顯示屏SPI接口驅動(附移植代碼)--基於STM32

1 簡單介紹和引腳說明

在這裏插入圖片描述
拿到手的OLED不會用, 有程序看不懂, 怎麼辦? 從引腳開始看起. 如果你知道引腳都是幹嘛的, 自然就能看懂驅動代碼.
先來看一下引腳說明:

GND VCC D0 D1 RES DC CS
電源地 電源正(3~5.5V) SPI 時鐘管腳 SPI 數據管腳 復位管腳 數據和命令控制管腳 片選管腳

很顯然, GNDVCC接供電電源,沒電一切免談.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

寫的不夠詳細不夠深入, 後續有更好的理解再繼續補充.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章