atk-oled液晶模塊使用說明nano stm32f1_an1806_W_第1頁
atk-oled液晶模塊使用說明nano stm32f1_an1806_W_第2頁
atk-oled液晶模塊使用說明nano stm32f1_an1806_W_第3頁
atk-oled液晶模塊使用說明nano stm32f1_an1806_W_第4頁
atk-oled液晶模塊使用說明nano stm32f1_an1806_W_第5頁
已閱讀5頁,還剩11頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、正點原子AN1806AN1806 ATK-0.96 OLED 模塊使用說明本應(yīng)用文檔(AN1806)將教大家如何在 ALIENTEK NANO STM32F103 開發(fā)板上使用 ATK-0.96 OLED 模塊。 本文檔分為如下幾部分: 1, ATK-0.96 OLED 模塊簡介 2, 硬件連接 3, 軟件實現(xiàn) 4, 驗證 1、ATK-0.96OLED 模塊簡介ATK-0.96 OLED_V2.0(V2.0 是版本號,下面均以 OLED 表示該產(chǎn)品)是 ALIENTEK 推出的一款高性能OLED 顯示模塊,尺寸小巧(27mm*26mm),結(jié)構(gòu)緊湊,模塊通過 1的

2、 2.54mm 間距排針與外部連接,模塊外觀如圖 1.1 所示: 個 2*8P圖 1.1 ATK-0.96 OLED 模塊外觀圖該模塊具有如下特點:雙色可選,提供純藍(lán)色或黃藍(lán)雙色兩種模塊高分辨率,分辨率為:128*64超小尺寸,OLED 顯示屏為 0.96 寸,模塊尺寸僅為 27mm*26mm多種接口方式,提供 8086 并口、6800 并口、4 線 SPI 和 IIC 等五種接口方式集成 DCDC,無需外部高壓,僅需提供 3.3V 電源,即可正常工作 圖 1.1 中,左側(cè)的圖片是模塊的背面圖,右側(cè)的是正面圖。 1.1 特性參數(shù)模塊支持:8 位 6800 并口、8 位 8080 并口、IIC

3、以及 4 線 SPI 等 4 種通口,通過模 塊背面的 BS1,BS2 焊盤,可以自行設(shè)置模塊的接口方式。默認(rèn)為:8 位 8080 并口。該模塊各參數(shù)如表 1.1.1 和表 1.1.2 所示: 1開源電子網(wǎng)08/09/2018項目 說明 接口特性 3.3V(串電阻后,可與 5V 系統(tǒng)連接)通口 8 位 8080 并口(默認(rèn))、8 位 6800 并口、IIC、4 線 SPI屏幕分辨率 128*64正點原子AN1806表 1.1 ATK-0.96 OLED 模塊基本特性 注 1: 是分區(qū)域的雙色,前 16 行為黃色,后 48 行為藍(lán)色,

4、且黃藍(lán)色之間有一行不顯示的間隔區(qū)。注 2: OLED 所有點全部點亮。 注 3: 此壽命是指 OLED 亮度降到原來的一半(40cd/)的時候的值。 表 1.2 ATK-0.96 OLED 模塊電氣特性 ATK-0.96 OLED 模塊支持多種通口,通過模塊背面的BS1,BS2,可以自行設(shè)置模塊的通口方式,見表 1.3: 表 1.3 ATK-0.96 OLED 模塊通注 1:0 代表接 GND,1 代表接 VCC。 口方式設(shè)置 表 1.3 中,8 位 8080 并口方式,是 ATK-0.96 OLED 模塊的默認(rèn)設(shè)置,根據(jù)此表,大家可以自行設(shè)置模塊的通口方式。 1.2 模塊使用說明ATK-0.

5、96 OLED 模塊的控制器是 SSD1306,支持多種接口方式,我們模塊支持 4 種連接方式,這里我們介紹其中 2 種常用的連接方式的使用:8080 并口模式和 4 線 SPI 模式。 1.2.1 8080 并口模式ATK-0.96 OLED 模塊支持 8 位 8080 并口模式,總共需要 13 根信號線通信,這些信號線如下: CS:OLED 片選信號。WR(RW):向 OLED 寫入數(shù)據(jù)。RD:從 OLED 讀取數(shù)據(jù)。D7:0:8 位雙向數(shù)據(jù)線。RST(RES):硬復(fù)位 OLED。 DC:命令/數(shù)據(jù)標(biāo)志(0,讀寫命令;1,讀寫數(shù)據(jù))。 模塊的 8080 并口讀/寫的過程為:先根據(jù)要寫入/讀

