STM32——驅動7引腳OLED

STM32驅動7引腳的OLED

寒假在家裏無聊又不能出門,開學可能還延遲了(新型肺炎最近比較猖狂)武漢加油!陝西加油!全國一起加油!一定要減少出門啊!!!

放假前帶了一個OLED屏幕,想着剛好沒有接觸過這個模塊。以後比賽啥的可能會用到該模塊所以就研究一哈如何使用。我想着應該不難的,因爲正點原子的教程中有。結果,正點原子的教程用的是16引腳的,我手上的是7引腳的。(奔潰,沒有資料了啊)
在單片機論壇裏看到了一些資料,該模塊默認的是SPI通訊。之前學習過SPI的相關內容,不過一直沒有用過理解的不深。恰好通過這一次來熟悉一下SPI
,SPI可以接四根線(發數據與讀數據)或者是接三線(只發數據)。
四根線分別是:SDI(數據輸入),SDO(數據輸出)SCLK(時鐘)CS(片選)

  1. SDO/MOSI:主設備發送數據,從設備接受數據
  2. SDI/MISO:主設備接受數據,從設備發送數據
  3. SCLK:時鐘信號,由主設備產生
  4. CS:當從設備有很多時,每個設備都有一個CS引腳連接到主設備,當主設備想要連接到A從設備但是又不想連接到B的從設備時,就可以通過拉低A設備的CS引腳而不拉低B設備的CS引腳來控制不同的從設備是否工作盜一張圖SPI通訊的開始與結束比IIC簡單多了,CS爲低就開始,CS爲高就結束。

然後就是時鐘極性(CPOL)與時鐘相位(CPHA)了,感覺是不是聽上去就高大上主機和從機的時鐘極性時鐘相位必須一樣,時鐘極性與時鐘相位通過不通過01組合,一共有四種模式
1.mode0:CPOL = 0,CPHA = 0,CPOL=0,CPHA=0:此時空閒態時,SCLK處於低電平,數據採樣是在第1個邊沿,也就是SCLK由低電平到高電平的跳變,所以數據採樣是在上升沿,數據發送是在下降沿。
2.mode1:CPOL= 0,CPHA = 1,CPOL=0,CPHA=1:此時空閒態時,SCLK處於低電平,數據發送是在第1個邊沿,也就是SCLK由低電平到高電平的跳變,所以數據採樣是在下降沿,數據發送是在上升沿。
3.mode2:CPOL= 1,CPHA = 0,CPOL=1,CPHA=0:此時空閒態時,SCLK處於高電平,數據採集是在第1個邊沿,也就是SCLK由高電平到低電平的跳變,所以數據採集是在下降沿,數據發送是在上升沿。
4.mode3:CPOL = 1,CPHA = 1,CPOL=1,CPHA=1:此時空閒態時,SCLK處於高電平,數據發送是在第1個邊沿,也就是 SCLK由高電平到低電平的跳變,所以數據採集是在上升沿,數據發送是在下降沿。SPI的時鐘極性和時鐘相位一般都是是從機出場時就設定好的,主機根據從機去配。
以上是我對SPI的簡單理解,那麼接下來說一說OLED。
OLED的7個引腳分別爲GND,VCC(3.3-5V)D0(時鐘線)D1(數據線)RES(復位線)DC(數據命令選擇線)和CS(SPI片選線)手上的OLED用的驅動芯片是SSD1306,那麼就先從最基礎的SPI與SSD1306通訊開始主要就是這麼一個函數OLED_WR_Byte();首先傳來兩個數據,一個dat,一個cmd,如果cmd是1的話說明發送的是指令,要將DC拉高。DC確定完後拉低CS確定從機。之後開始傳輸數據。數據從高到低發送,數據手冊上有說明按照次序將數據線至高至低,每次循環完一次後將時鐘拉高,數據左移一位。這是SPI的時鐘極性和時鐘相位的所規定,總之SPI通訊是這麼一回事,具體還得看手冊。通過介紹可以得出OLED顯示需要的相關步驟:
1)設置 STM32F1 與 OLED 模塊相連接的 IO。這一步,先將我們與 OLED 模塊相連的 IO 口設置爲輸出,具體使用哪些 IO 口,這裏需要根據連接電路以及 OLED 模塊所設置的通訊模式來確定。
2)初始化 OLED 模塊。
其實這裏就是上面的初始化框圖的內容,通過對 OLED 相關寄存器的初始化,來啓動 OLED的顯示。爲後續顯示字符和數字做準備。
3)通過函數將字符和數字顯示到 OLED 模塊上。這裏就是通過我們設計的程序,將要顯示的字符送到 OLED 模塊就可以了。
線路連接:

VCC 3.3V
CS PD3
DC PD5
RES PD4
DI PD7
D0 PD6
GND GND

接下來介紹幾個重要的函數吧!

一:在oled.c文件下的OLED_Init()的函數
該函數的結構比較簡單,開始是對 IO 口的初始化,這裏我們用了宏定義
OLED_MODE 來決定要設置的 IO 口,其他就是一些初始化序列了,我們按照廠家提供的資料來做就可以。最後要說明一點的是,因爲 OLED 是無背光的,在初始化之後,我們把顯存都清空了,所以我們在屏幕上是看不到任何內容的!
二:顯示ASCII字符的值

void OLED_ShowNum(u8 x,u8 y,u32 num,u8 len,u8 size)
{          
 u8 t,temp;
 u8 enshow=0;         
 for(t=0;t<len;t++)
 {
  temp=(num/oled_pow(10,len-t-1))%10;
  if(enshow==0&&t<(len-1))
  {
   if(temp==0)
   {
    OLED_ShowChar(x+(size/2)*t,y,' ');
    continue;
   }else enshow=1; 
     
  }
   OLED_ShowChar(x+(size/2)*t,y,temp+'0'); 
 }
} 

三:顯示字符串函數

void OLED_ShowString(u8 x,u8 y,u8 *chr)
{
 unsigned char j=0;
 while (chr[j]!='\0')
 {  OLED_ShowChar(x,y,chr[j]);
   x+=8;
  if(x>120){x=0;y+=2;}
   j++;
 }
}

四:顯示漢子函數

void OLED_ShowCHinese(u8 x,u8 y,u8 no)
{             
 u8 t,adder=0;
 OLED_Set_Pos(x,y); 
    for(t=0;t<16;t++)
  {
    OLED_WR_Byte(Hzk[2*no][t],OLED_DATA);
    adder+=1;
     } 
  OLED_Set_Pos(x,y+1); 
    for(t=0;t<16;t++)
   { 
    OLED_WR_Byte(Hzk[2*no+1][t],OLED_DATA);
    adder+=1;
      }     
}

OLED主要是顯示一些是簡單的字符和數據的,對於漢字的顯示使用的並不多。

最後來看看效果吧

Alt
儘管有了效果,但是很多地方理解的不是特別透徹,只能簡單的改一改代碼。關於中文字庫的添加下來還得研究一下。

最後把工程文件放到自己的資源中心,希望對大家有幫助!

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