STM32使用IIC总线通讯协议在OLED屏幕上显示字符串、汉字、图像(硬件IIC)
參考:基于STM32-Oled(IIC)的使用
作者:奮斗的小殷
發布時間: 2021-05-07 13:09:26
網址:https://blog.csdn.net/boybs/article/details/116465668
目錄
- IIC總線簡介
- IIC協議簡介
- IIC總線系統結構
- IIC總線物理層特點
- 硬件IIC、軟件IIC區別
- IIC總線協議
- 主機(單片機)寫數據到從機(外設)
- 從機(外設)寫數據到主機(單片機)
- 復合格式(發送兩次起始信號,常用)
- IIC總線時序
- ① 空閑狀態
- ②開始信號
- ③停止信號
- ④應答信號
- ⑤數據的有效性
- ⑥數據傳輸
- STM32硬件IIC外設
- 通訊引腳
- 時鐘控制寄存器(配置通訊速率)
- 數據控制寄存器(控制IIC通訊過程)
- STM32的IIC結構體和庫函數
- STM32的IIC結構體
- STM32的IIC庫函數
- OLED屏幕介紹
- OLED顯示字符串
- OLED顯示漢字和圖片(取模軟件的使用)
IIC總線簡介
IIC協議簡介
IIC通訊協議(Inter----Integrted Circuit)是由Phiips飛利浦公司開發的,由于他引腳少,硬件實現簡單,可拓展性強,不需要UASRT(串口還可以需要ch340進行電平轉換)、CAN通訊協議的外部收發設備(就是外設,軟件IIC自己寫時序不用外設),現在被廣泛使用在系統內多個集成電路IC(芯片)間的通訊(芯片級的通訊一般都是使用IIC通訊)。
IIC是半雙工的通訊方式(SPI是全雙工,速度更快,不過線要多)
SDA:數據線
SCL:時鐘線
IIC總線系統結構
-
是一個支持多設備的總線。”總線”指多個設備共用的信號線,在一個IIC通訊總線中,可連接多個IIC通訊設備(最多同時連接127個),支持多個通訊主機及多個通訊從機。
-
一個IIC總線只使用兩條總線線路,一條雙向串行數據線(SDA),一條串行時鐘線(SCL)。數據線即用來表示數據,時鐘線用于數據收發同步。
-
每個連接到總線的設備都有一個獨立的地址,主機可以利用這個地址進行不同設備直接的訪問。
IIC總線物理層特點
-
總線通過上拉電阻接到電源。當IIC設備空閑時,會輸出高阻態(電阻很大,等效于斷開,前面在講GPIO四種輸出模式里有提過),而當所有設備都空閑,都輸出高阻態,由上拉電阻把總線拉成高電平。
-
多個主機同時使用總線時,為了防止數據沖突,會利用仲裁方式(CAN總線就是,類似單片機中斷優先級)決定哪個設備占用總線。
-
具有三種傳輸模式:標準模式傳輸速率為100kbit/s,快速模式為400kbit/s,高速模式下可達3.4M/s,但目前大多IIC設備尚不支持高速模式。
硬件IIC、軟件IIC區別
硬件IIC:
對應芯片上的IIC外設,有相對應的IIC驅動電路,其所使用的IIC管腳也是專用的(類似的PA9和PA10專門用于串口的收和發)
軟件IIC:
一般是用普通的GPIO管腳,用軟件控制管腳狀態以及模擬IIC通信波形實現IIC的功能
區別:
硬件IIC的效率要遠高于軟件的(專門的硬件驅動電路都集成好了的),而軟件IIC不受引腳限制(想要用哪個引腳作為IIC通訊都可以),接口比較靈活。
軟件IIC是通過GPIO,軟件模擬寄存器的工作方式,而硬件IIC是直接調用內部寄存器進行配置。如果要從具體硬件上來看,可以去看下芯片手冊。因為固件IIC的端口是固定的,所以會有所區別。
如何區分:
1.硬件IIC用法復雜,模擬IIC流程更加清楚
2.硬件IIC速度比模擬快,并且可以用DMA(DMA是一種通道,目前不用了解太多)
3.模擬IIC可以在任何管腳上,硬件IIC在固定管腳上
IIC總線協議
IIC的協議定義了通訊的起始和停止信號、數據有效性、響應、仲裁、時鐘同步和地址廣播等環節。
主機(單片機)寫數據到從機(外設)
陰影部分代表主機給從機發送信號
白色部分代表從機給主機發送信號
- S:數據由主機傳輸至從機(是個起始信號)
- SLAVE ADDRESS(從機地址): 起始信號產生后,所有從機就開始緊接下來廣播的從機地址信號。IIC總線,每個設備的地址都是唯一的,當主機廣播的地址與某個設備的地址相同時,這個設備就被選中了,沒被選中的設備講會忽略之后的數據信號。根據IIC協議,這個從機地址可以是7位或10位。
- R/W(讀/寫):傳輸方向選擇位,為0:表示主機向從機寫數據。為1:則相反。
- ACK:從機接收傳輸方向選擇位后,主機或從機會返回一個應答(ACK 上圖A)或非應答(NACK 上圖A/A)信號,只有接收到應答信號后,主機才能繼續發送或接收數據。
- P:數據傳輸結束
從機(外設)寫數據到主機(單片機)
陰影部分代表主機給從機發送信號
白色部分代表從機給主機發送信號
主機讀從機數據:
配置方向傳輸位為”讀數據”方向,廣播完地址后,接收到應答信號后,從機開始向主機返回數據(DATA),數據包大小也為8位,從機每發送完一個數,都會等待主機的應答信號(ACK),重復這個過程,可以返回N個數據,N沒有限制大小。當主機希望停止接收數據時,就向從機返回一個非應答信號(NACK),則從機自動停止數據傳輸。
復合格式(發送兩次起始信號,常用)
陰影部分代表主機給從機發送信號
白色部分代表從機給主機發送信號
復合格式,該傳輸過程有兩次起始信號(S)
在第一次傳輸過程中,主機通過SLAVE_ADDRESS尋找到從設備后,發送一段”數據”,這段數據通常用于表示從設備內部的寄存器或存儲器地址;第二次傳輸中,對該地址的內容進行讀或寫。也就是說,第一次通訊是告訴從機讀寫地址,第二次則是讀寫的實際內容。
IIC總線時序
① 空閑狀態
IIC總線的SDA和SCL兩條信號線同時處于高電平時,規定位總線的空閑狀態。此時各個器件的輸出級場效應管均處在截止狀態,即釋放總線,由兩條信號線各自的上拉電阻把電平拉高。
②開始信號
起始信號:當SCL為高電平期間,SDA有高到低的跳變;啟動信號是一種電平跳變時序信號,而不是一個電平信號。
③停止信號
停止信號:當SCL為高電平期間,SDA由低到高的跳變;停止信號也是一種高電平跳變時序信號,而不是一個電平信號。
串口也有起始信號和停止信號,只不過串口是沒有同步的,起始信號和停止信號一般由主機產生。
④應答信號
發送器每發送一個字節(一個字節是8位),就在時鐘脈沖9期間(下圖所示)釋放數據線,由接收器反饋一個應答信號。
- 應答信號為低電平時,規定為有效應答位(ACK簡稱應答位)表示接收器已經成功地接收了該字節;
- 應答信號為高電平時,規定為非應答位(NACK),一般表示接收器接收該字節沒有成功。
對于反饋有效應答位ACK的要求是,接收器在第九個時鐘脈沖之前的低電平期間將SDA線拉低,并且確保在該時鐘的高電平期間為穩定的低電平。
如果接收器是主控器,則在它收到最后一個字節后,發送一個NACK信號,以通知被控發送器數據發送,并釋放SDA線,以便主控接收器發送一個停止信號P。
⑤數據的有效性
IIC總線進行數據傳輸時,時鐘信號為高電平期間,數據線上的數據必須保持穩定,只有在時鐘線上的信號為低電平期間,數據線上的高電平或低電平狀態才允許變化。SDA數據線在SCL的每個時鐘周期傳輸一位數據。
即:數據在SCL的上升沿到來之前就需準備好。并在下降沿到來之前必須穩定
⑥數據傳輸
在IIC總線上傳送的每一位數據都有一個時鐘脈沖相對應(或同步控制),即在SCL串行時鐘的配合下,在SDA上逐位地串行傳送每一位數據。數據位的傳輸是邊沿觸發。
STM32硬件IIC外設
①軟件模擬協議: 使用CPU直接控制通訊引腳的電平,產生出符合通訊協議標準的邏輯。可移植性強,用的最多。
②硬件實現協議: 由STM32的IIC片上外設專門負責實現IIC通訊協議,只要配置好該外設,它就會自動根據協議要求產生通訊信號,收發數據并緩存起來,CPU只要檢測該外設的狀態和訪問數據寄存器,就能完成數據收發。這種由硬件外設處理IIC協議的方式減輕了CPU的工作,且使軟件設計更加簡單(感覺和定時器/計數器很像)。
無論如何,芯片總還是會需要外接一些設備實現某種系統,為了與那些外設相區別,就將集成在芯片內,但是又不屬于芯片本身(比如DSP,是一種微處理器,因此芯片中不屬于微處理器的部分都是外設)的稱為“片上外設”
STM32的IIC外設可用作通訊的主機及從機,支持100Kbit/s和400Kbits/s的速率,支持7位、10位設備地址,支持DMA數據傳輸,并具有數據校驗功能。
通訊引腳
STM32芯片有多個IIC外設,它們的IIC通訊信號引出到不同的GPIO引腳上,使用時必須配置這些指定的引腳(硬件IIC)。下圖中有三組外設IIC引腳,如果我們使用軟件方式的話,任何一個IO口都可以作為IIC通訊接口。
時鐘控制寄存器(配置通訊速率)
底下的2就是時鐘控制部分
其中SMBA:數據傳輸方式,是從高位開始傳還是從低位開始傳。
SCL線的時鐘信號,由IIC接口根據時鐘控制寄存器(CCR)控制,控制的參數主要為時鐘頻率。
-
可選擇IIC通訊的“標準/快速”模式,這兩個模式分別對應100/400Kbits/s的通訊速率。
-
在快速模式下可選擇SCL時鐘的占空比,可選T(low)/T(high) = 2或T(low)/T(high)=16/9模式(如下圖所示),T(low)+T(high)是一個周期,T(low)/T(high)可以計算出占空比。
-
CCR寄存器中12位的配置因子CCR,它與IIC外設的輸入時鐘源共用作用,產生SCL時鐘。STM32的IIC外設輸入時鐘源位PCKL1(PCLK1 = 36MHz,AHB1總線的頻率是個二分頻)。
配置通訊速率——計算時鐘控制CCR寄存器的值
-
標準模式
T high = CCR* Tpckl1
T low= CCR* Tpclk1 -
快速模式中 Tlow/Thigh =2時:
Thigh = CCR* Tpckl1
Tlow = 2* low* Tpckl1 -
快速模式中 Tlow/Thigh =16/9時:
Thigh = 9* CCR* Tpckl1
Tlow = 16* low* Tpckl1
例如(快速模式中 Tlow/Thigh =2時):PCLK1 = 36MHz(AHB1總線的頻率 是個二分頻),想要配置400Kbits/s 方法:
PCLK時鐘周期: TPCLK1 = 1/36 000 000
目標SCL時鐘周期: TSCL = 1/400 000
SCL時鐘周期內的高電平時間: Thigh = TSCL/3
SCL時鐘周期內的低電平時間: Tlow = 2*TSCL/3
計算CCR的值 : CCR = THIGH/TPCLK1 = 30
計算出來的值寫入到寄存器即可
數據控制寄存器(控制IIC通訊過程)
底下的3就是數據控制部分
其中SMBA:數據傳輸方式,是從高位開始傳還是從低位開始傳。
IIC的SDA信號主要連接到數據移位寄存器上,數據移位寄存器的數據來源及目標是數據寄存器(DR)、地址寄存器(OAR)、PEC寄存器以及SDA數據線。
- 當向外發送數據的時候,數據移位寄存器以“數據寄存器”為數據源,把數據一位一位地通過SDA信號線發送出去(上面講到的SMBA來控制傳輸順序,是從高位開始傳的)。
- 當從外部接收數據的時候,數據移位寄存器把SDA信號線采樣到的數據一位一位地存儲到”數據寄存器”中。
使用IIC外設通訊時,在通訊的不同階段它會對”狀態寄存器(SR1和SR2)”的不同數據位寫入參數,通過讀取這些寄存器標志來了解通訊狀態。
主發送器
-
控制產生起始信號(S),當發生起始信號后,它產生事件”EV5”(Event5),并會對SR1寄存器的 SB 位置1(如下圖所示),表示起始信號已經發生。
-
發送設備地址并等待應答信號,若有從機應答,則產生時間 EV6 及 EV8 ,這時SR1寄存器的ADDR位及TXE位被置1(如下圖所示),ADDR位1表示地址已經發送,TEX表示數據寄存器為空。
-
往IIC的數據寄存器DR寫入要發送的數據,這時TXE位會被重置為0,表示數據寄存器非空,IIC外設通過SDA信號線一位位把數據發送出去后,又會產生EV8事件,即TXE被置1,重復這個過程,可發送多個字節。
-
發送數據完成后,控制IIC設備產生一個停止信號P,這個時候產生EV2事件,SR1的TEX位及BTF位被置1(如下圖所示),表示通訊結束。
STM32的IIC結構體和庫函數
STM32的IIC結構體
在固件包i2c.h里面
typedef struct {uint32_t I2C_ClockSpeed; //設置SCL時鐘頻率,此值要低于400 000 uint16_t I2C_Mode; //指定工作模式,可選IIC模式及SMBUS模式uint16_t I2C_DutyCycle; //時鐘占空比,可選low/high = 2:0或16:9uint16_t I2C_OwnAddress1; //自身的IIC設備地址 uint16_t I2C_Ack; //使能或者關閉響應,一般是使能uint16_t I2C_AcknowledgedAddress; //指定地址長度,可為7或10 }I2C_InitTypeDef;-
I2C_ClockSpeed
設置IIC的傳輸速率,在調用初始化函數時,函數會根據我們輸入的數值經過運算后把時鐘因子寫入到IIC的時鐘控制寄存器CCR。而我們寫入的這個參數值不得高于400Khz(如下圖所示)。
實際上由于CCR寄存器不能寫入小數類型的時鐘因子,影響到SCL的實際頻率可能會低于本成員設置的參數值,這時除了通訊會稍微慢點以外,不會對IIC的標準通訊造成其他影響。
-
I2C_Mode
選擇IIC的使用方式,有IIC模式(IIC_Mode_IIC)和SMBus主、從模式(IIC_Mode_SMBusHost、IIC_Mode_SMBusDevice)
IIC不需要在此處區分主從模式,直接設置IIC_Mode_IICj即可 -
I2C_DutyCycle
設置IIC的SCL線時鐘的占空比。該配置有兩個選擇,分別為低電平時間比高電平時間為2:1(IIC_DutyCycle_2)和16:9(IIC_DutyCycle_16_9).
其實這兩個模式的比例差別并不大,一般要求都不會如此嚴格,這里隨便選就可以了。
-
I2C_OwnAddress1
配置STM32的IIC設備自己的地址,每個連接到IIC總線上的設備都有一個自己的地址,作為主機也不例外。地址可以設置為7位或10位(受下面IIC_AcknowledgeAddress成員決定),只要該地址是IIC總線上唯一的即可。
STM32的IIC外設可同時使用兩個地址(如下圖所示),即同時對兩個地址作出響應(使用非常的靈活),這個結構體成員I2C_OwnAddress1配置的是默認的,OAR1寄存器存儲的地址,若需要設置第二個地址寄存器OAR2,可使用I2C_OwnAddress2Config函數來配置,OAR2不支持10位地址。
-
I2C_Ack
配置IIC應答是否使能,設置位使能則可以發送響應信號,一般配置位允許應答(IIC_Ack_Enable),這是絕大多數遵循IIC標準的設備的通訊要求,改為禁止應答(IIC_Ack_Disable)往往會導致通訊錯誤。 -
I2C_AcknowledgedAddress
選擇IIC的尋址模式是7位或者是10位地址,這需要根據實際連接到IIC總線上設備的地址進行選擇,這個成員的配置也影響到IIC_OwnAddress成員,只有這里設置成10位模式時,IIC_OwnAddress1才支持10位地址
配置完這些結構體成員的值,調用庫函數IIC_Init就可以把結構體的配置寫入到對應的寄存器中了。
STM32的IIC庫函數
固件包.h文件里都給出了,僅列出了部分。
//配置自身設備地址2 void I2C_OwnAddress2Config(I2C_TypeDef* I2Cx, uint8_t Address); //發送設備地址 void I2C_Send7bitAddress(I2C_TypeDef* I2Cx, uint8_t Address, uint8_t I2C_Direction); //接收數據 uint8_t I2C_ReceiveData(I2C_TypeDef* I2Cx);//停止接收 void I2C_AcknowledgeConfig(I2C_TypeDef* I2Cx, FunctionalState NewState); //IIC外設開始正常工作 void I2C_Cmd(I2C_TypeDef* I2Cx, FunctionalState NewState);OLED屏幕介紹
OLED即有機發光管(Organic Light-Emitting Diode,OLED)。OLED顯示技術具有自發光、廣視角、幾乎無窮高的對比度、較低功耗、極高反應速度、可用于繞曲性面板、使用溫度范圍廣、構造及制程簡單等有點,被認為是下一代的平面顯示屏新興應用技術。
OLED顯示和傳統的LCD顯示不同,其可以自發光,所以不需要背光燈,這使得OLED顯示屏相對于LCD顯示屏尺寸更薄,同時顯示效果更優。
常用的OLED屏幕有藍色、黃色、白色等幾種。屏的大小為0.96寸,像素點為
128*64,所以我們稱為0.96oled屏或者12864屏。
OLED屏幕特點
1.模塊尺寸:23.7 *23.8mm
2.電源電壓:3.3-5.5V
3.驅動芯片:SSD1306
4.測試平臺:提供 k60/k10,9s12XS128,51,stm32,stm8等單片機
OLED屏幕接線說明
OLED屏幕顯存
OLED本身是沒有顯存的,他的顯存是依賴SSD1306(驅動芯片)提供的,而SSD1306提供一塊顯存。
SSD1306顯存總共為128*64bit大小,SSD1306將這些顯存分成了8頁(上圖8行),每頁包含了128個字節(每列8個像素點,共128列)。
OLED屏幕原理
STM32沒有顯存,它在內部建立一個緩存(共128*8個字節),每次修改的時候,只是修改STM32上的緩存(實際上就是SRAM),修改完后一次性把STM32上的緩存數據寫入到OLED的GRAM顯存上 。
這個方法也有壞處,對于SRAM很小的單片機(51系列)就比較麻煩。
OLED屏幕常用指令表
指令的使用說明(上圖第二列)
- 指令0X81: 設置對比度。包含兩個字節,第一個0X81為命令,隨后方法是的一個字節要設置這個對比度,值越大屏幕越亮。
- 指令0XAE/0XAF: 0XAE為關閉顯示命令,0XAF為開啟顯示命令
- 指令0X8D: 包含兩個字節,第一個為命令字,第二個為設置值,第二個字節的A2位表示電荷泵的開關狀態,該位為1開啟電荷泵,為0則關閉。模塊初始化的時候,這個必須要開啟,否則看不到屏幕顯示。
- 指令0XB0~B7:用于設置頁地址(前面講到了,一共分成了8頁),其低三位的值對應GRAM頁地址(很好理解,二進制三位可表示0–8)。
- 指令0X00~0X0F:用于設置顯示時的起始列地址低四位。
- 指令0X10~0X1F: 用于設置顯示時的起始列地址高四位。
OLED屏幕字模軟件的使用
OLED打點方式(64行*128列的點陣)
OLED點陣的點亮方式,舉個顯示”P”的例子,最左邊位最高位P7。
-
1.可以看出,要想顯示”P”,首先寫入0x1f,則顯示一個豎杠,之后控制器自動水平移動到下一列。
-
2.再寫入0X05,則出現兩個小橫桿,這個兩個橫桿就是0X05中0000 0101中兩個1所處的位置,寫完第二列后,控制器自動跳到第三列.
-
3.再寫入0X07,第四列寫入0X00后,P就顯示出來了。這也說明,即使你只想再一列的最上端顯示一個小點,即寫入0X01.
-
4.不能一次性控制一個點陣,只能一次性控制八位點陣(8個像素),即一列點陣。這也決定了字模選擇的取模方式為“列行式“。
OLED顯示字符串
顯示效果:
oled.c
#include "stm32f10x.h" #include "oled.h" #include "delay.h" #include "OLED_Codetab.h"//字庫文件 下面給出了//OLED存放格式 分成了8頁 每頁都是8*128 //[0]0 1 2 3 ... 127 //[1]0 1 2 3 ... 127 //[2]0 1 2 3 ... 127 //[3]0 1 2 3 ... 127 //[4]0 1 2 3 ... 127 //[5]0 1 2 3 ... 127 //[6]0 1 2 3 ... 127 //[7]0 1 2 3 ... 127//IIC結構體配置 void I2C_Configuration(void) {I2C_InitTypeDef I2C_InitStructure; //I2C結構體配置 i2c.h里面GPIO_InitTypeDef GPIO_InitStructure; //GPIO結構體配置 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //時鐘使能 rcc.h里面RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);//PB6——>SCL PB7——>SDA 接線方式GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;//IIC空閑時高阻態 復用開漏GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_6;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB,&GPIO_InitStructure);//I2CI2C_DeInit(I2C1);//初始化使用它I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;//應答 使能I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;//地址選7位I2C_InitStructure.I2C_ClockSpeed = 400000;//時鐘速度400KI2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;//2:1 16:9都可以I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;//I2C模式I2C_InitStructure.I2C_OwnAddress1 = 0X10;//主機地址 隨便寫I2C_Init( I2C1, &I2C_InitStructure);//初始化I2C1I2C_Cmd( I2C1, ENABLE); //使能I2C1 }//硬件IIC寫一個字節 void I2C_WriteByte(uint8_t addr , uint8_t data) {while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY)); //檢測I2C總線是否繁忙 等待繁忙結束I2C_GenerateSTART(I2C1, ENABLE); //開啟IIC1while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)); //EV5 主模式 檢查是否應答 I2C_Send7bitAddress(I2C1, OLED_ADDRESS, I2C_Direction_Transmitter); //發生器地址(7位) OLED_ADDRESS的值在oled.h中定義了 方向:發送器件地址(找到從機)while(!I2C_CheckEvent(I2C1 ,I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED)); //EV6(宏定義)I2C_SendData( I2C1, addr); //寄存器地址(復合格式 發送兩次起始信號) while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTING)); //EV8 主模式 每次發送完都要有應答的 需要檢測應答I2C_SendData( I2C1 , data); //發送數據(復合格式 發送兩次起始信號) 上面形參while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTING)); //EV8 ?÷?£ê?I2C_GenerateSTOP(I2C1,ENABLE ); //關閉I2C總線 } //給OLED 寫命令 void WriteCmd(unsigned char I2C_Cmd) { I2C_WriteByte(0X00,I2C_Cmd);//在0X00地址(ROM里)寫 51單片機LCD1602講的 }//給OLED 寫數據 void WriteData(unsigned char I2C_Data) { I2C_WriteByte(0X40 , I2C_Data); //51單片機LCD1602講的 }//OELD屏幕初始化 這部分代碼是廠家提供的 復制過來不用太關注原理 void OLED_Init(void) {delay_ms(100);WriteCmd(0xAE); //display offWriteCmd(0x20); //Set Memory Addressing Mode WriteCmd(0x10); //00,Horizontal Addressing Mode;01,Vertical Addressing Mode;10,Page Addressing Mode (RESET);11,InvalidWriteCmd(0xb0); //Set Page Start Address for Page Addressing Mode,0-7WriteCmd(0xc8); //Set COM Output Scan DirectionWriteCmd(0x00); //---set low column addressWriteCmd(0x10); //---set high column addressWriteCmd(0x40); //--set start line addressWriteCmd(0x81); //--set contrast control registerWriteCmd(0xff); //亮度調節 0x00~0xffWriteCmd(0xa1); //--set segment re-map 0 to 127WriteCmd(0xa6); //--set normal displayWriteCmd(0xa8); //--set multiplex ratio(1 to 64)WriteCmd(0x3F); //WriteCmd(0xa4); //0xa4,Output follows RAM content;0xa5,Output ignores RAM contentWriteCmd(0xd3); //-set display offsetWriteCmd(0x00); //-not offsetWriteCmd(0xd5); //--set display clock divide ratio/oscillator frequencyWriteCmd(0xf0); //--set divide ratioWriteCmd(0xd9); //--set pre-charge periodWriteCmd(0x22); //WriteCmd(0xda); //--set com pins hardware configurationWriteCmd(0x12);WriteCmd(0xdb); //--set vcomhWriteCmd(0x20); //0x20,0.77xVccWriteCmd(0x8d); //--set DC-DC enableWriteCmd(0x14); //WriteCmd(0xaf); //--turn on oled panel }//設置起點坐標 void OLED_SetPos(unsigned char x, unsigned char y) {WriteCmd(0xb0 + y); //這些都是固定的 看上面的指令表WriteCmd((x & 0xf0) >> 4 | 0x10); //取高4位 指令表最后兩行WriteCmd((x & 0x0f ) | 0x01); //取低4位 }//全屏填充(一列一列地填充,每列8個像素) void OLED_Full(unsigned char Full_Data) {unsigned char n, m ;for( m = 0 ; m < 8 ; m++)//屏幕分成了8頁 每頁都要處理{WriteCmd(0xb0 + m);//0xb0 列的起點坐標 上面有WriteCmd(0x00);WriteCmd(0x10); for( n = 0 ; n < 128 ; n++)//128列 每列8個像素地寫{WriteData(Full_Data);}} }//清屏函數 讓屏幕什么都不顯示 void OLED_Clear(void) {OLED_Full(0x00); }//oled打開(電荷泵) void OLED_Open(void) {WriteCmd(0x8D); //設置電荷泵指令(指令表上有) WriteCmd(0x14); //開啟電荷泵WriteCmd(0xaf); //OLED喚醒 指令大小寫都可以 最好和指令表上一致 }//oled關閉(電荷泵) void OLED_Close(void) {WriteCmd(0x8D); //設置電荷泵指令(指令表上有) WriteCmd(0x10); //關閉電荷泵WriteCmd(0xAE); //oled關閉 }//OLED顯示字符串函數 坐標 要顯示的內容(數組放到RAM里) 格式有6*8 8*16(OLED_Codetab.h文件里) void OLED_ShowStr(unsigned char x, unsigned char y , unsigned char ch[] , unsigned TestSize) {unsigned char c = 0 , i = 0, j = 0;switch(TestSize){case 1://6*8{while(ch[j] != '\0')//字符串結束標記{c = ch[j] - 32;//大小寫的轉化if(x > 126)//X越界了 放到第一個位置 難道不應該是Y? Y代表頁 X代表列{x = 0 ; y ++;//回到第一行,下一列}OLED_SetPos(x , y);for( i = 0 ; i< 6 ; i++)//6列為一組顯示一個字符WriteData(F6X8[c][i]);//顯示到屏幕上x+= 6;//格式:6*8 跳轉到下一個字符 難道不應該是Y?j++; }}break;case 2://8*16{while(ch[j] != '\0'){c = ch[j] - 32;if( x > 120)//8*16 120越界 沒懂{x = 0;y++;//回到第一行,下一列}OLED_SetPos(x , y);for( i = 0 ; i < 8 ; i++)//把16分成兩個部分, 屏幕是分成了8頁 上下顯示(目前還不太懂)WriteData(F8X16[c*16 + i]);OLED_SetPos(x , y+1);for( i = 0 ; i < 8 ; i++)WriteData(F8X16[c*16+8+i]);x+=8;//轉到下一個字符j++;}}break;} }//顯示文字 字模軟件生成的 F16X16數組 漢字個數 void OLED_ShowCn(unsigned char x, unsigned char y , unsigned char N) {unsigned char wn = 0;unsigned int addr = 32*N;//一個字是由32個16進制表示的(.h文件兩行)OLED_SetPos(x , y);for( wn = 0 ; wn < 16 ; wn++)//一個字是由32個16進制表示的 分成兩個部分{WriteData(F16X16[addr]);addr+= 1;}OLED_SetPos(x , y+1);//y+1 在下一頁寫for( wn = 0 ; wn < 16 ; wn++){WriteData(F16X16[addr]);addr+= 1;} }//顯示圖像 圖片的起點坐標和結尾坐標(對角線) void OLED_ShowBMP(unsigned char x0 , unsigned char y0 , unsigned char x1 , unsigned char y1 , unsigned char BMP[]) {unsigned int j = 0;unsigned char x , y;if(y1 % 8 == 0){y = y1/8;}else{y = y1/8 +1;}for(y = y0 ; y< y1 ; y++)//y相當于頁數 一頁一頁的 每一頁有8行{OLED_SetPos(x0 ,y);for( x= x0 ; x < x1 ; x++){WriteData(BMP[j++]);}} }oled.h
#ifndef _OLED_H_ #define _OLED_H_//#ifndef #define #endif 條件編譯 執行下面的操作#include "stm32f10x.h" #define OLED_ADDRESS 0x78 //這個地址廠家設置好的? void I2C_Configuration(void); void I2C_WriteByte(uint8_t addr , uint8_t data); void WriteCmd(unsigned char I2C_Cmd); void WriteData(unsigned char I2C_Data); void OLED_Init(void); void OLED_SetPos(unsigned char x, unsigned char y); void OLED_Full(unsigned char Full_Data); void OLED_Clear(void); void OLED_Open(void); void OLED_Close(void); void OLED_ShowStr(unsigned char x, unsigned char y , unsigned char ch[] , unsigned TestSize); void OLED_ShowCn(unsigned char x, unsigned char y , unsigned char N);#endifOLED_Codetab.h
const unsigned char F6X8[][6] =//F6X8一列是8個像素點 F8X16一列是16個像素點,同樣的字符顯示的更大了。 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00,// sp0x00, 0x00, 0x00, 0x2f, 0x00, 0x00,// !0x00, 0x00, 0x07, 0x00, 0x07, 0x00,// "0x00, 0x14, 0x7f, 0x14, 0x7f, 0x14,// #0x00, 0x24, 0x2a, 0x7f, 0x2a, 0x12,// $0x00, 0x62, 0x64, 0x08, 0x13, 0x23,// %0x00, 0x36, 0x49, 0x55, 0x22, 0x50,// &0x00, 0x00, 0x05, 0x03, 0x00, 0x00,// '0x00, 0x00, 0x1c, 0x22, 0x41, 0x00,// (0x00, 0x00, 0x41, 0x22, 0x1c, 0x00,// )0x00, 0x14, 0x08, 0x3E, 0x08, 0x14,// *0x00, 0x08, 0x08, 0x3E, 0x08, 0x08,// +0x00, 0x00, 0x00, 0xA0, 0x60, 0x00,// ,0x00, 0x08, 0x08, 0x08, 0x08, 0x08,// -0x00, 0x00, 0x60, 0x60, 0x00, 0x00,// .0x00, 0x20, 0x10, 0x08, 0x04, 0x02,// /0x00, 0x3E, 0x51, 0x49, 0x45, 0x3E,// 00x00, 0x00, 0x42, 0x7F, 0x40, 0x00,// 10x00, 0x42, 0x61, 0x51, 0x49, 0x46,// 20x00, 0x21, 0x41, 0x45, 0x4B, 0x31,// 30x00, 0x18, 0x14, 0x12, 0x7F, 0x10,// 40x00, 0x27, 0x45, 0x45, 0x45, 0x39,// 50x00, 0x3C, 0x4A, 0x49, 0x49, 0x30,// 60x00, 0x01, 0x71, 0x09, 0x05, 0x03,// 70x00, 0x36, 0x49, 0x49, 0x49, 0x36,// 80x00, 0x06, 0x49, 0x49, 0x29, 0x1E,// 90x00, 0x00, 0x36, 0x36, 0x00, 0x00,// :0x00, 0x00, 0x56, 0x36, 0x00, 0x00,// ;0x00, 0x08, 0x14, 0x22, 0x41, 0x00,// <0x00, 0x14, 0x14, 0x14, 0x14, 0x14,// =0x00, 0x00, 0x41, 0x22, 0x14, 0x08,// >0x00, 0x02, 0x01, 0x51, 0x09, 0x06,// ?0x00, 0x32, 0x49, 0x59, 0x51, 0x3E,// @0x00, 0x7C, 0x12, 0x11, 0x12, 0x7C,// A0x00, 0x7F, 0x49, 0x49, 0x49, 0x36,// B0x00, 0x3E, 0x41, 0x41, 0x41, 0x22,// C0x00, 0x7F, 0x41, 0x41, 0x22, 0x1C,// D0x00, 0x7F, 0x49, 0x49, 0x49, 0x41,// E0x00, 0x7F, 0x09, 0x09, 0x09, 0x01,// F0x00, 0x3E, 0x41, 0x49, 0x49, 0x7A,// G0x00, 0x7F, 0x08, 0x08, 0x08, 0x7F,// H0x00, 0x00, 0x41, 0x7F, 0x41, 0x00,// I0x00, 0x20, 0x40, 0x41, 0x3F, 0x01,// J0x00, 0x7F, 0x08, 0x14, 0x22, 0x41,// K0x00, 0x7F, 0x40, 0x40, 0x40, 0x40,// L0x00, 0x7F, 0x02, 0x0C, 0x02, 0x7F,// M0x00, 0x7F, 0x04, 0x08, 0x10, 0x7F,// N0x00, 0x3E, 0x41, 0x41, 0x41, 0x3E,// O0x00, 0x7F, 0x09, 0x09, 0x09, 0x06,// P0x00, 0x3E, 0x41, 0x51, 0x21, 0x5E,// Q0x00, 0x7F, 0x09, 0x19, 0x29, 0x46,// R0x00, 0x46, 0x49, 0x49, 0x49, 0x31,// S0x00, 0x01, 0x01, 0x7F, 0x01, 0x01,// T0x00, 0x3F, 0x40, 0x40, 0x40, 0x3F,// U0x00, 0x1F, 0x20, 0x40, 0x20, 0x1F,// V0x00, 0x3F, 0x40, 0x38, 0x40, 0x3F,// W0x00, 0x63, 0x14, 0x08, 0x14, 0x63,// X0x00, 0x07, 0x08, 0x70, 0x08, 0x07,// Y0x00, 0x61, 0x51, 0x49, 0x45, 0x43,// Z0x00, 0x00, 0x7F, 0x41, 0x41, 0x00,// [0x00, 0x55, 0x2A, 0x55, 0x2A, 0x55,// 550x00, 0x00, 0x41, 0x41, 0x7F, 0x00,// ]0x00, 0x04, 0x02, 0x01, 0x02, 0x04,// ^0x00, 0x40, 0x40, 0x40, 0x40, 0x40,// _0x00, 0x00, 0x01, 0x02, 0x04, 0x00,// '0x00, 0x20, 0x54, 0x54, 0x54, 0x78,// a0x00, 0x7F, 0x48, 0x44, 0x44, 0x38,// b0x00, 0x38, 0x44, 0x44, 0x44, 0x20,// c0x00, 0x38, 0x44, 0x44, 0x48, 0x7F,// d0x00, 0x38, 0x54, 0x54, 0x54, 0x18,// e0x00, 0x08, 0x7E, 0x09, 0x01, 0x02,// f0x00, 0x18, 0xA4, 0xA4, 0xA4, 0x7C,// g0x00, 0x7F, 0x08, 0x04, 0x04, 0x78,// h0x00, 0x00, 0x44, 0x7D, 0x40, 0x00,// i0x00, 0x40, 0x80, 0x84, 0x7D, 0x00,// j0x00, 0x7F, 0x10, 0x28, 0x44, 0x00,// k0x00, 0x00, 0x41, 0x7F, 0x40, 0x00,// l0x00, 0x7C, 0x04, 0x18, 0x04, 0x78,// m0x00, 0x7C, 0x08, 0x04, 0x04, 0x78,// n0x00, 0x38, 0x44, 0x44, 0x44, 0x38,// o0x00, 0xFC, 0x24, 0x24, 0x24, 0x18,// p0x00, 0x18, 0x24, 0x24, 0x18, 0xFC,// q0x00, 0x7C, 0x08, 0x04, 0x04, 0x08,// r0x00, 0x48, 0x54, 0x54, 0x54, 0x20,// s0x00, 0x04, 0x3F, 0x44, 0x40, 0x20,// t0x00, 0x3C, 0x40, 0x40, 0x20, 0x7C,// u0x00, 0x1C, 0x20, 0x40, 0x20, 0x1C,// v0x00, 0x3C, 0x40, 0x30, 0x40, 0x3C,// w0x00, 0x44, 0x28, 0x10, 0x28, 0x44,// x0x00, 0x1C, 0xA0, 0xA0, 0xA0, 0x7C,// y0x00, 0x44, 0x64, 0x54, 0x4C, 0x44,// z0x14, 0x14, 0x14, 0x14, 0x14, 0x14,// horiz lines }; const unsigned char F8X16[]= {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,// 00x00,0x00,0x00,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x33,0x30,0x00,0x00,0x00,//! 10x00,0x10,0x0C,0x06,0x10,0x0C,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//" 20x40,0xC0,0x78,0x40,0xC0,0x78,0x40,0x00,0x04,0x3F,0x04,0x04,0x3F,0x04,0x04,0x00,//# 30x00,0x70,0x88,0xFC,0x08,0x30,0x00,0x00,0x00,0x18,0x20,0xFF,0x21,0x1E,0x00,0x00,//$ 40xF0,0x08,0xF0,0x00,0xE0,0x18,0x00,0x00,0x00,0x21,0x1C,0x03,0x1E,0x21,0x1E,0x00,//% 50x00,0xF0,0x08,0x88,0x70,0x00,0x00,0x00,0x1E,0x21,0x23,0x24,0x19,0x27,0x21,0x10,//& 60x10,0x16,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//' 70x00,0x00,0x00,0xE0,0x18,0x04,0x02,0x00,0x00,0x00,0x00,0x07,0x18,0x20,0x40,0x00,//( 80x00,0x02,0x04,0x18,0xE0,0x00,0x00,0x00,0x00,0x40,0x20,0x18,0x07,0x00,0x00,0x00,//) 90x40,0x40,0x80,0xF0,0x80,0x40,0x40,0x00,0x02,0x02,0x01,0x0F,0x01,0x02,0x02,0x00,//* 100x00,0x00,0x00,0xF0,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x1F,0x01,0x01,0x01,0x00,//+ 110x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xB0,0x70,0x00,0x00,0x00,0x00,0x00,//, 120x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x01,//- 130x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x00,0x00,//. 140x00,0x00,0x00,0x00,0x80,0x60,0x18,0x04,0x00,0x60,0x18,0x06,0x01,0x00,0x00,0x00,/// 150x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,//0 160x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//1 170x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,//2 180x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00,//3 190x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00,//4 200x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00,//5 210x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00,//6 220x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,//7 230x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00,//8 240x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00,//9 250x00,0x00,0x00,0xC0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,//: 260x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x60,0x00,0x00,0x00,0x00,//; 270x00,0x00,0x80,0x40,0x20,0x10,0x08,0x00,0x00,0x01,0x02,0x04,0x08,0x10,0x20,0x00,//< 280x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x00,//= 290x00,0x08,0x10,0x20,0x40,0x80,0x00,0x00,0x00,0x20,0x10,0x08,0x04,0x02,0x01,0x00,//> 300x00,0x70,0x48,0x08,0x08,0x08,0xF0,0x00,0x00,0x00,0x00,0x30,0x36,0x01,0x00,0x00,//? 310xC0,0x30,0xC8,0x28,0xE8,0x10,0xE0,0x00,0x07,0x18,0x27,0x24,0x23,0x14,0x0B,0x00,//@ 320x00,0x00,0xC0,0x38,0xE0,0x00,0x00,0x00,0x20,0x3C,0x23,0x02,0x02,0x27,0x38,0x20,//A 330x08,0xF8,0x88,0x88,0x88,0x70,0x00,0x00,0x20,0x3F,0x20,0x20,0x20,0x11,0x0E,0x00,//B 340xC0,0x30,0x08,0x08,0x08,0x08,0x38,0x00,0x07,0x18,0x20,0x20,0x20,0x10,0x08,0x00,//C 350x08,0xF8,0x08,0x08,0x08,0x10,0xE0,0x00,0x20,0x3F,0x20,0x20,0x20,0x10,0x0F,0x00,//D 360x08,0xF8,0x88,0x88,0xE8,0x08,0x10,0x00,0x20,0x3F,0x20,0x20,0x23,0x20,0x18,0x00,//E 370x08,0xF8,0x88,0x88,0xE8,0x08,0x10,0x00,0x20,0x3F,0x20,0x00,0x03,0x00,0x00,0x00,//F 380xC0,0x30,0x08,0x08,0x08,0x38,0x00,0x00,0x07,0x18,0x20,0x20,0x22,0x1E,0x02,0x00,//G 390x08,0xF8,0x08,0x00,0x00,0x08,0xF8,0x08,0x20,0x3F,0x21,0x01,0x01,0x21,0x3F,0x20,//H 400x00,0x08,0x08,0xF8,0x08,0x08,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//I 410x00,0x00,0x08,0x08,0xF8,0x08,0x08,0x00,0xC0,0x80,0x80,0x80,0x7F,0x00,0x00,0x00,//J 420x08,0xF8,0x88,0xC0,0x28,0x18,0x08,0x00,0x20,0x3F,0x20,0x01,0x26,0x38,0x20,0x00,//K 430x08,0xF8,0x08,0x00,0x00,0x00,0x00,0x00,0x20,0x3F,0x20,0x20,0x20,0x20,0x30,0x00,//L 440x08,0xF8,0xF8,0x00,0xF8,0xF8,0x08,0x00,0x20,0x3F,0x00,0x3F,0x00,0x3F,0x20,0x00,//M 450x08,0xF8,0x30,0xC0,0x00,0x08,0xF8,0x08,0x20,0x3F,0x20,0x00,0x07,0x18,0x3F,0x00,//N 460xE0,0x10,0x08,0x08,0x08,0x10,0xE0,0x00,0x0F,0x10,0x20,0x20,0x20,0x10,0x0F,0x00,//O 470x08,0xF8,0x08,0x08,0x08,0x08,0xF0,0x00,0x20,0x3F,0x21,0x01,0x01,0x01,0x00,0x00,//P 480xE0,0x10,0x08,0x08,0x08,0x10,0xE0,0x00,0x0F,0x18,0x24,0x24,0x38,0x50,0x4F,0x00,//Q 490x08,0xF8,0x88,0x88,0x88,0x88,0x70,0x00,0x20,0x3F,0x20,0x00,0x03,0x0C,0x30,0x20,//R 500x00,0x70,0x88,0x08,0x08,0x08,0x38,0x00,0x00,0x38,0x20,0x21,0x21,0x22,0x1C,0x00,//S 510x18,0x08,0x08,0xF8,0x08,0x08,0x18,0x00,0x00,0x00,0x20,0x3F,0x20,0x00,0x00,0x00,//T 520x08,0xF8,0x08,0x00,0x00,0x08,0xF8,0x08,0x00,0x1F,0x20,0x20,0x20,0x20,0x1F,0x00,//U 530x08,0x78,0x88,0x00,0x00,0xC8,0x38,0x08,0x00,0x00,0x07,0x38,0x0E,0x01,0x00,0x00,//V 540xF8,0x08,0x00,0xF8,0x00,0x08,0xF8,0x00,0x03,0x3C,0x07,0x00,0x07,0x3C,0x03,0x00,//W 550x08,0x18,0x68,0x80,0x80,0x68,0x18,0x08,0x20,0x30,0x2C,0x03,0x03,0x2C,0x30,0x20,//X 560x08,0x38,0xC8,0x00,0xC8,0x38,0x08,0x00,0x00,0x00,0x20,0x3F,0x20,0x00,0x00,0x00,//Y 570x10,0x08,0x08,0x08,0xC8,0x38,0x08,0x00,0x20,0x38,0x26,0x21,0x20,0x20,0x18,0x00,//Z 580x00,0x00,0x00,0xFE,0x02,0x02,0x02,0x00,0x00,0x00,0x00,0x7F,0x40,0x40,0x40,0x00,//[ 590x00,0x0C,0x30,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x06,0x38,0xC0,0x00,//\ 600x00,0x02,0x02,0x02,0xFE,0x00,0x00,0x00,0x00,0x40,0x40,0x40,0x7F,0x00,0x00,0x00,//] 610x00,0x00,0x04,0x02,0x02,0x02,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//^ 620x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,//_ 630x00,0x02,0x02,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//` 640x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x19,0x24,0x22,0x22,0x22,0x3F,0x20,//a 650x08,0xF8,0x00,0x80,0x80,0x00,0x00,0x00,0x00,0x3F,0x11,0x20,0x20,0x11,0x0E,0x00,//b 660x00,0x00,0x00,0x80,0x80,0x80,0x00,0x00,0x00,0x0E,0x11,0x20,0x20,0x20,0x11,0x00,//c 670x00,0x00,0x00,0x80,0x80,0x88,0xF8,0x00,0x00,0x0E,0x11,0x20,0x20,0x10,0x3F,0x20,//d 680x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x1F,0x22,0x22,0x22,0x22,0x13,0x00,//e 690x00,0x80,0x80,0xF0,0x88,0x88,0x88,0x18,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//f 700x00,0x00,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x6B,0x94,0x94,0x94,0x93,0x60,0x00,//g 710x08,0xF8,0x00,0x80,0x80,0x80,0x00,0x00,0x20,0x3F,0x21,0x00,0x00,0x20,0x3F,0x20,//h 720x00,0x80,0x98,0x98,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//i 730x00,0x00,0x00,0x80,0x98,0x98,0x00,0x00,0x00,0xC0,0x80,0x80,0x80,0x7F,0x00,0x00,//j 740x08,0xF8,0x00,0x00,0x80,0x80,0x80,0x00,0x20,0x3F,0x24,0x02,0x2D,0x30,0x20,0x00,//k 750x00,0x08,0x08,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//l 760x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x20,0x3F,0x20,0x00,0x3F,0x20,0x00,0x3F,//m 770x80,0x80,0x00,0x80,0x80,0x80,0x00,0x00,0x20,0x3F,0x21,0x00,0x00,0x20,0x3F,0x20,//n 780x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x00,0x1F,0x20,0x20,0x20,0x20,0x1F,0x00,//o 790x80,0x80,0x00,0x80,0x80,0x00,0x00,0x00,0x80,0xFF,0xA1,0x20,0x20,0x11,0x0E,0x00,//p 800x00,0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,0x0E,0x11,0x20,0x20,0xA0,0xFF,0x80,//q 810x80,0x80,0x80,0x00,0x80,0x80,0x80,0x00,0x20,0x20,0x3F,0x21,0x20,0x00,0x01,0x00,//r 820x00,0x00,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x33,0x24,0x24,0x24,0x24,0x19,0x00,//s 830x00,0x80,0x80,0xE0,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x1F,0x20,0x20,0x00,0x00,//t 840x80,0x80,0x00,0x00,0x00,0x80,0x80,0x00,0x00,0x1F,0x20,0x20,0x20,0x10,0x3F,0x20,//u 850x80,0x80,0x80,0x00,0x00,0x80,0x80,0x80,0x00,0x01,0x0E,0x30,0x08,0x06,0x01,0x00,//v 860x80,0x80,0x00,0x80,0x00,0x80,0x80,0x80,0x0F,0x30,0x0C,0x03,0x0C,0x30,0x0F,0x00,//w 870x00,0x80,0x80,0x00,0x80,0x80,0x80,0x00,0x00,0x20,0x31,0x2E,0x0E,0x31,0x20,0x00,//x 880x80,0x80,0x80,0x00,0x00,0x80,0x80,0x80,0x80,0x81,0x8E,0x70,0x18,0x06,0x01,0x00,//y 890x00,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x21,0x30,0x2C,0x22,0x21,0x30,0x00,//z 900x00,0x00,0x00,0x00,0x80,0x7C,0x02,0x02,0x00,0x00,0x00,0x00,0x00,0x3F,0x40,0x40,//{ 910x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,//| 920x00,0x02,0x02,0x7C,0x80,0x00,0x00,0x00,0x00,0x40,0x40,0x3F,0x00,0x00,0x00,0x00,//} 930x00,0x06,0x01,0x01,0x02,0x02,0x04,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//~ 94 };const unsigned char F16X16[] =//這是根據字模軟件生成的 取模軟件選擇16*16格式 {0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x20,0x40,0x80,0x00,0x00,0x08,0x04,0x03,0x00,0x00,0x40,0x80,0x7F,0x00,0x00,0x00,0x00,0x00,0x01,0x0E,0x00,/*小",0*/0x00,0x00,0xFE,0xAA,0xAA,0xA9,0xF9,0x00,0xA0,0x9E,0x82,0x82,0x9E,0xA0,0x20,0x00,0x40,0x30,0x0F,0x02,0x22,0x42,0x3E,0x80,0x80,0x43,0x2C,0x10,0x2C,0x43,0x80,0x00,/*殷",1*/0x00,0x00,0xFE,0x02,0x12,0x92,0x92,0x92,0x92,0x92,0x92,0x12,0x02,0xFE,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x1F,0x08,0x08,0x08,0x08,0x1F,0x40,0x80,0x7F,0x00,0x00,/*"同",2*/0x40,0x30,0x11,0x96,0x90,0x90,0x91,0x96,0x90,0x90,0x98,0x14,0x13,0x50,0x30,0x00,0x04,0x04,0x04,0x04,0x04,0x44,0x84,0x7E,0x06,0x05,0x04,0x04,0x04,0x04,0x04,0x00,/*"學",3*/};//還可以放置圖像字模main.c
#include "stm32f10x.h" #include "SysTick.h" #include "oled.h"//添加文件路徑extern const unsigned char BMP1[];//調用外部變量地聲明 包含頭文件了,不寫也是可以的int main(void) {unsigned char i = 0;initSysTick();//初始化系統時鐘I2C_Configuration();OLED_Init(); //屏幕初始化 廠家給的ms_delay(2000);//2sOLED_Full(0XFF);//全屏填充 (全屏亮)1111 1111ms_delay(2000);OLED_Full(0X00);//全屏填充 (全屏滅)0000 0000ms_delay(2000);//寫字符OLED_ShowStr(0,3," Hello world",1);//F6*8的格式OLED_ShowStr(0,4,"Hello world",2);//F8*16格式 同樣的字符 顯示更大了//寫漢字 while(1){ OLED_ShowCn(22+i*16, 0, i);//視頻里取模 ‘哞哞’二字// 覆蓋整個對角線 8頁 OLED_DrawBMP(0,0,128,8,(unsigned char*) BMP1);} }OLED顯示漢字和圖片(取模軟件的使用)
關于取模軟件使用說明:
取模主要有三種,圖片、字符、漢字三種,取的原理是一樣的
圖片取模打開 PCtoLCD2002.exe 軟件
總結
以上是生活随笔為你收集整理的STM32使用IIC总线通讯协议在OLED屏幕上显示字符串、汉字、图像(硬件IIC)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 电脑登录斗鱼显示无法连接服务器,斗鱼电脑
- 下一篇: MATLAB基础篇——线性代数应用