STM32試驗(yàn)9OLED顯示試驗(yàn)_第1頁(yè)
STM32試驗(yàn)9OLED顯示試驗(yàn)_第2頁(yè)
STM32試驗(yàn)9OLED顯示試驗(yàn)_第3頁(yè)
STM32試驗(yàn)9OLED顯示試驗(yàn)_第4頁(yè)
STM32試驗(yàn)9OLED顯示試驗(yàn)_第5頁(yè)
已閱讀5頁(yè),還剩28頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、實(shí)用標(biāo)準(zhǔn)文案3.9 OLED顯示實(shí)驗(yàn)前面所有的介紹都沒有涉及到液晶顯示,從這一節(jié)開始,我們將陸續(xù)向大家介紹幾款液 晶顯示模塊。本節(jié)我們將向大家介紹相對(duì)簡(jiǎn)單的。本節(jié)分為如下幾個(gè)部分:3.9.1OLED簡(jiǎn)介3.9.2硬件設(shè)計(jì)3.9.3軟件設(shè)計(jì)3.9.4下載與測(cè)試OLED1463.9.1 OLED簡(jiǎn)介OLED, 即 有 機(jī) 發(fā) 光 二 極 管 ( Organic Light-Emitting Diode ), 又 稱 為 有 機(jī) 電 激 光 顯 示 ( Organic Electroluminesence Display , OELD)。 OLED由于同時(shí)具備自發(fā)光,不需背光源、對(duì) 比度高、厚度薄、

2、視角廣、反應(yīng)速度快、可用于撓曲性面板、使用溫度范圍廣、構(gòu)造及制程較簡(jiǎn)單等 優(yōu)異之特性,被認(rèn)為是下一代的平面顯示器新興應(yīng)用技術(shù)。LCD都需要背光,而 OLED不需要,因?yàn)樗亲园l(fā)光的。這樣同樣的顯示,OLED效果要來得好一些。 OLED的尺寸難以大型化,但是分辨率確可以做到很高。這一節(jié),我們使用的是 ALINETEK的 OLED 顯示模塊,該模塊有以下特點(diǎn):1)模塊有單色和雙色兩種可選,單色為純白色,而雙色則為黃藍(lán)雙色。2)尺寸小,顯示尺寸為 0.96 寸,而模塊的尺寸僅為 27mm*26mm大小。3)高分辨率,該模塊的分辨率為 128*64 。4)多種接口方式,該模塊提供了總共5 種接口包括:

3、 6800、 8080 兩種并行接口方式、 3 線或 4線的穿行 SPI 接口方式,、 IIC 接口方式(只需要 2 根線就可以控制 OLED了!)。5)不需要高壓,直接接 3.3V 就可以工作了。這里要提醒大家的是,該模塊不和 5.0V 接口兼容,所以請(qǐng)大家在使用的時(shí)候一定要小心,別接到 5V 的系統(tǒng)上去,否則可能燒壞模塊。以上 5 種模式通過模塊的 BS02設(shè)置, BS02 的設(shè)置與模塊 接口模式的關(guān)系如下表:表 3.9.1.1OLED模塊接口方式設(shè)置表上表中:“ 1”代表接 VCC,而“ 0”代表接 GND。 該模塊的外觀圖如下:精彩文檔實(shí)用標(biāo)準(zhǔn)文案圖 3.9.1.1 ALIENTEK

4、OLED模塊外觀圖模塊的原理圖如下:精彩文檔實(shí)用標(biāo)準(zhǔn)文案圖 3.9.1.2 ALIENTEK OLED模塊原理圖該模塊采用 8*2 的 2.54 排針與外部連接,其引線圖如上圖所示,總共有 16個(gè)管腳,在 16 條線中, 我們只用了 15 條,有一個(gè)是懸空的。 15 條線中,電源和地線占了 2 條,還剩下 13 條信號(hào)線。在不 同模式下,我們需要的信號(hào)線數(shù)量是不同的,在8080模式下,需要全部 13 條,而在 IIC 模式下,僅需要 2 條線就夠了!這其中有一條是共同的,那就是復(fù)位線RST( RES),該線我們可以直接接在 MCU的復(fù)位上(要先確認(rèn)復(fù)位方式一樣) ,這樣可以省掉一條線。ALIE

5、NTEK OLED模塊的控制器是 SSD1306,這一節(jié), 我們將學(xué)習(xí)如何通過 STM32來控制該模塊顯示字 符和數(shù)字,本節(jié)實(shí)例將可以支持 2 種方式與 OLED模塊連接,一種是 8080 的并口方式,另外一種是 4 線 SPI 方式。首先我們介紹一下模塊的 8080 并行接口, 8080 并行接口的發(fā)明者是 INTEL,該總線也被廣泛應(yīng)用于 各類液晶顯示器, ALIENTEK OLED 模塊也提供了這種接口,使得MCU可以快速的訪問 OLED。ALIENTEK OLED模塊的 8080 接口方式需要如下一些信號(hào)線:CS:OLED片選信號(hào)。WR:向 OLED寫入數(shù)據(jù)。RD:從 OLED讀取數(shù)據(jù)

6、。D7:0 :8 位雙向數(shù)據(jù)線。RST(RES):硬復(fù)位 OLED。DC:命令 / 數(shù)據(jù)標(biāo)志( 0,讀寫命令; 1,讀寫數(shù)據(jù)) 。模塊的 8080 并口讀 /寫的過程為:先根據(jù)要寫入 / 讀取的數(shù)據(jù)的類型,設(shè)置 DC為高(數(shù)據(jù)) /低 (命令),然后拉低片選,選中 SSD1306,接著我們根據(jù)是讀數(shù)據(jù),還是要寫數(shù)據(jù)置RD/WR為低,然后:在 RD的上升沿, 使數(shù)據(jù)鎖存到數(shù)據(jù)線( D7:0 )上;在 WR的上升沿,使數(shù)據(jù)寫入到 SSD1306里面;SSD1306的 8080 并口寫時(shí)序圖如下:圖 3.9.1.3 8080 并口寫時(shí)序圖 SSD1306的 8080 并口讀時(shí)序圖如下:精彩文檔實(shí)用標(biāo)

7、準(zhǔn)文案圖 3.9.1.4 8080 并口讀時(shí)序圖SSD1306的 8080 接口方式下,控制腳的信號(hào)狀態(tài)所對(duì)應(yīng)的功能如下表:表 3.9.1.2 控制腳信號(hào)狀態(tài)功能表在 8080 方式下讀數(shù)據(jù)操作的時(shí)候,我們有時(shí)候(例如讀顯存的時(shí)候)需要一個(gè)假讀命 (Dummy Read),以使得微控制器的操作頻率和顯存的操作頻率相匹配。在讀取真正的數(shù)據(jù)之前,由 一個(gè)的假讀的過程。這里的假讀,其實(shí)就是第一個(gè)讀到的字節(jié)丟棄不要,從第二個(gè)開始,才是我們真 正要讀的數(shù)據(jù)。一個(gè)典型的讀顯存的時(shí)序圖,如下圖所示:圖 3.9.1.5 讀顯存時(shí)序圖精彩文檔實(shí)用標(biāo)準(zhǔn)文案Dummy Read,也就是假讀,我們從第二個(gè)4 線串行(

8、 SPI )方式, 4 先串口模式使用的可以看到,在發(fā)送了列地址之后,開始讀數(shù)據(jù),第一個(gè)是 開始,才算是真正有效的數(shù)據(jù)。并行接口模式就介紹到這里,我們接下來介紹一下 信號(hào)線有如下幾條:CS:OLED片選信號(hào)。RST(RES):硬復(fù)位 OLED。DC:命令 / 數(shù)據(jù)標(biāo)志( 0,讀寫命令; 1,讀寫數(shù)據(jù))SCLK:串行時(shí)鐘線。在 4 線串行模式下,SDIN:串行數(shù)據(jù)線。在 4 線串行模式下, 模塊的 D2 需要懸空,其他引腳可以接到D0 信號(hào)線作為串行時(shí)鐘線 SCLK。D1 信號(hào)線作為串行數(shù)據(jù)線 SDIN。GND。在 4 線串行模式下,只能往模塊寫數(shù)據(jù)而不能讀 數(shù)據(jù)。在 4 線 SPI 模式下,每