6、取的數(shù)據(jù)的類型,設(shè)置 DC 為高(數(shù)據(jù))/低(命令),然后拉低片選,選中 SSD1306,接著我們根據(jù)是讀數(shù)據(jù),還是要寫數(shù)據(jù)置 RD/WR 為低,然后: 在 RD 的上升沿, 使數(shù)據(jù)鎖存到數(shù)據(jù)線(D7:0)上; 2開源電子網(wǎng)08/09/2018接口方式 4 線 SPIIIC8 位 68008 位 8080BS101101BS20011項目 說明 工作電壓 DC3.3V 工作電流 25mA全亮 Voh 2.97V(Min) Vol 0.33V(Max) Vih 2.64V(Min) Vil 0.66V(Max) 屏幕尺寸 0.96 寸 工作溫度 -4070 顏色 純

7、藍(lán)色、黃藍(lán)雙色 1亮度 280cd/ 壽命 316000 小時 模塊尺寸 27mm*26正點原子AN1806在 WR 的上升沿,使數(shù)據(jù)寫入到 SSD1306 里面; SSD1306 的 8080 并口寫時序如圖 所示:圖 8080 并口寫時序圖SSD1306 的 8080 并口讀時序如圖 所示: 圖 8080 并口讀時序圖 SSD1306 的 8080 接口方式下,控制腳的信號狀態(tài)所對應(yīng)的功能如表 所示: 表 控制腳狀態(tài)功能表 注 1:H 代表高電平(VCC),L

8、代表低電平(GND),代表上升沿。 在 8080 方式下讀數(shù)據(jù)操作的時候,我們有時候(例如讀顯存的時候)需要一個假讀命 (Dummy Read),以使得微控制器的操作頻率和顯存的操作頻率相匹配。在讀取真正的數(shù)據(jù)之前,由一個的假讀的過程。這里的假讀,其實就是第一個讀到的字節(jié)丟棄不要,從第二個開始,才是我們真正要讀的數(shù)據(jù)。 一個典型的讀顯存的時序圖,如圖 所示: 3開源電子網(wǎng)08/09/2018功能 RDWRCSDC寫命令 H1 LL讀狀態(tài) HLL寫數(shù)據(jù) H LH讀數(shù)據(jù) HLH正點原子AN1806圖 讀顯

9、存時序圖 可以看到,在發(fā)送了列地址之后,開始讀數(shù)據(jù),第一個是 Dummy Read,也就是假讀, 我們從第二個開始,才算是真正有效的數(shù)據(jù)。 1.2.2 4 線 SPI 模式ATK-0.96 OLED 模塊支持 4 線 SPI 通信模式,總共只需要 4 根信號線通信,這些信號線如下: CS:OLED 片選信號。 RST(RES):硬復(fù)位 OLED。 DC:命令/數(shù)據(jù)標(biāo)志(0,讀寫命令;1,讀寫數(shù)據(jù))。 SCLK(D0):串行時鐘線。在 4 線串行模式下,D0 信號線作為串行時鐘線 SCLK。SDIN(D1):串行數(shù)據(jù)線。在 4 線串行模式下,D1 信號線作為串行數(shù)據(jù)線 SDIN。 模塊的 D2

10、需要懸空,其他引腳可以接到GND。在 4 線串行模式下,只能往模塊寫數(shù)據(jù)而不能讀數(shù)據(jù)。 在 4 線 SPI 模式下,每個數(shù)據(jù)長度均為 8 位,在 SCLK 的上升沿,數(shù)據(jù)從 SDIN 移入到SSD1306,并且是高位在前的。DC 線還是用作命令/數(shù)據(jù)的標(biāo)志線。在 4 線 SPI 模式下,寫操作的時序如圖 所示: 圖 4 線 SPI 寫操作時序圖 4 線 SPI 模式比較簡單,我們就不多說了。SSD1306 還支持其它一些模式,在 SSD1306的數(shù)據(jù)手冊上都有詳細(xì)的介紹,我們這里就不詳細(xì)介紹了,如果要使用這些方式,請大家參考該手冊。 4開源電子網(wǎng)www.opene

