www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當前位置:首頁 > 公眾號精選 > 程序員小哈

目錄

  • 序言

  • OLED簡介

  • 模塊介紹

  • 引腳定義

  • SSD1306控制芯片驅(qū)動

    • 時序圖講解

    • SSD1306常用命令

    • 命令設置SSD1306

  • 如何顯示字符

  • 測試結(jié)果

  • 資料下載

序言

液晶屏通常作為嵌入式設備的顯示終端,用于顯示一些關鍵信息,將信息直接顯示在一塊小的液晶屏幕上。


液晶屏除了可以作為顯示終端外,還可以作為調(diào)試信息輸出的一個終端。


在調(diào)試硬件程序的時候,通常會對程序進行調(diào)試,想輸出一些狀態(tài)或者信息來體現(xiàn)程序當前的運行狀態(tài),一般我們會選擇串口打印輸出內(nèi)容,或者LED的不同閃爍頻率代表不同狀態(tài),當然我們也可以使用一個液晶屏來顯示不同內(nèi)容,這種方式也是十分的方便快捷的。


OLED簡介

OLED,即有機發(fā)光二極管(Organic Light-Emitting Diode),又稱為有機電激光顯示(Organic Electroluminesence Display, OELD)。OLED由于同時具備自發(fā)光,不需背光源、對比度高、厚度薄、視角廣、反應速度快、可用于撓曲性面板、使用溫度范圍廣、構造及制程較簡單等優(yōu)異之特性,被認為是下一代的平面顯示器新興應用技術。

LCD都需要背光,而OLED不需要,因為它是自發(fā)光的。這樣同樣的顯示,OLED效果要來得好一些。OLED的尺寸難以大型化,但是分辨率確可以做到很高。


模塊介紹

  • 尺寸:0.96寸

  • 控制芯片:SSD1306

  • 管腳數(shù)量:7

  • 引腳間距:2.54mm

  • 分辨率:128*64,可以顯示漢字、ASCII、圖案,對比度高

  • 可視角度:>160度

  • 無需背光(OLED屏的特點)

  • 供電:3V-5V

有的模塊是不跟5V接口兼容的,使用前一定要確認好。

引腳定義

  • GND:電源地

  • VCC:2.2V~5.5V

  • D0:SCL,CLK時鐘

  • D1:SDA,MOSI數(shù)據(jù)

  • RES:RST復位

  • D/C:數(shù)據(jù)/命令選擇

  • CS:片選,接地

此模塊可以采用SPI或IIC通信方式,最多只需要4個IO口既可驅(qū)動。


SPI電路連接:
GND---地
VCC---3.3V或5V
D0---接單片機IO,作為SPI總線的CLK時鐘引腳,時鐘
D1---接單片機IO,作為SPI總線的MOSI數(shù)據(jù)引腳,數(shù)據(jù)輸入
RES---接單片機IO
D/C---接單片機IO,高電平為寫數(shù)據(jù),低電平為寫命令
CS---片選,接地(可不連接單片機IO),選中SSD1306


IIC電路連接:
GND---地
VCC---3.3V或5V
D0---接單片機IO,作為IIC的SCL引腳
D1---接單片機IO,作為IIC的SDA引腳
CS---接地


SSD1306控制芯片驅(qū)動

時序圖講解

我們以STM32單片機為例,使用5個GPIO模擬SPI總線與SSD1306總線進行通訊。


因為STM32與OLED屏的通訊只是單向數(shù)據(jù)傳輸,即只存在STM32向OLED屏發(fā)送數(shù)據(jù),不涉及到讀取返回數(shù)據(jù),所以我們要實現(xiàn)顯示功能之前,需要根據(jù)SPI寫操作時序圖,先實現(xiàn)一個向SSD1306寫入一個字節(jié)的函數(shù)實現(xiàn)。


SSD1306使用4Wire SPI寫操作的時序圖


封裝一個向SSD1306寫入一個字節(jié)的函數(shù),
函數(shù)原型為:
void OLED_WR_Byte(uint8_t dat,uint8_t cmd);
其中:
dat為待寫入的數(shù)據(jù)或者命令;
cmd為數(shù)據(jù)或命令標志,0表示命令;1表示數(shù)據(jù)。


由上面SPI操作的時序圖可知,IO引腳的時序如下所示:

  1. 首選看發(fā)送的字節(jié)是命令還是數(shù)據(jù),如果是命令,OLED_DC(D/C)引腳置0,即低電平;如果是數(shù)據(jù),OLED_DC(D/C)引腳置1,即高電平。

if(cmd) OLED_DC_Set();else  OLED_DC_Clr();

		
  1. 片選OLED_CS(CS)引腳置0,即拉低(硬件電路中CS引腳也可以直接與GND相連,這樣就不用操作CS引腳了)。

OLED_CS_Clr();

		
  1. 1個字節(jié)的數(shù)據(jù)有8位,將8位數(shù)據(jù)由高到低的順序發(fā)出,數(shù)據(jù)要在OLED_SCLK(D0)引腳的上升沿之前設置好,所以要先將OLED_SCLK(D0)置低,然后將一位數(shù)據(jù)送至OLED_SDIN(D1)引腳,然后將OLED_SCLK(D0)置高,這樣一位數(shù)據(jù)就發(fā)送出去了,如此循環(huán)8次,一個字節(jié)的數(shù)據(jù)就發(fā)送出去了。


for(i=0;i<8;i++){  OLED_SCLK_Clr(); if(dat&0x80) OLED_SDIN_Set(); else  OLED_SDIN_Clr(); OLED_SCLK_Set(); dat<<=1; }

		
  1. 8位數(shù)據(jù)發(fā)送完畢之后,將OLED_CS(CS)引腳拉高,即置1,恢復至初始狀態(tài)。

OLED_CS_Set();OLED_CS_Set();OLED_DC_Set();

		

*代碼完整實現(xiàn)

void OLED_WR_Byte(uint8_t dat,uint8_t cmd){  uint8_t i;  if(cmd) OLED_DC_Set(); else  OLED_DC_Clr();   OLED_CS_Clr();  for(i=0;i<8;i++) {  OLED_SCLK_Clr(); if(dat&0x80) OLED_SDIN_Set(); else  OLED_SDIN_Clr(); OLED_SCLK_Set(); dat<<=1;  }  OLED_CS_Set(); OLED_CS_Set(); OLED_DC_Set(); }

		
SSD1306常用命令


其他命令,可以詳見SSD1306 datasheet的第28頁。從這頁開始,對SSD1306的指令有詳細的介紹。(手冊的下載鏈接,見文尾資料下載)


命令設置SSD1306

有了寫字節(jié)的函數(shù)封裝:
void OLED_WR_Byte(uint8_t dat,uint8_t cmd);


然后查詢手冊中的命令字,我們可以發(fā)送命令初始化SSD1306,比如:

  • 關閉顯示面板

OLED_WR_Byte(0xAE,OLED_CMD);

		
  • 設置頁地址模式

OLED_WR_Byte(0x20,OLED_CMD);

		

SSD1306有3種內(nèi)存尋址模式,分別是:
頁尋址模式(page addressing mode), 水平尋址模式(horizontal addressing mode)和垂直尋址模式(vertical addressing mode),分別對應的命令字節(jié)為:20h、21h、22h,因為OLED模塊復位之后默認是 page addressing mode,所以下面只講頁尋址模式;其他兩種模式跟頁尋址模式的差異就是地址指針自增方式不一樣,詳情可以參考一下SSD1306的數(shù)據(jù)手冊。


如何顯示字符

在初始化OLED之后,如何在屏幕上顯示字符呢?


在這之前,先了解一下SSD1306內(nèi)部的RAM;SSD1306內(nèi)部有個SRAM稱為GDDRAM(Graphic Display Data RAM),大小是128 × 64 bits,被分為8個 PAGE,用于單色128×64點陣顯示,當我們往這個RAM寫入數(shù)據(jù),就會顯示特定內(nèi)容,如圖:


上面'COL'的含義是GDDRAM列(column)


在頁尋址模式下,每當對RAM進行讀寫操作之后,列地址指針會自動+1,直到列地址指針指向列結(jié)束地址后,會重新指向列開始地址;而且在該模式下,一定要設置新的頁面和列地址才能訪問下一個頁面的內(nèi)容,所以設置顯示字符之前一般都會調(diào)用下面幾句語句來確定顯示位置:

OLED_WR_Byte (0xb0+i,OLED_CMD); //設置頁地址(0~7)OLED_WR_Byte (0x00,OLED_CMD); //設置顯示位置—列低地址OLED_WR_Byte (0x10,OLED_CMD); //設置顯示位置—列高地址

封裝設置顯示位置的函數(shù)如下:

void OLED_Set_Pos(unsigned char x, unsigned char y) {  OLED_WR_Byte(0xb0+y,OLED_CMD); OLED_WR_Byte(((x&0xf0)>>4)|0x10,OLED_CMD); OLED_WR_Byte((x&0x0f)|0x01,OLED_CMD); }


如如果頁地址設為B2h,低列地址為03h,而高列地址為00h,那么也就意味著開始列是PAGE2的SEG3,而RAM的獲取指針定位到下圖中。而輸入的數(shù)據(jù)將會被寫入列3的位置。



所以確定好了顯示位置,直接輸出字符對應的像素數(shù)據(jù)數(shù)組就好了。

測試結(jié)果

測試電路連接:
GND---地
VCC---3.3V
D0---接PB9,作為SPI總線的CLK時鐘引腳,時鐘
D1---接PB8,作為SPI總線的MOSI數(shù)據(jù)引腳,數(shù)據(jù)輸入
RES---接PB7
D/C---接PB6,高電平為寫數(shù)據(jù),低電平為寫命令
CS---片選,接PB5,接地選中SSD1306


?

本站聲明: 本文章由作者或相關機構授權發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權益,請及時聯(lián)系本站刪除。
關閉