9、個(gè)數(shù)據(jù)長(zhǎng)度均為 8 位,在 SCLK的上升沿,數(shù)據(jù)從 SDIN 移入到 SSD1306, 并且是高位在前的。 DC線還是用作命令 / 數(shù)據(jù)的標(biāo)志線。在 4 線 SPI 模式下,寫操作的時(shí)序如下:圖 3.9.1.6 4 線 SPI 寫操作時(shí)序圖4 線串行模式就為大家介紹到這里。其他還有幾種模式,在SSD1306 的數(shù)據(jù)手冊(cè)上都有詳細(xì)的介紹,如果要使用這些方式,請(qǐng)大家參考該手冊(cè)。接下來,我們介紹一下模塊的顯存, SSD1306的顯存總共為 128*64bit 大小, SSD1306將這些顯存分為了 8 頁(yè),其對(duì)應(yīng)關(guān)系如下:表 3.9.1.3SSD1306顯存與屏幕對(duì)應(yīng)關(guān)系表可以看出, SSD130

10、6的每頁(yè)包含了 128 個(gè)字節(jié),總共 8 頁(yè),這樣剛好是 128*64 的點(diǎn)陣大小。因 為每次寫入都是按字節(jié)寫入的,這就存在一個(gè)問題,如果我們使用只寫方式操作模塊,那么,每次要 寫 8 個(gè)點(diǎn),這樣,我們?cè)诋孅c(diǎn)的時(shí)候,就必須把要設(shè)置的點(diǎn)所在的字節(jié)的每個(gè)位都搞清楚當(dāng)前的狀態(tài) (0/1 ?),否則寫入的數(shù)據(jù)就會(huì)覆蓋掉之前的狀態(tài),結(jié)果就是有些不需要顯示的點(diǎn),顯示出來了,或精彩文檔實(shí)用標(biāo)準(zhǔn)文案者該顯示的沒有顯示了。這個(gè)問題在能讀的模式下,我們可以先讀出來要寫入的那個(gè)字節(jié),得到當(dāng)前 狀況,在修改了要改寫的位之后再寫進(jìn)GRAM,這樣就不會(huì)影響到之前的狀況了。但是這樣需要能讀GRAM,對(duì)于 3線或 4線 SP

11、I模式,模塊是不支持讀的,而且讀 -改-寫的方式速度也比較慢。所以我們采用的辦法是在 STM32的內(nèi)部建立一個(gè) OLED的 GRAM(共 128 個(gè)字節(jié)),在每次修改的 時(shí)候,只是修改 STM32上的 GRAM(實(shí)際上就是 SRAM),在修改完了之后,一次性把STM32上的 GRAM寫入到 OLED的 GRAM。當(dāng)然這個(gè)方法也有壞處,就是對(duì)于那些SRAM很小的單片機(jī)(比如 51 系列)就比較麻煩了。SSD1306的命令比較多,這里我們僅介紹幾個(gè)比較常用的命令,這些命令如下表:表 3.9.1.4SSD1306常用命令表第一個(gè)命令為 0X81,用于設(shè)置對(duì)比度的,這個(gè)命令包含了兩個(gè)字節(jié),第一個(gè)0X8

12、1 為命令,隨后發(fā)送的一個(gè)字節(jié)為要設(shè)置的對(duì)比度的值。這個(gè)值設(shè)置得越大屏幕就越亮。第二個(gè)命令為 0XAE/0XAF。 0XAE為關(guān)閉顯示命令; 0XAF為開啟顯示命令。 第三個(gè)命令為 0X8D,該指令也包含 2 個(gè)字節(jié),第一個(gè)為命令字,第二個(gè)為設(shè)置值,第二個(gè)字節(jié)的 BIT2 表示電荷泵的開關(guān)狀態(tài),該位為1 ,則開啟電荷泵,為 0 則關(guān)閉。在模塊初始化的時(shí)候,這個(gè)必須要開啟,否則是看不到屏幕顯示的。第四個(gè)命令為 0XB0B7,該命令用于設(shè)置頁(yè)地址,其低三位的值對(duì)應(yīng)著GRAM的頁(yè)地址。第五個(gè)指令為 0X000X0F,該指令用于設(shè)置顯示時(shí)的起始列地址低四位。第六個(gè)指令為 0X100X1F,該指令用于設(shè)

