>[success] **技術支持說明**
> 1.**客服**提供簡單的技術支持,一般自主學習為主
> 2.可到官方問答社區中提問:[**去提問**](https://bbs.csdn.net/forums/nb-iot)
> 3.工程師**會盡快**解答社區問題,但他們是一線開發,【**難以保證**】解答時效,解答辛苦,感謝理解!
<br/>
本節課將講解使用SPI總線驅動OLED顯示屏來顯示字符。
<br/>
## **OLED 顯示技術簡介**
OLED(Organic Light-Emitting Diode)顯示技術具有自發光、廣視角、幾乎無窮高的對比度、較低耗電、反應速度快等優點。
###
開發套件中的0.96英寸OLED的實物圖如下圖所示,其分辨率是64×128像素,即縱向有64個像素點、橫向有128個像素點。

<br/>
## **SPI通信協議簡介**
SPI的全稱是Serial Peripheral Interface,是一種高速的、全雙工、同步的通信總線。配套的OLED顯示屏便是使用SPI通信協議。
<br/>
## **字庫與圖庫**
為了使OLED屏幕能夠正常地顯示各種字符,還需要先準備好一套字庫,例如標準ASCII字庫等。
<br/>
## **顯示器 HAL API設計**
顯示器的相關的API設計較為復雜,其架構如下:

###
相關的文件如下圖所示。

###
分別簡單介紹一下各個文件:
* hal\_spi.h和hal\_spi.c
**通用SPI驅動API**,適用于使用SPI通信的多種設備
###
* hal\_lcd\_spi.h和hal\_lcd\_spi.c
基于通用SPI驅動API(hal\_spi)適配出適用于顯示器的驅動API,此API還需要配置字庫文件font\_v\_8x16.h文件工作
###
* hal\_oled12864.h和hal\_oled12864.c
基于顯示器的驅動API封裝出方便開發者使用的API。一般地,**開發者只需要學習使用此API即可使用顯示器了**,因此下文將只講述此API。
<br/>
**編寫代碼**
打開本節課配套的工程,筆者把上述的.c文件以及必要的標準庫文件添加進工程了,如圖所示。

<br/>
打開hal_oled12864.h文件,我們可以看到兩個重要的函數,代碼如下:
```
/**
* 初始化顯示器
*/
void halOLED12864Init(void);
/**
* 清除屏幕中的顯示內容
*/
void halOLED12864ClearScreen(void);
/**
* @fn halOLED12864Show
*
* @brief 在屏幕上顯示字符串,支持的字符格式:8x16 ASCII字符
*
* @param line - 參數值范圍:0 ~ 3
* @param column - 參數值范圍:0 ~ 127
* @param str - 待顯示的字符串
*
*/
void halOLED12864ShowX16(unsigned char line, unsigned char column, const unsigned char *str);
```
###
**halOLED12864ShowX16 使用詳解**
配套的OLED顯示屏的分辨率為64x128像素,可以把其理解為64行和128列的二維表格。halOLED12864ShowX16函數支持顯示8x16的標準ASCII字符,其中的8x16是指占據8行的16列的字體。因此可以理解為halOLED12864ShowX16函數支持顯示4行ASCII字符,于是參數line的取值范圍便是0~3,但是參數column仍是使用像素點來表示在第幾個像素的位置開始顯示字符,因此其取值范圍為0~127。
<br/>
## **使用顯示器 HAL API**
編寫好顯示器 HAL API后,顯示器的使用非常簡單。在配套工程的main.c文件中添加如下代碼:
```
int main(void)
{
halSystemInit();//系統初始化
halOLED12864Init();//OLED顯示器初始化
/* Infinite loop */
while (1)
{
/* Test1 - Show 8x16 Char */
halOLED12864ShowX16(0, 0, (uint8_t *)"0123456789");
halOLED12864ShowX16(1, 0, (uint8_t *)"abcdefghiABCDE");
halOLED12864ShowX16(2, 0, (uint8_t *)"{}[]()!@#$%");
halOLED12864ShowX16(3, 0, (uint8_t *)"==========>");
halSystemDelayUs(2000000);//延時2秒
/* Test2 - Clear screen */
halOLED12864ClearScreen();//清空屏幕內容
halSystemDelayUs(1000000);//延時1秒
}
}
```
<br/>
## **測試**
* 打開本課程配套的源代碼,編譯鏈接生成Hex文件
###
* 把OLED顯示器按如圖所示插入到開發板中

>[danger] 注意,開發板與顯示器是右邊對齊。
###
* 把Hex文件燒錄到開發板中
###
* 在通電的條件下,按下復位按鍵RESET,復位STM32開發板
###
* 可以看到如圖所示效果:

<br/>
<br/>
## **商務合作**
如有以下需求,可掃碼添加管理員好友,注明“**商務合作**”
* 項目定制開發,技術范圍:**NB-IoT**、**CATn(4G)**、**WiFi**、**ZigBee**、**BLE Mesh**以及**STM32**、**嵌入式Linux**等;
* 入駐平臺,成為講師;
* 接項目賺外快;
* 善學坊官網:[www.sxf-iot.com](https://www.sxf-iot.com/)

(非商務合作**勿擾**,此處**非**技術支持)
- 課程介紹
- 配套資源下載
- 配套開發套件簡介
- 簡介
- 硬件組成 & 技術參數
- 電路原理圖 & PCB圖
- 撥碼開關使用說明
- 第一部分:無線通信 開發指南
- 1.1.1 NB-IoT:技術簡介
- 1.1.2 NB:CH34x USB轉串口驅動安裝
- 1.1.3 NB:AT 指令開發與測試
- 1.1.4 NB:基礎指令集簡介
- 1.1.5 NB:云端服務器
- 1.1.5.1 PuTTY 簡介與安裝
- 1.1.5.2 登錄云端服務器
- 1.1.6 NB:移遠官方工具簡介
- 1.1.7 NB:使用UDP協議與云端服務器通信
- 1.1.8 NB:使用TCP協議與云端服務器通信
- 1.1.9 NB:使用MQTT協議與云端服務器通信
- 進階課程
- 第二部分:STM32 開發指南
- 2.1 搭建開發環境
- 2.1.1 Keil MDK 簡介與安裝
- 2.1.2 STM32 Pack 簡介與安裝
- 2.1.3 CH34x 驅動簡介與安裝
- 2.1.4 其他開發工具
- 2.2 STM32 開發基礎
- 2.2.1 新建工程
- 2.2.2 實現第1個程序
- 2.2.3 Hex 文件燒錄詳解
- 2.3 移植官方標準工程模板
- 2.4 GPIO實驗——LED燈
- 2.5 系統延時應用
- 2.6 GPIO實驗——按鍵
- 2.7 GPIO中斷實驗——按鍵觸發
- 2.8 使用定時器TIM3
- 2.9 串口通信實驗
- 2.10 ADC 實驗
- 2.11 OLED顯示器實驗
- 2.12 SDK 設計思想
- 2.13 SDK 架構解析
- 2.14 多任務應用
- 2.15 輸入型任務:按鍵輸入
- 2.16 輸入型任務:串口接收
- 課外篇:項目實戰
- 基于STM32+NB-IoT的溫濕度采集
- 系統簡介
- 系統搭建
- 系統詳解
- 1.代碼編譯與架構說明
- 2.DHT11溫濕度傳感器
- 3. 數據通信任務說明
- 版權聲明與免責聲明