**
**
由于项目的需要使用OLED屏显示,并且现有的项目程序是基于HAL库编写的,而手头能找到的程序是标准库的驱动程序,大概看了一下代码,比较简单,涉及到不同库之间需要改动的代码很少。
代码下载链接:点击此处下载驱动代码
首先去LCDWiKi网站( 链接)下载基于0.96寸OLED屏的IIC驱动代码,这个网站包含了常用显示模块的驱动代码,十分方便,本次我选择的是0.96inch OLED Module SKU:MC096GX。
下载后只需要oled屏的oled.c、oled.h和oledfont.h代码,但是需要改动如下几个地方的代码
首先是oled.c:
1.将oled.c文件中的所有包含“delay_ms”的函数改为HAL库延时函数"HAL_Delay";
2.将oled.c文件中的所有包含“u8”和“u32”的函数改为"uint8_t"和"uint32_t";
3.删除#include "sys.h"和#include “delay.h”,增加#include “stm32g4xx_hal.h”(这里根据自身使用的32芯片定义,我这里用到的是stm32g4系列芯片)。
其次改动oled.h:
1.首先改GPIO定义,原驱动代码的IIC时钟线为PB13,IIC数据线为PB14,我这里用到的是PA11和PA12,所以
将时钟线
#define OLED_SCLK_Clr() GPIO_ResetBits(GPIOB,GPIO_Pin_13);
#define OLED_SCLK_Set() GPIO_SetBits(GPIOB,GPIO_Pin_13)
改为
#define OLED_SCLK_Clr() HAL_GPIO_WritePin(GPIOA,GPIO_PIN_11,GPIO_PIN_RESET);
#define OLED_SCLK_Set() HAL_GPIO_WritePin(GPIOA,GPIO_PIN_11,GPIO_PIN_SET)
将数据线
#define OLED_SDIN_Clr() GPIO_ResetBits(GPIOB,GPIO_Pin_14)//DIN
#define OLED_SDIN_Set() GPIO_SetBits(GPIOB,GPIO_Pin_14)
改为
#define OLED_SDIN_Clr() HAL_GPIO_WritePin(GPIOA,GPIO_PIN_12,GPIO_PIN_RESET)//DIN
#define OLED_SDIN_Set() HAL_GPIO_WritePin(GPIOA,GPIO_PIN_12,GPIO_PIN_SET)
2.同oled.c一样,将oled.h文件中的所有包含“u8”和“u32”的函数改为"uint8_t"和"uint32_t";
3.删除#include “sys.h”,增加#include “stm32g4xx_hal.h”(这里根据自身使用的32芯片定义,我这里用到的是stm32g4系列芯片)。
经过以上步骤,所有移植就完成了,使用CUBEMX创建工程,配置好时钟线和数据线,生成代码,使用keil打开工程,将oled.c放入src文件夹,oled.h文件和oledfont.h文件放入inc文件夹,在主函数main.c中初始化OLED,我的测试函数如下:
int main(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(); //初始化OLED
OLED_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 */
}
最后的显示效果如下,移植成功: