0.96寸OLED显示屏标准库移植HAL库(模拟IIC) - 基于STM32

发布时间:2026/10/21 10:35:01
0.96寸OLED显示屏标准库移植HAL库(模拟IIC) - 基于STM32 **0.96寸OLED显示屏标准库移植HAL库使用模拟IIC**由于项目的需要使用OLED屏显示并且现有的项目程序是基于HAL库编写的而手头能找到的程序是标准库的驱动程序大概看了一下代码比较简单涉及到不同库之间需要改动的代码很少。代码下载链接点击此处下载驱动代码首先去LCDWiKi网站 链接下载基于0.96寸OLED屏的IIC驱动代码这个网站包含了常用显示模块的驱动代码十分方便本次我选择的是0.96inch OLED Module SKU:MC096GX。下载后只需要oled屏的oled.c、oled.h和oledfont.h代码但是需要改动如下几个地方的代码首先是oled.c1.将oled.c文件中的所有包含“delay_ms”的函数改为HAL库延时函数HAL_Delay2.将oled.c文件中的所有包含“u8”和“u32”的函数改为uint8_t和uint32_t3.删除#include sys.h和#include “delay.h”增加#include “stm32g4xx_hal.h”这里根据自身使用的32芯片定义我这里用到的是stm32g4系列芯片。其次改动oled.h1.首先改GPIO定义原驱动代码的IIC时钟线为PB13IIC数据线为PB14我这里用到的是PA11和PA12所以将时钟线#defineOLED_SCLK_Clr()GPIO_ResetBits(GPIOB,GPIO_Pin_13);#defineOLED_SCLK_Set()GPIO_SetBits(GPIOB,GPIO_Pin_13)改为#defineOLED_SCLK_Clr()HAL_GPIO_WritePin(GPIOA,GPIO_PIN_11,GPIO_PIN_RESET);#defineOLED_SCLK_Set()HAL_GPIO_WritePin(GPIOA,GPIO_PIN_11,GPIO_PIN_SET)将数据线#defineOLED_SDIN_Clr()GPIO_ResetBits(GPIOB,GPIO_Pin_14)//DIN#defineOLED_SDIN_Set()GPIO_SetBits(GPIOB,GPIO_Pin_14)改为#defineOLED_SDIN_Clr()HAL_GPIO_WritePin(GPIOA,GPIO_PIN_12,GPIO_PIN_RESET)//DIN#defineOLED_SDIN_Set()HAL_GPIO_WritePin(GPIOA,GPIO_PIN_12,GPIO_PIN_SET)2.同oled.c一样将oled.h文件中的所有包含“u8”和“u32”的函数改为uint8_t和uint32_t3.删除#include “sys.h”增加#include “stm32g4xx_hal.h”这里根据自身使用的32芯片定义我这里用到的是stm32g4系列芯片。经过以上步骤所有移植就完成了使用CUBEMX创建工程配置好时钟线和数据线生成代码使用keil打开工程将oled.c放入src文件夹oled.h文件和oledfont.h文件放入inc文件夹在主函数main.c中初始化OLED我的测试函数如下intmain(void){/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();/* USER CODE BEGIN 2 */OLED_Init();//初始化OLEDOLED_Clear(0);/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while(1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */OLED_ShowCHinese(6,0,0);//全OLED_ShowCHinese(26,0,1);//动OLED_ShowCHinese(46,0,2);//电OLED_ShowCHinese(66,0,3);//子OLED_ShowCHinese(86,0,4);//技OLED_ShowCHinese(106,0,5);//术OLED_ShowString(6,3,0.96 OLED TEST,16);OLED_ShowString(0,6,ASCII:,16);OLED_ShowString(63,6,CODE:,16);}/* USER CODE END 3 */}最后的显示效果如下移植成功OLED屏的驱动电路是自己画的没用到模块顺便附上原理图