OLED屏显和汉字点阵编码
目錄
一、SPI協(xié)議
(1)SPI協(xié)議簡介
(2)SPI物理層
(3)協(xié)議層
(4)SPI 基本通訊過程
(5)CPOL/CPHA 及通訊模式
(6)通訊引腳
(7)SPI優(yōu)缺點
?二、OLED
(1)OLED簡介
(2)點陣編碼原理與顯示
(3)OLED 顯示漢字
1、添加字模
2、修改顯示函數(shù)
3、修改主函數(shù)
4、燒錄
(4)OLED滑動顯示字符
(5)oled顯示溫濕度
三、總結(jié)
四、參考
一、SPI協(xié)議
(1)SPI協(xié)議簡介
SPI 協(xié)議是由摩托羅拉公司提出的通訊協(xié)議 (Serial Peripheral Interface),即串行外圍設(shè)備接口,是 一種高速全雙工的通信總線。它被廣泛地使用在 ADC、LCD 等設(shè)備與 MCU 間,要求通訊速率 較高的場合。
(2)SPI物理層
SPI 通訊設(shè)備之間的常用連接方式如下
?SPI 通訊使用 3 條總線及片選線,3 條總線分別為 SCK、MOSI、MISO,片選線為 SS ,它們的作 用介紹如下:
①?SS*(* Slave Select):從設(shè)備選擇信號線,常稱為片選信號線,也稱為 NSS、CS,以下用 NSS 表示。當(dāng)有多個 SPI 從設(shè)備與 SPI 主機相連時,設(shè)備的其它信號線 SCK、MOSI 及 MISO 同時并聯(lián)到相同的 SPI 總線上,即無論有多少個從設(shè)備,都共同只使用這 3 條總線;而每個從設(shè)備都有獨立的這一條 NSS 信號線,本信號線獨占主機的一個引腳,即有多少個從設(shè) 備,就有多少條片選信號線。I2C 協(xié)議中通過設(shè)備地址來尋址、選中總線上的某個設(shè)備并與其進行通訊;而 SPI 協(xié)議中沒有設(shè)備地址,它使用 NSS 信號線來尋址,當(dāng)主機要選擇從設(shè) 備時,把該從設(shè)備的 NSS 信號線設(shè)置為低電平,該從設(shè)備即被選中,即片選有效,接著主機開始與被選中的從設(shè)備進行 SPI 通訊。所以 SPI 通訊以 NSS 線置低電平為開始信號,以 NSS 線被拉高作為結(jié)束信號。
② SCK (Serial Clock):時鐘信號線,用于通訊數(shù)據(jù)同步。它由通訊主機產(chǎn)生,決定了通訊的速 率,不同的設(shè)備支持的最高時鐘頻率不一樣,如 STM32 的 SPI 時鐘頻率最大為 fpclk/2,兩個設(shè)備之間通訊時,通訊速率受限于低速設(shè)備。
③ MOSI (Master Output,Slave Input):主設(shè)備輸出/從設(shè)備輸入引腳。主機的數(shù)據(jù)從這條信號線 輸出,從機由這條信號線讀入主機發(fā)送的數(shù)據(jù),即這條線上數(shù)據(jù)的方向為主機到從機。
④?MISO(Master Input,,Slave Output):主設(shè)備輸入/從設(shè)備輸出引腳。主機從這條信線讀入數(shù)據(jù), 從機的數(shù)據(jù)由這條信號線輸出到主機,即在這條線上數(shù)據(jù)的方向為從機到主機。
(3)協(xié)議層
與 I2C 的類似,SPI 協(xié)議定義了通訊的起始和停止信號、數(shù)據(jù)有效性、時鐘同步等環(huán)節(jié)。
(4)SPI 基本通訊過程
SPI通訊的通訊時序如下
?這是一個主機的通訊時序。NSS、SCK、MOSI 信號都由主機控制產(chǎn)生,而 MISO 的信號由從機 產(chǎn)生,主機通過該信號線讀取從機的數(shù)據(jù)。MOSI 與 MISO 的信號只在 NSS 為低電平的時候才有 效,在 SCK 的每個時鐘周期 MOSI 和 MISO 傳輸一位數(shù)據(jù)。?
(5)CPOL/CPHA 及通訊模式
上面講述的圖 24?2 中的時序只是 SPI 中的其中一種通訊模式,SPI 一共有四種通訊模式,它們的 主要區(qū)別是總線空閑時 SCK 的時鐘狀態(tài)以及數(shù)據(jù)采樣時刻。為方便說明,在此引入“時鐘極性 CPOL”和“時鐘相位 CPHA”的概念。 時鐘極性 CPOL 是指 SPI 通訊設(shè)備處于空閑狀態(tài)時,SCK 信號線的電平信號 (即 SPI 通訊開始前、 NSS 線為高電平時 SCK 的狀態(tài))。CPOL=0 時,SCK 在空閑狀態(tài)時為低電平,CPOL=1 時,則相反。 時鐘相位 CPHA 是指數(shù)據(jù)的采樣的時刻,當(dāng) CPHA=0 時,MOSI 或 MISO 數(shù)據(jù)線上的信號將會在 SCK 時鐘線的“奇數(shù)邊沿”被采樣。當(dāng) CPHA=1 時,數(shù)據(jù)線在 SCK 的“偶數(shù)邊沿”采樣。如下圖
?我們來分析這個 CPHA=0 的時序圖。首先,根據(jù) SCK 在空閑狀態(tài)時的電平,分為兩種情況。SCK 信號線在空閑狀態(tài)為低電平時,CPOL=0;空閑狀態(tài)為高電平時,CPOL=1。 無論 CPOL=0 還是 =1,因為我們配置的時鐘相位 CPHA=0,在圖中可以看到,采樣時刻都是在 SCK 的奇數(shù)邊沿。注意當(dāng) CPOL=0 的時候,時鐘的奇數(shù)邊沿是上升沿,而 CPOL=1 的時候,時鐘的奇數(shù)邊沿是下降沿。所以 SPI 的采樣時刻不是由上升/下降沿決定的。MOSI 和 MISO 數(shù)據(jù)線的有效信號在 SCK 的奇數(shù)邊沿保持不變,數(shù)據(jù)信號將在 SCK 奇數(shù)邊沿時被采樣,在非采樣時刻, MOSI 和 MISO 的有效信號才發(fā)生切換。 類似地,當(dāng) CPHA=1 時,不受 CPOL 的影響,數(shù)據(jù)信號在 SCK 的偶數(shù)邊沿被采樣,如下圖
?由 CPOL 及 CPHA 的不同狀態(tài),SPI 分成了四種模式,見表 24?1,主機與從機需要工作在相同的 模式下才可以正常通訊,實際中采用較多的是“模式 0”與“模式 3”。如下圖
(6)通訊引腳
?SPI 的所有硬件架構(gòu)都是從 MOSI、MISO、SCK 及 NSS 線展開的。STM32 芯片有多個 SPI 外設(shè),它們的 SPI 通訊信號引出到不同的 GPIO 引腳上,使用時必須配置到這些指定的引腳,如下圖。關(guān)于 GPIO 引腳的復(fù)用功能,可查閱《STM32F4xx規(guī)格書》,以它為準(zhǔn)。
?注:其中 PF、PH 端口在 176 引腳型號的芯片才有。 其中 SPI1、SPI4、SPI5、SPI6 是 APB2 上的設(shè)備,最高通信速率達 42Mbtis/s,SPI2、SPI3 是 APB1 上的設(shè)備,最高通信速率為 21Mbits/s。其它功能上沒有差異。
(7)SPI優(yōu)缺點
優(yōu)點
支持全雙工通信
通信簡單
數(shù)據(jù)傳輸速率塊
缺點
沒有指定的流控制,沒有應(yīng)答機制確認是否接收到數(shù)據(jù),所以跟IIC總線協(xié)議比較在數(shù)據(jù)
可靠性上有一定的缺陷。?
?二、OLED
(1)OLED簡介
OLED(Organic Light-Emitting Diode),又稱為有機電激光顯示、有機發(fā)光半導(dǎo)體(Organic Electroluminescence Display,OLED)。OLED屬于一種電流型的有機發(fā)光器件,是通過載流子的注入和復(fù)合而致發(fā)光的現(xiàn)象,發(fā)光強度與注入的電流成正比。OLED在電場的作用下,陽極產(chǎn)生的空穴和陰極產(chǎn)生的電子就會發(fā)生移動,分別向空穴傳輸層和電子傳輸層注入,遷移到發(fā)光層。當(dāng)二者在發(fā)光層相遇時,產(chǎn)生能量激子,從而激發(fā)發(fā)光分子最終產(chǎn)生可見光。
0.96寸七針OLED屏
?(2)點陣編碼原理與顯示
漢字點陣編碼
在漢字的點陣字庫中,每個字節(jié)的每個位都代表一個漢字的一個點,每個漢字都是由一個矩形的點陣組成,0 代表沒有點,1 代表有點,將 0 和 1 分別用不同顏色畫出,就形成了一個漢字,常用的點陣矩陣有 1212, 1414, 16*16 三 種字庫。
字庫根據(jù)字節(jié)所表示點的不同有分為橫向矩陣和縱向矩陣,目前多數(shù)的字庫都是橫向矩陣的存儲方式(用得最多的應(yīng)該是早期 UCDOS 字庫),縱向矩陣一 般是因為有某些液晶是采用縱向掃描顯示法,為了提高顯示速度,于是便把字庫 矩陣做成縱向,省得在顯示時還要做矩陣轉(zhuǎn)換。
OLED點陣顯示
點陣屏像素按128列X64行組織,每一行128個像素單元的陰極是連接在一起,作為公共極(COM),每一列64個像素單元的陽極也連接在一起,作為一段(SEG)。行列交叉點上的LED就是一個顯示單元,即一個像素。要點亮一個像素,只要在該像素所在列電極上加上正電壓、行電極接地。同樣,要驅(qū)動一整行圖像,就需要同時把128列信號加載到列電極上,把該行行電極接地。該行顯示時,其他63行均不能顯示,其行電極應(yīng)為高電平或懸空。
可見,整屏的顯示,只能分時掃描進行,一行一行的顯示,每次顯示一行。行驅(qū)依次產(chǎn)生低電平掃描各行,列驅(qū)動讀取顯示數(shù)據(jù)依次加載到列電極上。掃描一行的時間稱為行周期,完成一次全屏掃描,就叫做一幀。一般幀頻大于60,人眼觀察不到逐行顯示。每行掃描顯示用時叫占空比,占空比小,為達到相同的顯示亮度,驅(qū)動電流就大。SSD1306段驅(qū)動最大電流為100uA,當(dāng)整行128個像素全部點亮?xí)r,行電極就要流過12.8mA的電流。
(3)OLED 顯示漢字
為了在 OLED 上顯示想要的漢字,需要對漢字進行點陣編碼得到漢字的字模,然后存入代碼中。
使用PCtoLCD生成字模
下載0.96寸OLED屏Demo程序,然后選擇STM32F103RCT6,在模板上進行修改,下載鏈接如下
http://www.lcdwiki.com/res/Program/OLED/0.96inch/SPI_SSD1306_MSP096X_V1.0/0.96inch_SPI_OLED_Module_SSD1306_MSP096X_V1.0.zip
1、添加字模
打開上面下載的工程文件“0.96inch_OLED_Demo_STM32F103RCT6_Software_4-wire_SPI\PROJECT\OLED.uvprojx”,打開 gui.c 下的 oledfont.h 頭文件,將 cfont16[] 數(shù)組內(nèi)的內(nèi)容修改成自己的中文文字點陣即可。
2、修改顯示函數(shù)
將?test.c?里?void TEST_MainPage(void)?函數(shù)中的語句修改為自己的執(zhí)行語句,如下:
函數(shù)說明:
① GUI_ShowString() 函數(shù)各參數(shù)分別對應(yīng):
X 坐標(biāo)、Y 坐標(biāo)、字符串(ASCLL碼中的)、bit (表示字符顯示格式,這里我用的 16 ,和漢字一樣高)、顯示樣式(1:白字黑底;0:黑字白底)。
② GUI_ShowChinese() 函數(shù)各參數(shù)分別對應(yīng):
X 坐標(biāo)、Y 坐標(biāo)、漢字點陣大小(這里使用的是 16×16 的,參數(shù)應(yīng)該是 16)、要顯示的漢字、顯示樣式(1:白字黑底;0:黑字白底)。
3、修改主函數(shù)
將?main.c?代碼中的?while?函數(shù)里除?TEST_MainPage();?語句以外的語句刪除,如下:
??
4、燒錄
編譯后,將hex文件燒錄進stm32中,效果如下
?完成
(4)OLED滑動顯示字符
添加字模方式跟上面一樣,如下
修改代碼時,在?test.c?里?void TEST_MainPage(void)?函數(shù)中不用的語句刪掉,添加自己的想要顯示的字符
?將main.c中的main函數(shù)改為下列所示
int main(void) { delay_init(); //延時函數(shù)初始化 NVIC_Configuration(); //設(shè)置NVIC中斷分組2:2位搶占優(yōu)先級,2位響應(yīng)優(yōu)先級 OLED_Init(); //初始化OLED OLED_Clear(0); //清屏(全黑)//從左到右滑動( OLED 屏的滾屏命令)OLED_WR_Byte(0x2E,OLED_CMD); //關(guān)閉滾動OLED_WR_Byte(0x27,OLED_CMD); //水平向左或者右滾動 26/27OLED_WR_Byte(0x00,OLED_CMD); //虛擬字節(jié)OLED_WR_Byte(0x00,OLED_CMD); //起始頁 0OLED_WR_Byte(0x07,OLED_CMD); //滾動時間間隔OLED_WR_Byte(0x07,OLED_CMD); //終止頁 7OLED_WR_Byte(0x00,OLED_CMD); //虛擬字節(jié)OLED_WR_Byte(0xFF,OLED_CMD); //虛擬字節(jié)TEST_MainPage();OLED_WR_Byte(0x2F,OLED_CMD); //開啟滾動 }編譯燒錄,成功
(5)oled顯示溫濕度
移植 AHT20 溫濕度采集代碼
查看上篇博客里的使用的工程文件,從里面移植下面 4 個文件:
bsp_i2c.h、bsp_i2c.c、
sys.h(移植后更改了名稱為 AHT20_sys.h,不然會重名)、
sys.c(移植后更改了名稱為 AHT20_sys.c,不然會重名);
并將bsp_i2c.c文件中的串口發(fā)送改為 OLED 顯示 void Show_OLED(void) 即可。
?修改主函數(shù)
將?main.c?代碼中不用的函數(shù)注釋掉,再修改代碼,之后的結(jié)果如下:
?要注意添加頭文件,調(diào)用溫濕度讀取并顯示函數(shù)。
編譯燒錄,成功
三、總結(jié)
學(xué)習(xí)了SPI協(xié)議,并且通過SPI協(xié)議對漢字和溫濕度進行了顯示,中途遇到了部分問題,例如漢字可能不顯示的問題,也沒有找到什么解決辦法,如果有知道問題所在的大佬可以教教我
四、參考
?(9條消息) 基于 SPI 協(xié)議用 0.96 寸 OLED 顯示漢字及溫濕度數(shù)據(jù)_L-GRAZY的博客-CSDN博客
(9條消息) 基于SPI通信方式的OLED顯示_不#曾&輕聽的博客-CSDN博客_oled spi通訊
(9條消息) 基于STM32的0.96寸OLED顯示屏顯示數(shù)據(jù)_Harriet的博客-CSDN博客_基于stm32的oled顯示時間
總結(jié)
以上是生活随笔為你收集整理的OLED屏显和汉字点阵编码的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 实验七 MapReduce编程进阶
- 下一篇: 东师计算机应用基础20在线作业3,东师计