13、置顯示時(shí)的起始列地址高四位。 其他命令,我們就不在這里一一介紹了,大家可以參考 SSD1306 datasheet 的第 28 頁(yè)。從這頁(yè) 開始,對(duì) SSD1306的指令有詳細(xì)的介紹。最后,我們?cè)賮斫榻B一下 OLED模塊的初始化過程, SSD1306的典型初始化框圖如下圖所示:精彩文檔實(shí)用標(biāo)準(zhǔn)文案圖 3.9.1.7SSD1306初始化框圖驅(qū)動(dòng) IC 的初始化代碼, 我們直接使用廠家推薦的設(shè)置就可以了, 只要對(duì)細(xì)節(jié)部分進(jìn)行一些修改, 使其滿足我們自己的要求即可,其他不需要變動(dòng)。OLED的介紹就到此為止,我們重點(diǎn)向大家介紹了ALIENTEK OLED模塊的相關(guān)知識(shí),接下來我們將使用這個(gè)模塊來顯示字

14、符和數(shù)字。通過以上介紹,我們可以得出OLED顯示需要的相關(guān)設(shè)置步驟如下:1)設(shè)置 STM32與 OLED模塊相連接的 IO。這一步,先將我們與 OLED模塊相連的 IO 口設(shè)置為輸出,具體使用哪些 IO 口,這里需要根據(jù)連接電 路以及 OLED模塊所設(shè)置的通訊模式來確定。這些將在硬件設(shè)計(jì)部分向大家介紹。2)初始化 OLED模塊。其實(shí)這里就是上面的初始化框圖的內(nèi)容,通過對(duì)OLED相關(guān)寄存器的初始化,來啟動(dòng) OLED的顯示。為后續(xù)顯示字符和數(shù)字做準(zhǔn)備。3)通過函數(shù)將字符和數(shù)字顯示到OLED模塊上。這里就是通過我們?cè)O(shè)計(jì)的程序,將要顯示的字符送到OLED模塊就可以了,這些函數(shù)將在軟件設(shè)計(jì)部分向大家介紹

15、。通過以上三步,我們就可以使用 ALIENTEK OLED模塊來顯示字符和數(shù)字了,在后面我們還將會(huì) 給大家介紹顯示漢字的方法。這一部分就先介紹到這里。3.9.2 硬件設(shè)計(jì)精彩文檔實(shí)用標(biāo)準(zhǔn)文案OLED模塊的電路在上一節(jié)已有詳細(xì)說明了,這里我們介紹OLED模塊與 ALIETEK MiniSTM32 開 發(fā)板的連接, MiniSTM32 開發(fā)板地板的 LCD接口和 ALIENTEK OLED模塊直接可以對(duì)插, 連接如下圖:圖 3.9.2.1OLED模塊與開發(fā)板連接示意圖圖中綠色線圈出來的部分就是連接OLED的接口, 這里在硬件上, OLED與 MiniSTM32 開發(fā)板的 IO口對(duì)應(yīng)關(guān)系如下:OLE

16、D_CS對(duì)應(yīng) PC9;OLED_RS對(duì)應(yīng) PC8;OLED_W對(duì)R 應(yīng) PC7;OLED_RD對(duì)應(yīng) PC6; OLED_D7:0 對(duì)應(yīng) PB7:0;這些線的連接, MiniSTM32 的內(nèi)部已經(jīng)連接好了,我們只需要將OLED模塊插上去就好了。實(shí)物連接如下圖所示:精彩文檔實(shí)用標(biāo)準(zhǔn)文案圖 3.9.2.2OLED模塊與開發(fā)板連接實(shí)物圖3.9.3 軟件設(shè)計(jì)軟件設(shè)計(jì)我們依舊在之前的工程上面增加,首先在HARDWAR文E件夾下新建一個(gè)然后打開 USER文件夾下的工程, 新建一個(gè) 并將 OLED文件夾加入頭文件包含路徑。oled.c 的文件和 oled.h 的頭文件, 保存在OLED的文件夾。OLED文件夾

17、下,打開 oled.c ,輸入如下代碼:#include oled.h#include stdlib.h#include font.h#include delay.h/OLED 的顯存/ 存放格式如下 ./00 1 2 3 .127/10 1 2 3 .127/20 1 2 3 .127/30 1 2 3 .127/40 1 2 3 .127/50 1 2 3 .127/60 1 2 3 .127/70 1 2 3 .127u8 OLED_GRAM1288;/ 更新顯存到 LCDvoid OLED_Refresh_Gram(void)/ 設(shè)置頁(yè)地址( 07)/ 設(shè)置顯示位置列低地址,/ 設(shè) 置

18、 顯 示 位偏移了 2 列置列高地u8 i , n; for(i=0;i8;i+) LED_WR_Byte (0xb0+i ,OLED_CMD); OLED_WR_Byte (0x02 ,OLED_CMD); LED_WR_Byte (0x10 , OLED_CMD); 址for(n=0;n128;n+)OLED_WR_Byte(OLED_GRAMni , OLED_DATA); #if OLED_MODE=1/ 向 SSD1306寫入一個(gè)字節(jié)。/dat: 要寫入的數(shù)據(jù) / 命令/cmd: 數(shù)據(jù) / 命令標(biāo)志 0,表示命令 ;1 ,表示數(shù)據(jù) ;void OLED_WR_Byte(u8 dat

19、, u8 cmd) DATAOUT(dat)OLED_RS=cmd;精彩文檔實(shí)用標(biāo)準(zhǔn)文案OLED_CS=0;OLED_WR=0;OLED_WR=1;OLED_CS=1;OLED_RS=1;#else/SSD1306 寫入一個(gè)字節(jié)。/dat: 要寫入的數(shù)據(jù) / 命令 /cmd: 數(shù)據(jù) / 命令標(biāo)志 0,表示命令 ;1 ,表示數(shù)據(jù) void OLED_WR_Byte(u8 dat , u8 cmd)u8 i;OLED_RS=cmd; / 寫命令OLED_CS=0;for(i=0;i8;i+)OLED_SCLK=0; if(dat&0x80)OLED_SDIN=1; else OLED_SDIN=0

20、;OLED_SCLK=1; dat=1;OLED_CS=1;OLED_RS=1;#endif/ 開啟 OLED顯示void OLED_Display_On(void)OLED_WR_Byte(0X8,D OLED_CMD); /SET DCDC命令 OLED_WR_Byte(0X1,4 OLED_CMD); /DCDC ON OLED_WR_Byte(0XA,F(xiàn) OLED_CMD); /DISPLAY ON / 關(guān)閉 OLED顯示void OLED_Display_Off(void)OLED_WR_Byte(0X8,D OLED_CMD); /SET DCDC命令 OLED_WR_Byte(0

21、X1,0 OLED_CMD); /DCDC OFF OLED_WR_Byte(0XA,E OLED_CMD); /DISPLAY OFF / 清屏函數(shù),清完屏,整個(gè)屏幕是黑色的! 和沒點(diǎn)亮一樣 !void OLED_Clear(void)精彩文檔實(shí)用標(biāo)準(zhǔn)文案u8 i , n; for(i=0;i8;i+)for(n=0;n127|y63)return;/ 超出范圍了 .pos=7-y/8;bx=y%8;temp=1(7-bx);if(t)OLED_GRAMxpos|=temp;else OLED_GRAMxpos&=temp;/x1 ,y1,x2, y2 填充區(qū)域的對(duì)角坐標(biāo)/ 確保 x1=x2

22、;y1=y2 0=x1=127 0=y1=63/dot:0 ,清空 ;1 ,填充void OLED_Fill(u8 x1,u8 y1,u8 x2,u8 y2, u8 dot)u8 x, y;for(x=x1;x=x2;x+)for(y=y1;y=y2;y+)OLED_DrawPoint(x,y, dot);OLED_Refresh_Gram();/ 更新顯示 / 在指定位置顯示一個(gè)字符,包括部分字符/x:0127 /y:063/mode:0 ,反白顯示 ;1 ,正常顯示/size: 選擇字體 16/12void OLED_ShowChar(u8 x,u8 y,u8 chr ,u8 size ,

23、 u8 mode) u8 temp,t , t1;u8 y0=y; chr=chr- ;/ 得到偏移后的值 for(t=0;tsize;t+)1206 字/ 調(diào)用 1608 字體 if(size=12)temp=asc2_1206chrt; / 調(diào) 用 體else temp=asc2_1608chrt;精彩文檔實(shí)用標(biāo)準(zhǔn)文案for(t1=0;t18;t1+)if(temp&0x80)OLED_DrawPoint(x , y, mode); else OLED_DrawPoint(x ,y, !mode);temp=1;y+;if(y-y0)=size)y=y0;x+;break;/mn 函數(shù)u3

