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