11、08/09/2018正點原子AN18061.2.3 顯存與指令顯存SSD1306 的顯存總共為 128*64bit 大小,SSD1306 將這些顯存分為了 8 頁,其對應(yīng)關(guān)系如表 所示: 表 SSD1306 顯存與屏幕對應(yīng)關(guān)系表 可以看出,SSD1306 的每頁包含了 128 個字節(jié),總共 8 頁,這樣剛好是 128*64 的點陣大小。因為每次寫入都是按字節(jié)寫入的,這就存在一個問題,如果我們使用只寫方式操作模塊,那么,每次要寫 8 個點,這樣,我們在畫點的時候,就必須把要設(shè)置的點所在的字節(jié)的每個位都搞清楚當(dāng)前的狀態(tài)(0

12、/1?),否則寫入的數(shù)據(jù)就會覆蓋掉之前的狀態(tài),結(jié)果就是有些不需要顯示的點,顯示出來了,或者該顯示的沒有顯示了。這個問題在能讀的模式下,我們可以先讀出來要寫入的那個字節(jié),得到當(dāng)前狀況,在修改了要改寫的位之后再寫進(jìn) GRAM, 這樣就不會影響到之前的狀況了。但是這樣需要能讀 GRAM,對于 4 線 SPI 模式或者 IIC 模式來說,模塊是不支持讀的,而且讀-改-寫的方式速度也比較慢。 所以我們推薦采用的辦法是在單片機的內(nèi)部建立一個 OLED 的GRAM(需要 128*8 個字節(jié)),在每次修改的時候,只是修改單片機上的 GRAM(實際上就是 SRAM),在修改完了之后,一次性把單片機內(nèi)部的 GRA

13、M 寫入到 OLED 的 GRAM。當(dāng)然這個方法也有壞處,就是對于那些 SRAM 很小的單片機(比如 51 系列)就比較麻煩了,如果內(nèi)存不夠,那就推薦還是采用并口模式,這樣可以節(jié)約內(nèi)存。 指令的指令比較多,這里我們僅介紹幾個比較常用的命令,這些命令如表 SSD1306所示: 5開源電子網(wǎng)08/09/2018序號 HEX各位描述 指令 說明 D7D6D5D4D3D2D1D008110000001設(shè)置對比度 A 的值越大,屏幕越亮 A7:0:0X000XFFA7:0A7A6A5A4A3A2A1A01AE/AF1010111X0設(shè)置顯示開關(guān) X0=0,關(guān)閉

14、顯示 X0=1,開啟顯示 28D10001101電荷泵設(shè)置 A2=0,關(guān)閉電荷泵A2=1,開啟電荷泵 A7:0*010A2003B0B710110X2X1X0設(shè)置頁地址 X2:0:07 對應(yīng)頁 074000F0000X3X2X1X0設(shè)置列地址 (低四位) 設(shè)置 8 位起始列地址的 低四位 5101F0001X3X2X1X0設(shè)置列地址 設(shè)置 8 位起始列地址的 列(COL0127) 行 (COM063) SEG0SEG1SEG2 SEG125SEG126SEG127PAGE0PAGE1PAGE2PAGE3PAGE4PAGE5PAGE6PAGE7正點原子AN1806

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

16、M 的頁地址。第五個指令為 0X000X0F,該指令用于設(shè)置顯示時的起始列地址低四位。 第六個指令為 0X100X1F,該指令用于設(shè)置顯示時的起始列地址高四位。 其令,我們就不在這里一一介紹了,大家可以參考 SSD1306 datasheet 的第 28 頁。從這頁開始,對SSD1306 的指令有詳細(xì)的介紹。 1.2.4 初始化流程ATK-0.96 OLED 模塊的驅(qū)動 IC 是 SSD1306,所以,對模塊的初始化,就是對 SSD1306 的初始化,SSD1306 典型的初始化框圖如圖 所示: 圖 SD1306 初始化框圖 整個過程比較簡單,主要是 SSD130

17、6 初始化序列,這部分代碼,我們直接用廠家推薦的初始化代碼即可,其他不需要變動。 6開源電子網(wǎng)08/09/2018開始顯示 OLED_DrawPoint(10,10);.OLED_Clear();清屏 OLED_WR_Byte(0xAF,OLED_CMD);開啟顯示 SSD1306初始化序列 OLED_WR_Byte(0xAE,OLED_CMD);. OLED_WR_Byte(0xA6,OLED_CMD);復(fù)位SSD1306RST=0;Delay_ms(10); RST=1;(高四位) 高四位 正點原子AN18062、硬件連接2.1

18、 硬件準(zhǔn)備資源本實驗所需要的硬件資源如下 1,ALIENTEK NANO STM32 開發(fā)板 1 個 2,ATK-0.96OLED 模塊 1 個(包含連接的杜邦線 15 條) 3,Micro USB 線一條(用于供電) 2.2 模塊與開發(fā)板連接歷程中默認(rèn)使用 8080 接口,NANO STM32 開發(fā)板與 ATK-0.96OLED 模塊的連接關(guān)系如表 2.2.1 所示: 表 2.2.1 ATK-0.96OLED 模塊與NANO STM32 開發(fā)板連接關(guān)系圖 3、軟件實現(xiàn)我們直接打開 OLED 顯示實驗可以發(fā)現(xiàn) HARDWARE 下面有一個 oled.c 文件,同時包含了頭文件 oled.h。這

19、里要說明一下,在我們寄存器版本的代碼中,我們是采取的位帶操作,這里我們采取的是庫函數(shù)來進(jìn)行 IO 操作。大家可以對照看一下。 oled.c 的代碼,由于比較長,這里我們就不貼出來了,僅介紹幾個比較重要的函數(shù)。首先是 OLED_Init 函數(shù),該函數(shù)的結(jié)構(gòu)比較簡單,開始是對 IO 口的初始化,這里我們用了宏定義OLED_MODE 來決定要設(shè)置的 IO 口,其他就是一些初始化序列了,我們按照廠家提供的資料來做就可以。最后要說明一點的是,因為 OLED 是無背光的,在初始化之后,我們把顯存都清空了,所以我們在屏幕上是看不到任何內(nèi)容的,跟沒通電一個樣,不要以為這就是初始化失敗,要寫入數(shù)據(jù)模塊才會顯示的

20、。OLED_Init 函數(shù)代碼如下: 7開源電子網(wǎng)08/09/2018/初始化 SSD1306 void OLED_Init(void)GPIO_InitTypeDef GPIO_Initure; HAL_RCC_GPIOA_CLK_ENABLE();/開啟 GPIOA 時鐘 HAL_RCC_GPIOB_CLK_ENABLE();/開啟 GPIOB 時鐘 HAL_RCC_GPIOC_CLK_ENABLE();/開啟 GPIOC 時鐘 GPIO_Initure.Pin=GPIO_PIN_2|GPIO_PIN_10|GPIO_PIN_11;ATK-0.96OLED 模

21、塊與開發(fā)板連接關(guān)系A(chǔ)TK-0.96OLED 模塊NANO STM32 開發(fā)板D0-D7PA0-PA7CSPB2RSTPB10RSPB11RDPB9WRPC13GNDGNDVCC3.3V正點原子AN18068開源電子網(wǎng)08/09/2018/PB2-CS PB10-RST PB11-RSGPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP;/推挽輸出GPIO_Initure.Pull=GPIO_PULLUP;/上拉GPIO_Initure.Speed=GPIO_SPEED_HIGH;/高速HAL_GPIO_Writ

22、ePin(GPIOB,GPIO_PIN_2|GPIO_PIN_10|GPIO_PIN_11,GPIO_PIN_SET);/PB2,PB10,PB11 輸出高 HAL_GPIO_Init(GPIOB,&GPIO_Initure);#if OLED_MODE=1/使用 8080 并口模式 GPIO_Initure.Pin=GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3| GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7; /PA0-A7 D0-D7HAL_GPIO_WritePin(GPIOA,0XFF,GPIO_PIN