24、2 mypow(u8 m, u8 n)u32 result=1;while(n-)result*=m;return result; / 顯示 2 個(gè)數(shù)字/x ,y : 起點(diǎn)坐標(biāo)/len: 數(shù)字的位數(shù)/size: 字體大小/mode: 模式 0,填充模式 ;1 ,疊加模式/num: 數(shù)值 (04294967295);void OLED_ShowNum(u8 x,u8 y,u32 num, u8 len ,u8 size)u8 t , temp;u8 enshow=0;for(t=0;tlen;t+) temp=(num/mypow(10 , len-t-1)%10;if(enshow=0&tMA

25、X_CHAR_POSX)x=0;y+=16; if(yMAX_CHAR_POSY)y=x=0;OLED_Clear(); OLED_ShowChar(x, y, *p ,16,1);x+=8;p+;/ 初始化 SSD1303void OLED_Init(void)RCC-APB2ENR|=1APB2ENR|=1APB2ENR|=1MAPR=0X04000000; / 關(guān)閉 JTAG GPIOB-CRL=0X33333333; GPIOB-ODR|=0XFFFF;GPIOC-CRH&=0XFFFFFF00; GPIOC-CRL&=0X00FFFFFF; GPIOC-CRH|=0X00000033

26、; GPIOC-CRL|=0X33000000; GPIOC-ODR|=0X03C0;#else GPIOB-CRL&=0XFFFFFF00; GPIOB-CRL|=0XF0000033; GPIOB-ODR|=0X03;GPIOC-CRH&=0XFFFFFF00; GPIOC-CRH|=0X00000033; GPIOC-ODR|=30;1 , 0-127;OLED_WR_Byte(0xC0, OLED_CMD); / 設(shè)置 COM掃描方向 ;bit3:0 ,普通模式 ;1 ,重定義模 式 COMN-1-COM0;N:驅(qū)動(dòng)路數(shù)OLED_WR_Byte(0xD,A OLED_CMD); / 設(shè)

27、置 COM硬件引腳配置OLED_WR_Byte(0x12, OLED_CMD); /5:4 配置OLED_WR_Byte(0x81, OLED_CMD); / 對(duì)比度設(shè)置OLED_WR_Byte(0xEF,OLED_CMD); /1255; 默認(rèn) 0X7F ( 亮度設(shè)置,越大越亮 )OLED_WR_Byte(0xD,9 OLED_CMD); / 設(shè)置預(yù)充電周期OLED_WR_Byte(0xf1, OLED_CMD); /3:0 , PHASE 1;7:4 , PHASE 2;OLED_WR_Byte(0xD,B OLED_CMD); / 設(shè)置 VCOMH 電壓倍率OLED_WR_Byte(0x

28、30, OLED_CMD); /6:4 000 , 0.65*vcc;001 , 0.77*vcc;011 , 0.83*vcc;OLED_WR_Byte(0xA,4 OLED_CMD); / 全局顯示開啟 ;bit0:1 ,開啟;0 ,關(guān)閉 ;( 白屏/ 黑屏 )OLED_WR_Byte(0xA6, OLED_CMD); / 設(shè) 置 顯 示 方 式 ;bit0:1 , 反 相 顯 示 ;0 , 正 常 顯 示OLED_WR_Byte(0xA,F(xiàn) OLED_CMD); / 開啟顯示OLED_Clear(); 這里代碼明顯比之前的例程多了, 函數(shù)也比較多, 這里我們僅針對(duì)幾個(gè)比較重要的函數(shù)進(jìn)行

29、介紹。首先要介紹的是我們定義在 STM32內(nèi)部的 GRAM, u8 OLED_GRAM1288; 此部分 GRAM 對(duì)應(yīng) OLED模塊上的 GRAM。在操作的時(shí)候,我們只要修改STM32內(nèi)部的 GRAM就可以了,然后通過 OLED_Refresh_Gram函數(shù)把 GRAM一次刷新到 OLED 的 GRAM上。該函數(shù)代碼如下: void OLED_Refresh_Gram(void)u8 i , n;for(i=0;i8;i+) OLED_WR_Byte (0xb0+i , OLED_CMD);/設(shè)置頁(yè)地址( 07)OLED_WR_Byte (0x02 , OLED_CMD); / 設(shè)置顯示位置

30、列低地址,偏移了 2 列 OLED_WR_Byte (0x10 , OLED_CMD); / 設(shè)置顯示位置列高地址 for(n=0;n128;n+)OLED_WR_Byte(OLED_GRAMni , OLED_DATA);精彩文檔實(shí)用標(biāo)準(zhǔn)文案函數(shù)先設(shè)置頁(yè)地址,然后寫入列地址(也就是縱坐標(biāo)) ,然后從 0 開始寫入 128 個(gè)字節(jié), 寫滿該頁(yè), 最后循環(huán)把 8 頁(yè)的內(nèi)容都寫入, 就實(shí)現(xiàn)了整個(gè)從 STM32顯存到 OLED顯存的拷貝。 這里寫列地址的時(shí)候,偏移了 2 個(gè)列,是因?yàn)?SSD1306和 OLED模塊的連接硬件連接所致, 這里我們不需要關(guān)心,記住 SSD1306的 2就對(duì)應(yīng) OLED的

