基於SPI的0.96OLED資料顯示溫溼度

餓丸發表於2021-01-02

關於SPI

SPI 介面是 Motorola 首先提出的全雙工三線同步序列外圍介面,採用主從模式(Master Slave)架構;支援多 slave 模式應用,一 般僅支援單 Master。 時鐘由 Master 控制,在時鐘移位脈衝下,資料按位傳輸,高位在前,低位在後(MSB first);SPI 介面有 2 根單向資料線,為全雙工通訊,目前應用中的資料速率可達幾 Mbps 的水平。


提示:以下是本篇文章正文內容,下面案例可供參考

0.96OLED螢幕

相關資料:0.96inch SPI OLED Module(下載原始程式碼)


螢幕滾動和讀取顯示AHT20溫溼度感測器

1.前期準備

開啟原始碼和接線

微控制器實驗的第一步當然是接線了

這裡我們開啟上面連結資料裡面下載好的原始碼
Demo資料夾裡面找到Stm32相關部分
這裡我選擇的是與我板子對應的F103RCT6的4線制SPI模式
在這裡插入圖片描述
開啟後可以看到程式碼裡面很清楚的給出了接線怎麼接

在這裡插入圖片描述
用母對母杜邦線接好
在這裡插入圖片描述

2.螢幕滾動

SSD1306(OLED驅動晶片)指令詳解
通過查閱資料和其他部落格,發現滾動的程式碼如下

void roll_v(void)
{
        OLED_WR_Byte(0x2e,OLED_CMD);       
        OLED_WR_Byte(0x29,OLED_CMD);       
        OLED_WR_Byte(0x00,OLED_CMD);       
        OLED_WR_Byte(0x00,OLED_CMD);        
        OLED_WR_Byte(0x07,OLED_CMD);        
        OLED_WR_Byte(0x07,OLED_CMD);        
        OLED_WR_Byte(0x01,OLED_CMD);       
        OLED_WR_Byte(0x2F,OLED_CMD); 
}  
void roll_h(void)
{
				OLED_WR_Byte(0x2E,OLED_CMD);        //關閉滾動
				OLED_WR_Byte(0x26,OLED_CMD);        //水平向左或者右滾動 26/27
				OLED_WR_Byte(0x00,OLED_CMD);        //虛擬位元組
				OLED_WR_Byte(0x00,OLED_CMD);        //起始頁 0
				OLED_WR_Byte(0x07,OLED_CMD);        //滾動時間間隔
				OLED_WR_Byte(0x07,OLED_CMD);        //終止頁 7
				OLED_WR_Byte(0x00,OLED_CMD);        //虛擬位元組
				OLED_WR_Byte(0xFF,OLED_CMD);        //虛擬位元組

				OLED_WR_Byte(0x2F,OLED_CMD);        //開啟滾動

}    

寫一個測試函式在main裡面迴圈

void TEST_Menu(void)
{
	GUI_ShowString(0,0,"631707060324",16,1);
	GUI_ShowCHinese(0,20,16,"肖思睿",1);
	roll_h();
	
}

結果如下
在這裡插入圖片描述

讀取並顯示溫溼度

1.字模的提取

上面螢幕滾動的視訊裡面可以看到我顯示了自己的名字和學號

但是如果你試過就會發現
在資料裡面下載下來的程式碼改動後不能直接顯示中文

這是因為程式碼裡面沒有相關的字模

在嵌入式裝置 LCD 上顯示的漢字大多數都屬於點陣漢字。常用的點陣字型檔來自 UCDOS。

我們可以在程式裡面新增對應的字模實現顯示
在這裡插入圖片描述
比如這是我新增的

	"肖",0x01,0x00,0x21,0x08,0x11,0x10,0x09,0x20,0x01,0x00,0x3F,0xF8,0x20,0x08,0x20,0x08,
	0x3F,0xF8,0x20,0x08,0x20,0x08,0x3F,0xF8,0x20,0x08,0x20,0x08,0x20,0x28,0x20,0x20,
	"思",0x00,0x00,0x3F,0xF8,0x21,0x10,0x21,0x10,0x3F,0xF8,0x21,0x10,0x21,0x10,0x3F,0xF8,
	0x20,0x08,0x01,0x00,0x08,0x88,0x48,0x84,0x48,0x12,0x48,0x12,0x87,0xF0,0x00,0x00,
	"睿",0x01,0x00,0x01,0xF8,0x01,0x00,0x7F,0xFE,0x40,0x02,0x9F,0xF4,0x09,0x20,0x32,0x90,
	0x0C,0x60,0x3F,0xF8,0xD0,0x16,0x1F,0xF0,0x10,0x10,0x1F,0xF0,0x10,0x00,0x1F,0xF0,	

程式碼的提取可以通過字模提取軟體提取
也可以通過計算手動新增(不推薦,雖然我沒找到軟體就是手動新增的)

在這裡插入圖片描述
比如肖字
在這裡插入圖片描述
第一行就是:0x01,0x00,即:0000 0001 0000 0000
依次類推,就可以得到相關程式碼

新增到oledfont.h檔案裡面就可以直接呼叫了

2.程式碼實現部分

1.GPIO

要同時實現OLED和AHT20的工作,我們第一個要修改的是GPIO_Init

因為他們所接的引腳不同

OLED.c檔案裡面的初始化函式
新增AHT20連線的PB6和PB7

void OLED_Init_GPIO(void)
{
	GPIO_InitTypeDef  GPIO_InitStructure;
 	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);	 //使能B埠時鐘
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_6|GPIO_Pin_7;	//GPIOB10,11,12,6,7
 	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		 //推輓輸出
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速度50MHz
 	GPIO_Init(GPIOB, &GPIO_InitStructure);	  //初始化GPIOB10、11、12,6,7
 	GPIO_SetBits(GPIOB,GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_6|GPIO_Pin_7);	
}

2.顯示部分

				GUI_DrawLine(WIDTH/2-1,10+(HEIGHT-10)/2-1,WIDTH/2-1,HEIGHT-1,1);
				GUI_DrawLine(0,10+(HEIGHT-10)/2-1,WIDTH-1,10+(HEIGHT-10)/2-1,1);
				GUI_ShowString(0,1,"631707060324",16,1); 
				GUI_ShowCHinese(0,20,16,"肖思睿",1);
				GUI_ShowString(0,39,"TEMP",8,1);
				GUI_DrawCircle(WIDTH/2-1-19, 51, 1,2);
				GUI_ShowString(WIDTH/2-1-14,46,"C",16,1);
				GUI_ShowString(WIDTH/2-1+2,39,"hum",8,1);
				GUI_ShowString(WIDTH/2-1+40,46,"%",16,1);
				GUI_ShowNum(WIDTH/2-1-50,46,(tem/10),3,16,1);
				GUI_ShowNum(WIDTH/2-1+5,46,(hum/10),3,16,1);

3.實現效果

可以看到,由於手給溫溼度測量帶來的變化清晰的顯示在了螢幕上
在這裡插入圖片描述

相關文章