STM32 HAL庫 OLED驅動實現

一、概述

1.1 OLED 顯示屏簡介

OLED(Organic Light - Emitting Diode)即有機發光二極管,與傳統的 LCD 顯示屏相比,OLED 具有自發光、視角廣、響應速度快、對比度高、功耗低等優點。在嵌入式系統中,OLED 顯示屏常被用于顯示系統狀態信息、圖形界面等。

1.2 STM32F407 與 HAL 庫

STM32F407 是意法半導體(ST)推出的一款高性能 32 位微控制器,基于 ARM Cortex - M4 內核,具有豐富的外設資源和強大的處理能力。HAL(Hardware Abstraction Layer)庫是 ST 為 STM32 系列微控制器提供的硬件抽象層,它簡化了開發流程,提高了代碼的可移植性。

1.3 通信接口

OLED 顯示屏通常支持多種通信接口,本文主要介紹 8080 并行接口和 IIC(Inter - Integrated Circuit)串行接口的驅動實現。8080 接口通信速度快,適合顯示大數據量的圖像;IIC 接口則具有引腳少、布線簡單的優點,適用于對引腳資源要求較高的場景。

二、硬件連接

2.1 8080 接口連接

當使用 8080 接口連接 OLED 顯示屏和 STM32F407 時,一般需要以下引腳:

引腳功能STM32F407 引腳
數據總線(D0 - D7)任意 8 個 GPIO 引腳
命令 / 數據選擇(DC)一個 GPIO 引腳
寫信號(WR)一個 GPIO 引腳
片選信號(CS)一個 GPIO 引腳
復位信號(RST)一個 GPIO 引腳

2.2 IIC 接口連接

使用 IIC 接口連接時,需要連接兩根線:

引腳功能STM32F407 引腳
SDA(數據線)I2C 的 SDA 引腳
SCL(時鐘線)I2C 的 SCL 引腳

同時,還需要一個復位引腳(RST)用于復位 OLED 顯示屏。

三、HAL 庫配置

3.1 開發環境搭建

使用 STM32CubeMX 進行硬件配置和代碼生成,然后在 Keil MDK 或者 STM32CubeIDE 中進行代碼開發和調試。

3.2 8080 接口配置

在 STM32CubeMX 中,將用于連接 OLED 的 GPIO 引腳配置為輸出模式。對于數據總線引腳,設置為推挽輸出;對于控制信號引腳(DC、WR、CS、RST),同樣設置為推挽輸出。

3.3 IIC 接口配置

在 STM32CubeMX 中,選擇相應的 I2C 外設(如 I2C1),配置為標準模式,時鐘頻率設置為合適的值(如 100kHz)。同時,將連接 SDA 和 SCL 的 GPIO 引腳配置為 I2C 功能。

四、8080 接口驅動實現(可參考光子物聯的OLED驅動)

零基礎國產GD32單片機編程入門(五)OLED顯示及實戰含源碼_gd32 oled-CSDN博客

4.1 初始化函數

//初始化SSD1306					    
void OLED_Init(void)
{ 	GPIO_InitTypeDef GPIO_InitStruct = {0};__HAL_RCC_GPIOA_CLK_ENABLE();__HAL_RCC_GPIOC_CLK_ENABLE();__HAL_RCC_GPIOD_CLK_ENABLE();GPIO_InitStruct.Pin = GPIO_PIN_8;//配置管腳為輸出GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);GPIO_InitStruct.Pin = GPIO_PIN_8|GPIO_PIN_9;//配置管腳為輸出GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);GPIO_InitStruct.Pin = GPIO_PIN_10|GPIO_PIN_14;//配置管腳為輸出GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, GPIO_PIN_SET);HAL_GPIO_WritePin(GPIOC, GPIO_PIN_8|GPIO_PIN_9, GPIO_PIN_SET);HAL_GPIO_WritePin(GPIOD, GPIO_PIN_10|GPIO_PIN_14, GPIO_PIN_SET);HAL_Delay(100);OLED_WR_Byte(0xAE,OLED_CMD);//--turn off oled panelOLED_WR_Byte(0x00,OLED_CMD);//---set low column addressOLED_WR_Byte(0x10,OLED_CMD);//---set high column addressOLED_WR_Byte(0x40,OLED_CMD);//--set start line address  Set Mapping RAM Display Start Line (0x00~0x3F)OLED_WR_Byte(0x81,OLED_CMD);//--set contrast control registerOLED_WR_Byte(0xCF,OLED_CMD); // Set SEG Output Current BrightnessOLED_WR_Byte(0xA1,OLED_CMD);//--Set SEG/Column Mapping     0xa0左右反置 0xa1正常OLED_WR_Byte(0xC8,OLED_CMD);//Set COM/Row Scan Direction   0xc0上下反置 0xc8正常OLED_WR_Byte(0xA6,OLED_CMD);//--set normal displayOLED_WR_Byte(0xA8,OLED_CMD);//--set multiplex ratio(1 to 64)OLED_WR_Byte(0x3f,OLED_CMD);//--1/64 dutyOLED_WR_Byte(0xD3,OLED_CMD);//-set display offset	Shift Mapping RAM Counter (0x00~0x3F)OLED_WR_Byte(0x00,OLED_CMD);//-not offsetOLED_WR_Byte(0xd5,OLED_CMD);//--set display clock divide ratio/oscillator frequencyOLED_WR_Byte(0xF0,OLED_CMD);//--set divide ratio, Set Clock as 100 Frames/SecOLED_WR_Byte(0xD9,OLED_CMD);//--set pre-charge periodOLED_WR_Byte(0xF1,OLED_CMD);//Set Pre-Charge as 15 Clocks & Discharge as 1 ClockOLED_WR_Byte(0xDA,OLED_CMD);//--set com pins hardware configurationOLED_WR_Byte(0x12,OLED_CMD);OLED_WR_Byte(0xDB,OLED_CMD);//--set vcomhOLED_WR_Byte(0x40,OLED_CMD);//Set VCOM Deselect LevelOLED_WR_Byte(0x20,OLED_CMD);//-Set Page Addressing Mode (0x00/0x01/0x02)OLED_WR_Byte(0x02,OLED_CMD);//OLED_WR_Byte(0x8D,OLED_CMD);//--set Charge Pump enable/disableOLED_WR_Byte(0x14,OLED_CMD);//--set(0x10) disableOLED_WR_Byte(0xA4,OLED_CMD);// Disable Entire Display On (0xa4/0xa5)OLED_WR_Byte(0xA6,OLED_CMD);// Disable Inverse Display On (0xa6/a7) OLED_WR_Byte(0xAF,OLED_CMD);//--turn on oled panelOLED_WR_Byte(0xAF,OLED_CMD); /*display ON*/ OLED_Clear();OLED_Set_Pos(0,0); 	
}  

4.2 寫命令和寫數據函數

//向SSD1106寫入一個字節。
//dat:要寫入的數據/命令
//cmd:數據/命令標志 0,表示命令;1,表示數據;
void OLED_WR_Byte(u8 dat,u8 cmd)
{	u8 i;			  if(cmd)OLED_DC_Set();else OLED_DC_Clr();		  OLED_CS_Clr();for(i=0;i<8;i++){			  OLED_SCLK_Clr();if(dat&0x80)OLED_SDIN_Set();else OLED_SDIN_Clr();OLED_SCLK_Set();dat<<=1;   }				 		  OLED_CS_Set();OLED_DC_Set();   	  
} 

4.3 各種顯示驅動函數?

//在指定位置顯示一個字符,包括部分字符
//x:0~127
//y:0~63
//mode:0,反白顯示;1,正常顯示				 
//size:選擇字體 16/12 
void OLED_ShowChar(u8 x,u8 y,u8 chr)
{      	unsigned char c=0,i=0;	c=chr-' ';//得到偏移后的值			if(x>Max_Column-1){x=0;y=y+2;}if(SIZE ==16){OLED_Set_Pos(x,y);	for(i=0;i<8;i++)OLED_WR_Byte(F8X16[c*16+i],OLED_DATA);OLED_Set_Pos(x,y+1);for(i=0;i<8;i++)OLED_WR_Byte(F8X16[c*16+i+8],OLED_DATA);}else {	OLED_Set_Pos(x,y+1);for(i=0;i<6;i++)OLED_WR_Byte(F6x8[c][i],OLED_DATA);}
}
//m^n函數
u32 oled_pow(u8 m,u8 n)
{u32 result=1;	 while(n--)result*=m;    return result;
}				  
//顯示2個數字
//x,y :起點坐標	 
//len :數字的位數
//size:字體大小
//mode:模式	0,填充模式;1,疊加模式
//num:數值(0~4294967295);	 		  
void OLED_ShowNum(u8 x,u8 y,u32 num,u8 len,u8 size)
{         	u8 t,temp;u8 enshow=0;						   for(t=0;t<len;t++){temp=(num/oled_pow(10,len-t-1))%10;if(enshow==0&&t<(len-1)){if(temp==0){OLED_ShowChar(x+(size/2)*t,y,' ');continue;}else enshow=1; }OLED_ShowChar(x+(size/2)*t,y,temp+'0'); }
} 
//顯示一個字符號串
void OLED_ShowString(u8 x,u8 y,u8 *chr)
{unsigned char j=0;while (chr[j]!='\0'){		OLED_ShowChar(x,y,chr[j]);x+=8;if(x>120){x=0;y+=2;}j++;}
}
//顯示漢字
void OLED_ShowCHinese(u8 x,u8 y,u8 no)
{      			    u8 t,adder=0;OLED_Set_Pos(x,y);	for(t=0;t<16;t++){OLED_WR_Byte(Hzk[2*no][t],OLED_DATA);adder+=1;}	OLED_Set_Pos(x,y+1);	for(t=0;t<16;t++){	OLED_WR_Byte(Hzk[2*no+1][t],OLED_DATA);adder+=1;}					
}

取模軟件下載地址:字模軟件(ATK-XFONT) 版本:v2.0.3 — 正點原子資料下載中心 1.0.0 文檔

五、IIC 接口驅動實現

5.1 IIC 通信基礎

IIC 是一種串行通信協議,使用兩根線(SDA 和 SCL)進行數據傳輸。在 STM32F407 中,可以使用 HAL 庫提供的 I2C 函數進行通信。

5.2 初始化函數

#include "stm32f4xx_hal.h"// 定義I2C句柄
extern I2C_HandleTypeDef hi2c1;// OLED I2C地址
#define OLED_I2C_ADDR 0x78// 初始化OLED
void OLED_Init_I2C(void)
{// 復位OLEDHAL_GPIO_WritePin(OLED_RST_PORT, OLED_RST_PIN, GPIO_PIN_RESET);HAL_Delay(100);HAL_GPIO_WritePin(OLED_RST_PORT, OLED_RST_PIN, GPIO_PIN_SET);HAL_Delay(100);// 發送初始化命令OLED_WriteCmd_I2C(0xAE); // 關閉顯示OLED_WriteCmd_I2C(0xD5); // 設置時鐘分頻因子OLED_WriteCmd_I2C(0x80);// 其他初始化命令...OLED_WriteCmd_I2C(0xAF); // 開啟顯示
}

5.3 寫命令和寫數據函數

// 寫命令(I2C)
void OLED_WriteCmd_I2C(uint8_t cmd)
{uint8_t data[2] = {0x00, cmd}; // 0x00表示寫命令HAL_I2C_Master_Transmit(&hi2c1, OLED_I2C_ADDR, data, 2, 100);
}// 寫數據(I2C)
void OLED_WriteData_I2C(uint8_t data)
{uint8_t data_to_send[2] = {0x40, data}; // 0x40表示寫數據HAL_I2C_Master_Transmit(&hi2c1, OLED_I2C_ADDR, data_to_send, 2, 100);
}

?代碼解釋

8080 接口代碼
  • OLED_Init?函數:對 OLED 進行復位操作,并發送一系列初始化命令來開啟顯示。
  • OLED_WriteCmd?函數:用于向 OLED 發送命令,通過控制 DC 引腳為低電平來指示寫入的是命令。
  • OLED_WriteData?函數:用于向 OLED 發送數據,通過控制 DC 引腳為高電平來指示寫入的是數據。
  • OLED_ShowChar?函數:在指定位置顯示字符,通過調用?OLED_WriteData?函數將字符的點陣數據寫入 OLED。
IIC 接口代碼
  • OLED_Init_I2C?函數:同樣對 OLED 進行復位操作,并通過 I2C 接口發送初始化命令。
  • OLED_WriteCmd_I2C?函數:使用 HAL 庫的?HAL_I2C_Master_Transmit?函數向 OLED 發送命令。
  • OLED_WriteData_I2C?函數:使用?HAL_I2C_Master_Transmit?函數向 OLED 發送數據。
  • OLED_ShowChar_I2C?函數:在指定位置顯示字符,通過調用?OLED_WriteData_I2C?函數將字符的點陣數據寫入 OLED。

六、代碼優化與調試

6.1 代碼優化

  • 減少重復代碼:將一些通用的操作封裝成函數,如延時函數、引腳操作函數等。
  • 優化數據傳輸:在 8080 接口中,可以考慮使用 DMA(Direct Memory Access)進行數據傳輸,提高傳輸效率。