31、 0,就可以了。OLED_Refresh_Gram 函數(shù)還用到了一個(gè)外部函數(shù)OLED_WR_Byt,e 該函數(shù)直接和硬件相關(guān),該函數(shù)代碼如下:#if OLED_MODE=1void OLED_WR_Byte(u8 dat , u8 cmd)DATAOUT(dat);OLED_RS=cmd;OLED_CS=0;OLED_WR=0;OLED_WR=1;OLED_CS=1;OLED_RS=1;#elsevoid OLED_WR_Byte(u8 dat , u8 cmd)u8 i;OLED_RS=cmd; / 寫命令OLED_CS=0;for(i=0;i8;i+)160OLED_SCLK=0;if(d

32、at&0x80)OLED_SDIN=1;else OLED_SDIN=0;OLED_SCLK=1;dat=1;OLED_CS=1;OLED_RS=1;#endif這里有 2 個(gè)一樣的函數(shù), 通過宏定義 OLED_MOD來E決定使用哪一個(gè)。 如果 OLED_MODE,=1 就定義為并口模式,選擇第一個(gè)函數(shù),而如果為0,則為 4 線串口模式,選擇第二個(gè)函數(shù)。這兩個(gè)函數(shù)輸入?yún)?shù)均為 2 個(gè): dat 和 cmd,dat 為要寫入的數(shù)據(jù), cmd則表明該數(shù)據(jù)是命令 還是數(shù)據(jù)。這兩個(gè)函數(shù)的時(shí)序操作就是根據(jù)上面我們對(duì) 8080 接口以及 4 線 SPI 接口的時(shí)序 來編寫的。精彩文檔x 坐標(biāo),而 8 代表

33、的是頁(yè),每個(gè)代表 8x=100, y=29 這個(gè)點(diǎn)寫入 1,則可以用實(shí)用標(biāo)準(zhǔn)文案OLED_GRAM1288中的 128 代表列數(shù),也就是 個(gè)列,從高到底對(duì)應(yīng)列數(shù)從小到大。比如,我們要在 這個(gè)句子實(shí)現(xiàn):一OLED_GRAM1004|=12 ;個(gè) 通 用 的 在 點(diǎn) ( x , y ) 置 1 表 達(dá) 式為:OLED_GRAMxy/8|=1127|y63)return;/ 超出范圍了 .pos=7-y/8;bx=y%8;temp=1(7-bx);if(t)OLED_GRAMxpos|=temp;else OLED_GRAMxpos&=temp;該函數(shù)有 3個(gè)參數(shù),前兩個(gè)是坐標(biāo),第三個(gè) t 為要寫入