23、_SET);/PA0-A7 輸出高 HAL_GPIO_Init(GPIOA,&GPIO_Initure);GPIO_Initure.Pin=GPIO_PIN_9; /PB9 HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_SET);/PB9 輸出高HAL_GPIO_Init(GPIOB,&GPIO_Initure);GPIO_Initure.Pin=GPIO_PIN_13; /PC13 HAL_GPIO_WritePin(GPIOC,GPIO_PIN_13,GPIO_PIN_SET);/PC13 輸出高HAL_GPIO_Init(GPIOC,&GPIO_

24、Initure);#else/使用 4 線 SPI 串口模式GPIOA-CRL&=0XFFFFF00F; GPIOA-CRL|=0X00000330; GPIOA-ODR|=(11)|(12);GPIO_Initure.Pin=GPIO_PIN_1|GPIO_PIN_2; /PA1 PA2 HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1|GPIO_PIN_2,GPIO_PIN_SET);/PA1 PA2 輸出高 HAL_GPIO_Init(GPIOA,&GPIO_Initure); #endifOLED_RST=0;delay_ms(100); OLED_RST=1;OL

25、ED_WR_Byte(0xAE,OLED_CMD); /關(guān)閉顯示OLED_WR_Byte(0xD5,OLED_CMD); /設(shè)置時鐘分頻因子,震蕩頻率OLED_WR_Byte(80,OLED_CMD);/3:0,分頻因子;7:4,震蕩頻率OLED_WR_Byte(0xA8,OLED_CMD); /設(shè)置驅(qū)動路數(shù)OLED_WR_Byte(0X3F,OLED_CMD); /默認(rèn) 0X3F(1/64)正點原子AN1806接著,要介紹的是OLED_Refresh_Gram 函數(shù)。我們在 STM32 內(nèi)部定義了一個塊 GRAM: u8 OLED_GRAM1288;此部分 G

26、RAM 對應(yīng) OLED 模塊上的 GRAM。在操作的時候,我們只要修改 STM32 內(nèi)部的 GRAM 就可以了,然后通過 OLED_Refresh_Gram 函數(shù)把 GRAM 一次刷新到 OLED 的GRAM 上。該函數(shù)代碼如下: 9開源電子網(wǎng)08/09/2018/更新顯存到 LCDvoid OLED_Refresh_Gram(void)u8 i,n; for(i=0;i8;i+)OLED_WR_Byte (0xb0+i,OLED_CMD);/ 設(shè) 置 頁 地 址 (07) OLED_WR_Byte (0x00,OLED_CMD);/設(shè)置顯示位置列低地址OLED_

27、WR_Byte (0x10,OLED_CMD);/設(shè)置顯示位置列高地址for(n=0;n0;1,0-127; OLED_WR_Byte(0xC0,OLED_CMD);/設(shè)置 COM 掃描方向;bit3:0,普通模式;1,重定義模式 COMN-1-COM0;N:驅(qū)動路數(shù)OLED_WR_Byte(0xDA,OLED_CMD); /設(shè)置 COM 硬件引腳配置OLED_WR_Byte(0x12,OLED_CMD); /5:4配置 OLED_WR_Byte(0x81,OLED_CMD); /對比度設(shè)置OLED_WR_Byte(0xEF,OLED_CMD); /1255;默認(rèn) 0X7F (亮度設(shè)置,越大越

28、亮) OLED_WR_Byte(0xD9,OLED_CMD); /設(shè)置預(yù)充電周期OLED_WR_Byte(0xf1,OLED_CMD); /3:0,PHASE 1;7:4,PHASE 2;OLED_WR_Byte(0xDB,OLED_CMD); /設(shè)置 VCOMH 電壓倍率 OLED_WR_Byte(0x30,OLED_CMD); /6:4 000,0.65*vcc;001,0.77*vcc;011,0.83*vcc;OLED_WR_Byte(0xA4,OLED_CMD); /全局顯示開啟;bit0:1,開啟;0,關(guān)閉;(白屏/黑屏) OLED_WR_Byte(0xA6,OLED_CMD);

29、/設(shè)置顯示方式;bit0:1,反相顯示;0,正常顯示 OLED_WR_Byte(0xAF,OLED_CMD); /開啟顯示OLED_Clear();正點原子AN1806 OLED_Refresh_Gram 函數(shù)先設(shè)置頁地址,然后寫入列地址(也就是縱坐標(biāo)),然后從 0開始寫入 128 個字節(jié),寫滿該頁,最后循環(huán)把 8 頁的內(nèi)容都寫入,就實現(xiàn)了整個從 STM32 顯存到 OLED 顯存的拷貝。 OLED_Refresh_Gram 函數(shù)還用到了一個外部函數(shù),也就是我們接著要介紹的函數(shù): OLED_WR_Byte,該函數(shù)直接和硬件相關(guān),函數(shù)代碼如下: 來決定使用哪一個。

30、如果 這里有 2 個一樣的函數(shù), 通過宏定義 OLED_MODEOLED_MODE=1,就定義為并口模式,選擇第一個函數(shù),而如果為 0,則為 4 線串口模式,選擇第二個函數(shù)。這兩個函數(shù)輸入?yún)?shù)均為 2 個:dat 和 cmd,dat 為要寫入的數(shù)據(jù),cmd 則 10開源電子網(wǎng)08/09/2018#if OLED_MODE=1/向 SSD1306 寫入一個字節(jié)。 /dat:要寫入的數(shù)據(jù)/命令 /cmd:數(shù)據(jù)/命令標(biāo)志 0,表示命令;1,表示數(shù)據(jù); void OLED_WR_Byte(u8 dat,u8 cmd)DATAOUT(dat);OLED_RS=cmd; OL

31、ED_CS=0; OLED_WR=0; OLED_WR=1; OLED_CS=1; OLED_RS=1;#else/向 SSD1306 寫入一個字節(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; OLED_SCLK=1;dat=1; OLED_CS=1; OLED_RS=1;#endifww

32、正點原子AN1806表明該數(shù)據(jù)是命令還是數(shù)據(jù)。這兩個函數(shù)的時序操作就是根據(jù)上面我們對 8080 接口以及 4 線 SPI 接口的時序來編寫的。 OLED_GRAM1288中的 128 代表列數(shù)(x 坐標(biāo)),而 8 代表的是頁,每頁又包含 8 行,總共 64 行(y 坐標(biāo))。從高到低對應(yīng)行數(shù)從小到大。比如,我們要在 x=100,y=29 這個點寫入1,則可以用這個句子實現(xiàn): OLED_GRAM1004|=12; 一個通用的在點(x,y)置 1 表達(dá)式為: OLED_GRAMx7-y/8|=1(7-y%8); 其中 x 的范圍為:0127;y 的范圍為:063。 因此,

33、我們可以得出下一個將要介紹的函數(shù):畫點函數(shù),void OLED_DrawPoint(u8 x,u8 y,u8 t);函數(shù)代碼如下: 該函數(shù)有 3 個參數(shù),前兩個是坐標(biāo),第三個 t 為要寫入 1 還是 0。該函數(shù)實現(xiàn)了我們在OLED 模塊上任意位置畫點的功能。 在介紹完畫點函數(shù)之后,我們介紹一下顯示字符函數(shù),OLED_ShowChar,在介紹之前, 我們來介紹一下字符(ASCII 字符集)是怎么顯示在 OLED 模塊上去的。要顯示字符,我們先要有字符的點陣數(shù)據(jù),ASCII 常用的字符集總共有95 個,從空格符開始,分別為:!#$%&()*+, -0123456789:;?ABCDEFGHIJKL

34、MNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz|. 我們先要得到這個字符集的點陣數(shù)據(jù),這里我們介紹一個款很好的字符提取軟件: PCtoLCD2002 完美版。該軟件可以提供各種字符,包括漢字(字體和大小都可以自己設(shè)置)陣提取,且取模方式可以設(shè)置好幾種,常用的取模方式,該軟件都支持。該軟件還支持圖形模式,也就是用戶可以自己定義圖片的大小,然后畫圖,根據(jù)所畫的圖形再生成點陣數(shù)據(jù),這功能在制作圖標(biāo)或圖片的時候很有用。該軟件的界面如圖 3.1 所示: 11開源電子網(wǎng)08/09/2018/畫點 /x:0127/y:063/t:1 填充 0