6.2 調試技巧

  • 使用調試工具:利用 STM32CubeIDE 或 Keil MDK 的調試功能,單步執行代碼,觀察變量的值和程序的執行流程。
  • 添加調試信息:在關鍵位置添加打印語句,輸出調試信息,幫助定位問題。

七、總結

通過本文的介紹,你可以基于 STM32F407 HAL 庫實現 OLED 顯示屏的 8080 接口和 IIC 接口驅動。8080 接口適合對通信速度要求較高的場景,而 IIC 接口則更適合引腳資源有限的情況。在實際開發中,可以根據具體需求選擇合適的通信接口。

    本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
    如若轉載,請注明出處:http://www.pswp.cn/bicheng/76782.shtml
    繁體地址,請注明出處:http://hk.pswp.cn/bicheng/76782.shtml
    英文地址,請注明出處:http://en.pswp.cn/bicheng/76782.shtml

    如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

    相關文章

    Web開發-JavaEE應用動態接口代理原生反序列化危險Invoke重寫方法利用鏈

    知識點&#xff1a; 1、安全開發-JavaEE-動態代理&序列化&反序列化 2、安全開發-JavaEE-readObject&toString方法 一、演示案例-WEB開發-JavaEE-動態代理 動態代理 代理模式Java當中最常用的設計模式之一。其特征是代理類與委托類有同樣的接口&#xff0c;代理類…

    K8s是常用命令和解釋

    K8s高頻命令 獲取資源信息&#xff0c;如獲取 Pod、Service、Deployment等資源狀態信息 kubectl get創建資源如創建Pod、Service、Deployment等資源 kubectl create刪除資源&#xff0c;如刪除Pod、Service、Deployment等資源 kubectl delete 應用配置文件&#xff0c;如引用D…

    【模態分解】EMD-經驗模態分解

    算法配置頁面&#xff0c;也可以一鍵導出結果數據 報表自定義繪制 獲取和下載【PHM學習軟件PHM源碼】的方式 獲取方式&#xff1a;Docshttps://jcn362s9p4t8.feishu.cn/wiki/A0NXwPxY3ie1cGkOy08cru6vnvc

    TDengine 語言連接器(Go)

    簡介 driver-go 是 TDengine 的官方 Go 語言連接器&#xff0c;實現了 Go 語言 database/sql 包的接口。Go 開發人員可以通過它開發存取 TDengine 集群數據的應用軟件。 Go 版本兼容性 支持 Go 1.14 及以上版本。 支持的平臺 原生連接支持的平臺和 TDengine 客戶端驅動支持…

    鏈接世界:計算機網絡的核心與前沿

    計算機網絡引言 在數字化時代&#xff0c;計算機網絡已經成為我們日常生活和工作中不可或缺的基礎設施。從簡單的局域網&#xff08;LAN&#xff09;到全球互聯網&#xff0c;計算機網絡將數以億計的設備連接在一起&#xff0c;推動了信息交換、資源共享以及全球化的進程。 什…

    AI agents系列之全面介紹

    隨著大型語言模型(LLMs)的出現,人工智能(AI)取得了巨大的飛躍。這些強大的系統徹底改變了自然語言處理,但當它們與代理能力結合時,才真正釋放出潛力——能夠自主地推理、規劃和行動。這就是LLM代理大顯身手的地方,它們代表了我們與AI交互以及利用AI的方式的范式轉變。 …

    如何使用AI輔助開發CSS3 - 通義靈碼功能全解析

    一、引言 CSS3 作為最新的 CSS 標準&#xff0c;引入了眾多新特性&#xff0c;如彈性布局、網格布局等&#xff0c;極大地豐富了網頁樣式的設計能力。然而&#xff0c;CSS3 的樣式規則繁多&#xff0c;記憶所有規則對于開發者來說幾乎是不可能的任務。在實際開發中&#xff0c…

    復刻系列-星穹鐵道 3.2 版本先行展示頁

    復刻星穹鐵道 3.2 版本先行展示頁 0. 視頻 手搓&#xff5e;星穹鐵道&#xff5e;展示頁&#xff5e;&#xff5e;&#xff5e; 1. 基本信息 作者: 啊是特嗷桃系列: 復刻系列官方的網站: 《崩壞&#xff1a;星穹鐵道》3.2版本「走過安眠地的花叢」專題展示頁現已上線復刻的網…

    爬蟲:IP代理

    什么是代理 代理服務器 代理服務器的作用 就是用來轉發請求和響應 在爬蟲中為何需要使用代理&#xff1f; 有些時候&#xff0c;需要對網站服務器發起高頻的請求&#xff0c;網站的服務器會檢測到這樣的異常現象&#xff0c;則會講請求對應機器的ip地址加入黑名單&#xff…

    協程的原生掛起與恢復機制

    目錄 &#x1f50d; 一、從開發者視角看協程掛起與恢復 &#x1f9e0; 二、協程掛起和恢復的機制原理&#xff1a;核心關鍵詞 ? suspend 函數 ≠ 普通函數 ? Continuation&#xff08;協程的控制器&#xff09; &#x1f527; 三、編譯器做了什么&#xff1f;&#xff0…

    c++11--std::forwaord--完美轉發

    std::forword的作用 完美轉發的核心目的是保持參數的原始類型&#xff08;包括const/volatile限定符和左值/右值性質&#xff09;不變地傳遞給其他函數。 為什么需要完美轉發 在沒有完美轉發之前&#xff0c;我們面臨以下問題&#xff1a; 模板參數傳遞中的值類別丟失 當參數…

    Linux安裝開源版MQTT Broker——EMQX服務器環境從零到一的詳細搭建教程

    零、EMQX各個版本的區別 EMQX各個版本的功能對比詳情https://docs.emqx.com/zh/emqx/latest/getting-started/feature-comparison.html

    計算機組成原理-存儲器

    1. 存儲器的定義與作用 存儲器是計算機系統中用于存儲程序、數據和中間結果的硬件設備&#xff0c;是計算機五大核心部件之一。 核心功能&#xff1a; 提供數據的 臨時或永久存儲 能力。支持CPU按需快速存取指令和數據&#xff0c;是程序運行的物理基礎。 2. 存儲器的分類 …

    單片機領域中哈希表

    以下是單片機領域中哈希表的實際應用及編程實例&#xff1a; 1.哈希表在單片機中的實際應用場景 ? 命令解析&#xff1a;在單片機通信中&#xff0c;經常需要解析接收到的命令。使用哈希表可以快速地將命令字符串映射到對應的處理函數&#xff0c;提高命令解析的效率。 ? 數…

    算法思想之位運算(一)

    歡迎拜訪&#xff1a;霧里看山-CSDN博客 本篇主題&#xff1a;算法思想之位運算(一) 發布時間&#xff1a;2025.4.12 隸屬專欄&#xff1a;算法 目錄 滑動窗口算法介紹六大基礎位運算符常用模板總結 例題位1的個數題目鏈接題目描述算法思路代碼實現 比特位計數題目鏈接題目描述…

    封裝Tcp Socket

    封裝Tcp Socket 0. 前言1. Socket.hpp2. 簡單的使用介紹 0. 前言 本文中用到的Log.hpp在筆者的歷史文章中都有涉及&#xff0c;這里就不再粘貼源碼了&#xff0c;學習地址如下&#xff1a;https://blog.csdn.net/weixin_73870552/article/details/145434855?spm1001.2014.3001…

    全星APQP軟件:為用戶提供高效、合規、便捷的研發管理體驗

    全星APQP軟件&#xff1a;為用戶提供高效、合規、便捷的研發管理體驗 為什么選擇全星APQP軟件系統&#xff1f; 在汽車及高端制造行業&#xff0c;研發項目管理涉及APQP&#xff08;先期產品質量策劃&#xff09;、FMEA&#xff08;失效模式與影響分析&#xff09;、CP&#x…

    CTF--網站被黑

    一、原題&#xff1a; &#xff08;1&#xff09;提示&#xff1a;網站被黑了 黑客會不會留下后門 &#xff08;2&#xff09;原網頁&#xff1a; 二、步驟&#xff1a; 1.在終端掃描網址&#xff1a; 2.掃描后發現&#xff1a;shell.php 3.輸入網址&#xff1a;http://117.…

    入門到精通,C語言十大經典程序

    以下是十個經典的C語言程序示例&#xff0c;這些程序涵蓋了從基礎到稍復雜的應用場景&#xff0c;適合初學者和有一定基礎的開發者學習和參考。 1. Hello, World! 這是每個初學者學習編程時的第一個程序&#xff0c;用于驗證開發環境是否正確配置。 #include <stdio.h>…

    神經網絡入門—自定義神經網絡續集

    修改網絡 神經網絡入門—自定義網絡-CSDN博客 修改數據集&#xff0c;yx^2 # 生成一些示例數據 x_train torch.tensor([[1.0], [2.0], [3.0], [4.0]], dtypetorch.float32) y_train torch.tensor([[1.0], [4.0], [9.0], [16.0]], dtypetorch.float32) 將預測代碼改為&…