34、 1還是 0。該函數(shù)實(shí)現(xiàn)了我們?cè)?OLED模 塊上任意位置畫點(diǎn)的功能。在介紹完畫點(diǎn)函數(shù)之后,我們介紹一下顯示字符函數(shù),OLED_ShowCha,r 在介紹之前,我們來介紹一下字符( ASCII 字符集)是怎么顯示在 OLED模塊上去的。要顯示字符,我們先要有字符的點(diǎn)陣 數(shù)據(jù), ASCII 常 用的 字符 集總共 有 95 個(gè), 從空格符 開始 ,分別 為: !#$%&()*+ ,-0123456789:;?ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz|. 我們先要得到這個(gè)字符集的點(diǎn)陣數(shù)據(jù),這里我們介紹一個(gè)款很好的字符提取軟件: PC

35、toLCD2002完美版。該軟件可以提供各種字符,包括漢字(字體和大小都可以自己設(shè)置)陣提取,且取模方式可 以設(shè)置好幾種,常用的取模方式,該軟件都支持。該軟件還支持圖形模式 , 也就是用戶可以自己定義 圖片的大小, 然后畫圖, 根據(jù)所畫的圖形再生成點(diǎn)陣數(shù)據(jù), 這功能在制作圖標(biāo)或圖片的時(shí)候很有用。該軟件的界面如下:精彩文檔實(shí)用標(biāo)準(zhǔn)文案精彩文檔圖 3.9.3.1PCtoLCD2002 軟件界面然后我們選擇設(shè)置,在設(shè)置里面設(shè)置取模方式入下圖所示:圖 3.9.3.2設(shè)置取模方式實(shí)用標(biāo)準(zhǔn)文案上圖設(shè)置的取模方式,在右上角的取模說明里面有,即:從第一列開始向下每取8 個(gè)點(diǎn)作為一個(gè)字節(jié),如果最后不足 8 個(gè)點(diǎn)

36、就補(bǔ)滿 8 位。取模順序是從高到低,即第一個(gè)點(diǎn)作為最 高位。如 * 取為 10000000。其實(shí)就是按如下這種方式:取模方式圖解 高位在前。我們按這樣的取模方式,然后把 16*0 大小取模出來(對(duì)應(yīng)漢字大小為 12*12 和 16*16 ,字符的只有漢字的一半大! 里面,每個(gè) 12*6 的字符占用 12 個(gè)字節(jié),每個(gè) 16*8 的字符占用 16 個(gè)字節(jié)。具體見 (該部分我們不再這里列出來了,請(qǐng)大家參考光盤里面的代碼) 。在知道了取模方式之后, 我們就可以根據(jù)取模的方式來編寫顯示字符的代碼了, 上取模方式的顯示字符代碼如下:void圖 3.9.3.3從上到下,從左到右,OLED_ShowChar

37、(u8 x,u8 y, u8 chr ,u8u8 temp , t , t1;u8 y0=y; chr=chr- ;/ 得到偏移后的值for(t=0;tsize;t+) if(size=12)temp=asc2_1206chrt;else temp=asc2_1608chrt; / 體for(t1=0;t18;t1+)if(temp&0x80)OLED_DrawPoint(x else OLED_DrawPoint(x , y , !mode); if(y-y0)=size)y=y0;x+;break;精彩文檔ASCII 字符集按 12*6 大小和 ),保存在 font.h font.h 部分

38、代碼size , u8 mode)/ 調(diào)用 1206 字體調(diào)用,y,mode);tempODR=(GPIOB-ODR&0xff00)|(x&0x00FF); / 輸出/ 使用 4 線串行接口時(shí)使用#define OLED_SCLK PBout(0)#define OLED_SDIN PBout(1)#define OLED_CMD 0 / 寫命令#define OLED_DATA 1 / 寫數(shù)據(jù)/OLED 控制用函數(shù)void OLED_WR_Byte(u8 dat , u8 cmd);void OLED_Display_On(void);void OLED_Display_Off(void);void OLED_Refresh_Gram(void);void OLED_Init(void);void OLED_Clear(void);精彩文檔實(shí)用標(biāo)準(zhǔn)文案voidOLED_DrawPoint(u8x,u8 y, u8 t);voidOL

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論