35、,清空 void OLED_DrawPoint(u8 x,u8 y,u8 t)u8 pos,bx,temp=0; if(x127|y63)return;/超出范圍了. pos=7-y/8;bx=y%8; temp=1(7-bx);if(t)OLED_GRAMxpos|=temp; else OLED_GRAMxpos&=temp;正點原子AN1806圖 3.1 PCtoLCD2002 軟件界面 然后我們選擇設(shè)置,在設(shè)置里面設(shè)置取模方式如圖 3.2 所示: 圖 3.2 設(shè)置取模方式 上圖設(shè)置的取模方式,在右上角的取模說明里面有,即:從第一列開始向下每取 8 個點

36、作為一個字節(jié),如果最后不足 8 個點就補滿 8 位。取模順序是從高到低,即第一個點作為最高位。如*取為 10000000。其實就是按如圖 3.3 所示的這種方式: 12開源電子網(wǎng)08/09/2018正點原子AN1806圖 3.3 取模方式圖解 從上到下,從左到右,高位在前。我們按這樣的取模方式,然后把ASCII 字符集按 12*6 大小和 16*0 大小取模出來(對應(yīng)漢字大小為 12*12 和 16*16,字符的只有漢字的一半大?。?,保存在 oledfont.h 里面,每個 12*6 的字符占用 12 個字節(jié),每個 16*8 的字符

37、占用 16 個字節(jié)。具體見 oledfont.h 部分代碼(該部分我們不再這里列出來了,請大家參考光盤里面的代碼)。 在知道了取模方式之后,我們就可以根據(jù)取模的方式來編寫顯示字符的代碼了,這里我們針對以上取模方式的顯示字符代碼如下: 13開源電子網(wǎng)08/09/2018/在指定位置顯示一個字符,包括部分字符 /x:0127/y:063/mode:0,反白顯示;1,正常顯示 /size:選擇字體 12/16/24void OLED_ShowChar(u8 x,u8 y,u8 chr,u8 size,u8 mode)u8 temp,t,t1; u8 y0=y;u8 cs

38、ize=(size/8+(size%8)?1:0)*(size/2);/得到字體一個字符對應(yīng)點陣集所占的字節(jié)數(shù)chr=chr- ;/得到偏移后的值for(t=0;tcsize;t+)if(size=12)temp=asc2_1206chrt;/調(diào)用 1206 字體else if(size=16)temp=asc2_1608chrt; /調(diào)用 1608 字體else if(size=24)temp=asc2_2412chrt; /調(diào)用 2412 字體else return;/沒有的字庫 for(t1=0;t18;t1+)if(temp&0x80)OLED_DrawPoint(x,y,mode);

39、 else OLED_DrawPoint(x,y,!mode); tempODR=(GPIOA-ODR&0xff00)|(x&0x00FF); /輸出 /使用 4 線串行接口時使用#define OLED_SCLK PAout(1) #define OLED_SDIN PAout(2)#define OLED_CMD0 /寫命令#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

40、_Refresh_Gram(void);void OLED_Init(void); void OLED_Clear(void);void OLED_DrawPoint(u8 x,u8 y,u8 t);x+;break;正點原子AN1806該部分比較簡單,OLED_MODE 的定義也在這個文件里面,我們必須根據(jù)自己 OLED 模塊 BS0 和BS1 的設(shè)置(目前代碼僅支持 8080 和 4 線 SPI)來確定 OLED_MODE 的值。這里的IO 操作我們?nèi)坎捎玫氖菐旌瘮?shù)而沒有使用位帶操作,目的是為了提高代碼的可移植性。 最后我們來看看主函數(shù)源碼: 該部分代碼用于在 OLED 上顯示一些字符,然后從空格鍵開始不停的循環(huán)顯示 ASCII 字符集,

溫馨提示

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

最新文檔

評論

0/150

提交評論