STM32 HAL庫驅動0.96寸OLED屏幕

STM32 HAL庫驅動0.96寸OLED屏幕

項目概述

本項目使用STM32 HAL庫為0.96寸OLED屏幕編寫驅動程序。OLED屏幕通過I2C接口與STM32單片機通信,實現文本、數字和圖形的顯示功能。

項目倉庫地址:STM32_Sensor_Drives

硬件連接

在這里插入圖片描述

OLED屏幕通過I2C接口與STM32連接:

  • SCL連接到PB8
  • SDA連接到PB9

關鍵代碼

1. I2C初始化

void MX_I2C1_Init(void)
{hi2c1.Instance = I2C1;hi2c1.Init.ClockSpeed = 100000;hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2;hi2c1.Init.OwnAddress1 = 0;hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;hi2c1.Init.OwnAddress2 = 0;hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;if (HAL_I2C_Init(&hi2c1) != HAL_OK){Error_Handler();}
}

2. I2C引腳配置

void HAL_I2C_MspInit(I2C_HandleTypeDef *i2cHandle)
{GPIO_InitTypeDef GPIO_InitStruct = {0};if (i2cHandle->Instance == I2C1){__HAL_RCC_GPIOB_CLK_ENABLE();/**I2C1 GPIO ConfigurationPB8     ------> I2C1_SCLPB9     ------> I2C1_SDA*/GPIO_InitStruct.Pin = GPIO_PIN_8 | GPIO_PIN_9;GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);__HAL_AFIO_REMAP_I2C1_ENABLE();/* I2C1 clock enable */__HAL_RCC_I2C1_CLK_ENABLE();}
}

3. OLED基本通信函數

// 向OLED發送命令
void Write_IIC_Command(uint8_t cmd)
{HAL_I2C_Mem_Write(&hi2c1, 0x78, 0x00, I2C_MEMADD_SIZE_8BIT, &cmd, 1, 100);
}// 向OLED發送數據
void Write_IIC_Data(uint8_t data)
{HAL_I2C_Mem_Write(&hi2c1, 0x78, 0x40, I2C_MEMADD_SIZE_8BIT, &data, 1, 100);
}

4. OLED顯示控制函數

// 設置顯示坐標
void OLED_Set_Pos(unsigned char x, unsigned char y)
{Write_IIC_Command(0xb0 + y);Write_IIC_Command(((x & 0xf0) >> 4) | 0x10);Write_IIC_Command((x & 0x0f));
}// 開啟OLED顯示
void OLED_Display_On(void)
{Write_IIC_Command(0X8D); // SET DCDC命令Write_IIC_Command(0X14); // DCDC ONWrite_IIC_Command(0XAF); // DISPLAY ON
}// 關閉OLED顯示
void OLED_Display_Off(void)
{Write_IIC_Command(0X8D); // SET DCDC命令Write_IIC_Command(0X10); // DCDC OFFWrite_IIC_Command(0XAE); // DISPLAY OFF
}// 清屏函數
void OLED_Clear(void)
{uint8_t i, n;for (i = 0; i < 8; i++){Write_IIC_Command(0xb0 + i); // 設置頁地址(0~7)Write_IIC_Command(0x00);     // 設置顯示位置—列低地址Write_IIC_Command(0x10);     // 設置顯示位置—列高地址for (n = 0; n < 128; n++)Write_IIC_Data(0);}
}// 全屏點亮
void OLED_On(void)
{uint8_t i, n;for (i = 0; i < 8; i++){Write_IIC_Command(0xb0 + i); // 設置頁地址(0~7)Write_IIC_Command(0x00);     // 設置顯示位置—列低地址Write_IIC_Command(0x10);     // 設置顯示位置—列高地址for (n = 0; n < 128; n++)Write_IIC_Data(1);}
}

5. 字符顯示函數

// 在指定位置顯示一個字符
void OLED_ShowChar(uint8_t x, uint8_t y, uint8_t chr, uint8_t Char_Size)
{unsigned char c = 0, i = 0;c = chr - ' '; // 得到偏移后的值if (x > Max_Column - 1){x = 0;y = y + 2;}if (Char_Size == 16){OLED_Set_Pos(x, y);for (i = 0; i < 8; i++)Write_IIC_Data(F8X16[c * 16 + i]);OLED_Set_Pos(x, y + 1);for (i = 0; i < 8; i++)Write_IIC_Data(F8X16[c * 16 + i + 8]);}else{OLED_Set_Pos(x, y);for (i = 0; i < 6; i++)Write_IIC_Data(F6x8[c][i]);}
}// 顯示字符串
void OLED_ShowString(uint8_t x, uint8_t y, uint8_t *chr, uint8_t Char_Size)
{unsigned char j = 0;while (chr[j] != '\0'){OLED_ShowChar(x, y, chr[j], Char_Size);x += 8;j++;}
}// 顯示數字
void OLED_ShowNum(uint8_t x, uint8_t y, uint32_t num, uint8_t len, uint8_t size2)
{uint8_t t, temp;uint8_t 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 + (size2 / 2) * t, y, ' ', size2);continue;}elseenshow = 1;}OLED_ShowChar(x + (size2 / 2) * t, y, temp + '0', size2);}
}// m^n函數
uint32_t oled_pow(uint8_t m, uint8_t n)
{uint32_t result = 1;while (n--)result *= m;return result;
}

6. 中文顯示和圖片顯示

// 顯示中文
void OLED_ShowCHinese(uint8_t x, uint8_t y, uint8_t no)
{uint8_t t, adder = 0;OLED_Set_Pos(x, y);for (t = 0; t < 16; t++){Write_IIC_Data(Hzk[no][t]);adder += 1;}OLED_Set_Pos(x, y + 1);for (t = 0; t < 16; t++){Write_IIC_Data(Hzk[no][t + 16]);adder += 1;}
}// 顯示BMP圖片
void OLED_DrawBMP(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;elsey = y1 / 8 + 1;for (y = y0; y < y1; y++){OLED_Set_Pos(x0, y);for (x = x0; x < x1; x++){Write_IIC_Data(BMP[j++]);}}
}

7. OLED初始化函數

void OLED_start(void)
{Write_IIC_Command(0xAE); // 關閉顯示Write_IIC_Command(0xD5); // 設置時鐘分頻因子,震蕩頻率Write_IIC_Command(0x80); // [3:0],分頻因子;[7:4],震蕩頻率Write_IIC_Command(0xA8); // 設置驅動路數Write_IIC_Command(0x3F); // 默認0X3F(1/64)Write_IIC_Command(0xD3); // 設置顯示偏移Write_IIC_Command(0x00); // 默認為0Write_IIC_Command(0x40); // 設置顯示開始行 [5:0],行數.Write_IIC_Command(0x8D); // 電荷泵設置Write_IIC_Command(0x14); // bit2,開啟/關閉Write_IIC_Command(0x20); // 設置內存地址模式Write_IIC_Command(0x02); // [1:0],00,列地址模式;01,行地址模式;10,頁地址模式;默認10;Write_IIC_Command(0xA1); // 段重定義設置,bit0:0,0->0;1,0->127;Write_IIC_Command(0xC8); // 設置COM掃描方向;bit3:0,普通模式;1,重定義模式 COM[N-1]->COM0;N:驅動路數Write_IIC_Command(0xDA); // 設置COM硬件引腳配置Write_IIC_Command(0x12); // [5:4]配置Write_IIC_Command(0x81); // 對比度設置Write_IIC_Command(0xEF); // 1~255;默認0X7F (亮度設置,越大越亮)Write_IIC_Command(0xD9); // 設置預充電周期Write_IIC_Command(0xf1); // [3:0],PHASE 1;[7:4],PHASE 2;Write_IIC_Command(0xDB); // 設置VCOMH 電壓倍率Write_IIC_Command(0x30); // [6:4] 000,0.65*vcc;001,0.77*vcc;011,0.83*vcc;Write_IIC_Command(0xA4); // 全局顯示開啟;bit0:1,開啟;0,關閉;(白屏/黑屏)Write_IIC_Command(0xA6); // 設置顯示方式;bit0:1,反相顯示;0,正常顯示Write_IIC_Command(0xAF); // 開啟顯示OLED_Clear();
}

8. 主函數中的使用示例

int main(void)
{/* 省略初始化代碼 *//* 初始化外設 */MX_GPIO_Init();MX_USART2_UART_Init();MX_I2C1_Init();/* 初始化OLED */OLED_start();/* 無限循環 */printf("System will start while\n");OLED_Clear();OLED_ShowString(0, 0, (uint8_t*)"Init success", 16);OLED_ShowString(0, 2, (uint8_t*)"Init success", 12);while (1){HAL_Delay(200);}
}

字體數據

項目中包含了兩種字體數據:

  1. 6x8點陣字體(F6x8):適用于小字體顯示
  2. 8x16點陣字體(F8X16):適用于大字體顯示
  3. 中文字庫(Hzk):用于顯示中文字符

注意事項

  1. OLED的I2C地址為0x78(寫操作)
  2. 顯示區域為128x64像素
  3. 使用前需要先調用OLED_start()初始化OLED
  4. 清屏函數OLED_Clear()可以清除屏幕上的所有內容

常用函數總結

函數名功能描述
OLED_start()初始化OLED
OLED_Clear()清屏
OLED_Display_On()開啟顯示
OLED_Display_Off()關閉顯示
OLED_ShowChar()顯示單個字符
OLED_ShowString()顯示字符串
OLED_ShowNum()顯示數字
OLED_ShowCHinese()顯示中文
OLED_DrawBMP()顯示BMP圖片

參考資料

  • STM32 HAL庫文檔
  • 0.96寸OLED屏幕數據手冊
  • 項目倉庫

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

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

相關文章

橫向越權:修改參數訪問不屬于自己的數據

一、什么是橫向越權定義 橫向越權&#xff08;Horizontal Privilege Escalation&#xff09;是指 同一權限級別的用戶&#xff0c;通過篡改請求參數或資源標識&#xff0c;訪問本不屬于自己的數據或功能。例子 假設一個在線商城&#xff0c;用戶 A 訪問訂單詳情的 URL&#xff…

攻擊實驗(ARP欺騙、MAC洪范、TCP SYN Flood攻擊、DNS欺騙、DHCP餓死)

實驗一 ARP欺騙一、拓撲二、實驗準備、1.設置終端漏洞靶機集合選擇需要的數量和鏡像打開設備上的驅動精靈安裝網卡安裝成功后查看IP地址、網關信息等。三、實驗步驟1.實驗原理中間人&#xff08;攻擊者&#xff09;在終端與網關之間持續發送偽造的 ARP 應答包&#xff0c;雙向欺…

VSCode 禁用更新檢查的方法

通過設置菜單禁用 這是最直接和推薦的方法&#xff0c;可以永久禁用自動更新&#xff1a; 打開 VSCode。點擊左下角的齒輪圖標&#xff0c;然后選擇“設置”。或者通過菜單欄“文件” > “首選項” > “設置”進入。在頂部的搜索框中輸入“update”。找到“Update: Mode”…

Flutter - 應用啟動/路由管理

一、應用入口1. 初始化 Flutter 底層綁定 &#xff0c;運行 App。import package:flutter/material.dart; import package:flutter_base/Application.dart;void main() {// 確保綁定初始化WidgetsFlutterBinding.ensureInitialized();// App初始化Application.init(); }2. 注冊…

MySQL 數據操作全流程:創建、讀取、更新與刪除實戰

MySQL系列 文章目錄MySQL系列前言一、Create(創建)并插入數據1.1 單行數據 全列插入1.2 多行數據 指定列插入1.3 插入沖突時同步更新1.4 沖突時替換二、Retireve讀取數據2.1 全列查詢2.2 查詢指定列2.3 查詢字段為表達式2.4 結果去重 DISTINCT2.5 where條件篩選2.6 order by語…

SQL約束:數據完整性的守護者

在SQL中&#xff0c;約束&#xff08;Constraints&#xff09; 是作用于數據庫表字段上的規則&#xff0c;用于強制保證數據的完整性、準確性和一致性。當插入、更新或刪除數據時&#xff0c;約束會自動驗證操作是否符合規則&#xff0c;若違反則拒絕執行。 以下是SQL中常見的約…

Springboot-vue 地圖展現

在很多社區管理系統中&#xff0c;地圖展示功能是一個重要的模塊&#xff0c;它能直觀地呈現小區的地理位置分布。本文將詳細梳理從前端觸發請求到地圖上展示小區數據的完整流程&#xff0c;幫助大家理解前后端協同工作的具體細節。一、前端觸發&#xff1a;頁面加載與地圖初始…

Vue 3 登錄組件

Login.vue 組件詳細分析整體架構 Vue 3 登錄組件&#xff0c;采用 Composition API Element Plus UI 庫&#xff0c;實現了完整的用戶認證界面。 模板結構分析 1. 容器布局 <div class"login-container"><el-card class"login-card"><!-- …

小結: getSpringFactoriesInstances從 `spring.factories` 文件中加載和實例化指定類型的類

getSpringFactoriesInstances 方法工作原理 getSpringFactoriesInstances 是 Spring Boot 框架中的一個核心方法&#xff0c;用于從 spring.factories 文件中加載和實例化指定類型的類。這是 Spring Boot 實現自動配置和插件化擴展的關鍵機制。 1. 基本功能 該方法的主要作用是…

selenium SessionNotCreatedException問題解決辦法

在上周有一臺服務器重啟之后&#xff0c;Chrome瀏覽器也自動升了級&#xff0c;原本能夠正常使用的自動化辦公程序突然沒法用了&#xff0c;出現了下面的報錯提示。codes/addCancelBdld.py:980: DeprecationWarning: use options instead of chrome_optionsdriver webdriver.C…

SOAP HTTP Binding

SOAP HTTP Binding 引言 SOAP(Simple Object Access Protocol)是一種輕量級、簡單的協議,用于在網絡上交換結構化信息。它廣泛應用于Web服務中,用于實現不同系統和應用程序之間的通信。SOAP HTTP Binding是SOAP協議的一種實現方式,它允許使用HTTP協議來傳輸SOAP消息。本…

GPT-5免費使用教程(國內可訪問)

GPT-5來了&#xff0c;壓力給到各大AI模型廠商&#xff1f; 北京時間2025年8月7日&#xff0c;OpenAI 推出兩款開源模型 gpt-oss-120b / 20b&#xff0c;性能逼近 o4-mini/o3-mini&#xff0c;一時間火爆AI圈&#xff1b;但這好像只是一道開胃小菜&#xff0c;在北京時間2025年…

內存作假常見方案可行性分析

內存作假通常修改所涉及到的幾個文件&#xff1a;M sys/frameworks/base/core/java/android/app/ActivityManager.javaM sys/frameworks/base/core/jni/android_os_Debug.cppM sys/frameworks/base/core/jni/android_util_Process.cppM sys/frameworks/base/services/core/java…

C#(vs2015)利用unity實現彎管機仿真

以下是基于 Visual Studio 2015 和 Unity 實現彎管機仿真的完整技術流程&#xff0c;結合工業仿真開發的最佳實踐整理而成&#xff0c;涵蓋建模、通信、運動控制和交互邏輯等核心模塊&#xff1a;---一、環境配置與基礎框架搭建 1. Unity 與 VS2015 聯動 - 安裝 [Visual Studio…

華為USG防火墻雙機,但ISP只給了1個IP, 怎么辦?

華為USG防火墻雙機&#xff0c;但ISP只給了1個IP&#xff0c; 怎么辦&#xff1f; 華為USG雙機使用VRRP&#xff0c;需要3個Ip 本次聯通只給了 100.1.1.0/30 這一個互聯段 聯通側用了100.1.1.1&#xff0c; 我們這一側只有100.1.1.2 怎么辦&#xff1f; 找聯通多要幾個Ip&…

Go 工具鏈環境變量實戰:從“command not found”到工具全局可用的全流程復盤

在 Go 生態里&#xff0c;豐富的命令行工具極大提升了開發效率。但很多小伙伴第一次用 go install 安裝第三方工具后&#xff0c;卻遇到終端里找不到命令的尷尬——明明裝好了&#xff0c;終端卻報 “command not found”。這是為什么呢&#xff1f;本文結合我親身踩過的坑&…

MCU 軟件斷點注意事項!!!

——為什么調試器會在運行中改我的Flash程序&#xff1f;調試單片機時&#xff0c;很多人都有這樣的疑問&#xff1a;明明我在調試前刷進去的固件是好的&#xff0c;為什么加了一個斷點之后&#xff0c;調試器居然去改了 Flash&#xff1f; 如果我拔掉調試器&#xff0c;這個固…

騰訊iOA:數據安全的港灣

聲明&#xff1a;文章為本人真實測評&#xff0c;非廣告&#xff0c;無推廣&#xff0c;為用戶體驗文章 前言 當前網絡安全威脅日益復雜化&#xff0c;惡意軟件攻擊手段不斷升級。例如&#xff1a;釣魚郵件攜帶的偽裝安裝包可能引發勒索病毒在內網擴散&#xff0c;導致業務中斷…

相冊管理系統介紹

之前在github和gitee上了找了好久也沒找到符合自己需求的相冊管理系統&#xff0c;最近就靜下心來自己寫了一套。系統分為前臺相冊系統與后臺管理系統。 技術框架采用的是前端vueelementui&#xff0c;后端springbootmybatisplus。 下面是項目截圖&#xff1a;項目功能介紹&…

企業級高性能WEB服務器Nginx

nginx安裝 1.nginx編譯安裝 #在nginx官網獲取安裝包 [rootwebserver mnt]# wget https://nginx.org/download/nginx-1.24.0.tar.gz#解壓安裝包 [rootwebserver mnt]# tar zxf nginx-1.24.0.tar.gz [rootwebserver mnt]# cd nginx-1.24.0/#安裝編譯nginx需要的環境軟件 [rootw…