STM32G030F6P6基于HAL库硬件IIC驱动1.54寸OLED屏幕

STM32G030F6P6基于硬件IIC驱动1.54寸OLED屏幕

1 注意事项

2 如何利用STM32G030F6P6驱动OLED显示屏

    2.1*基本配置*

    2.2 *1.54寸OLED端口含义*

    2.3 *1.54寸OLED液晶屏引脚与STM32G030F6P6引脚的硬件连接*

    2.4 *1.54寸OLED液晶屏驱动程序*

3 测试

  1. 注意事项

      本文硬件使用的自制电路板,芯片是“STM32G030F6P6”以及ST-LINK v2下载工具,采用内部高速晶振。

扫描二维码关注公众号,回复: 14139762 查看本文章

    该程序使用硬件IIC,STM32G030F6P6有两路IIC通道,本系统采用的IIC1。所以只需将IIC1SCL,IIC1SDA对应的STM32G030F6P6 IIC1引脚设为iic模式即可。

   该程序在CubeMX下完成,该程序模拟IIC HAL库移植而来(STM32G030F6P6基于HAL库模拟IIC驱动1.54寸OLED屏幕)。模拟IIC HAL库驱动例程和本案例完整代码工程获取方式为公众号回复IIC驱动获取下载地址。

2 如何利用STM32驱动OLED液晶屏

2.1基本配置

     首先利用CubeMX工具进行基本配置,配置内容主要包括设置PB7、PB9分别为I2C1_SCL、I2C1_SDA;设置PB14和PB13为SWCLK调试接口;设置PA12下拉输输出模式和PA11为上拉输入模式,这个两个端口连接了一个LED,作为CPU工作指示灯。时钟采用芯片内部高速时钟,部分配置如下图所示。

        然后在cubemx中使能IIC,如下图所示。展开Connectivity,选择I2C1,将I2C由Disable改为I2C,即使能I2C。

2.2 1.54OLED端口含义

IIC接口的OLED引脚有四脚,如图所示分别为

2.3 1.54OLED液晶屏引脚与STM32引脚的硬件连接

       这里OLED的SCL接STM32的PB7,SDA接单片机的PB9,因为这两个引脚可以作为硬件IIC使用。

2.4  修改1.54寸OLED液晶屏驱动程序

      由于采用硬件IIC驱动,所以不再需要软件模拟IIC时序和读写功能代码,下面删除这些代码。

     首先修改oled.c文件。找到下图函数代码删除。

     然后在oled.c文件中,添加数据发送和命令发送函数。首先定义OLED_ADDDRESS地址为0x78,地址一般是0x78,这个可以在oled屏幕背面查看此参数。同时声明外部变量hi2c1,这个是对I2C1操作的句柄。

最后改写OLED.C中的改写读写数据函数,如下图所示:

修改OLED屏幕刷新函数

修改初始换函数,删除报错的代码和延时函数,修改后如下:

      接下来修改oled.h文件,这里主要是删除连接OLED的SCK和SDA的两个标准库读写操作用HAL库操作以及实训函数声明部分。修改之后的头文件为

#ifndef __OLED_H

#define __OLED_H 

//#include "stm32f0xx.h"

/******1.改为hal库头文件*****/

#include "stm32g0xx_hal.h"

#define OLED_CMD  0 //写命令

#define OLED_DATA 1 //写数据

#define uint8_t unsigned char 

#define u16 unsigned int

#define u32 unsigned long

void OLED_ClearPoint(uint8_t x,uint8_t y);

void OLED_ColorTurn(uint8_t i);

void OLED_DisplayTurn(uint8_t i);

void OLED_WR_Byte(uint8_t dat,uint8_t mode);

void OLED_DisPlay_On(void);

void OLED_DisPlay_Off(void);

void OLED_Refresh(void);

void OLED_Clear(void);

void OLED_DrawPoint(uint8_t x,uint8_t y,uint8_t t);

void OLED_DrawLine(uint8_t x1,uint8_t y1,uint8_t x2,uint8_t y2,uint8_t mode);

void OLED_DrawCircle(uint8_t x,uint8_t y,uint8_t r);

void OLED_ShowChar(uint8_t x,uint8_t y,uint8_t chr,uint8_t size1,uint8_t mode);

void OLED_ShowChar6x8(uint8_t x,uint8_t y,uint8_t chr,uint8_t mode);

void OLED_ShowString(uint8_t x,uint8_t y,uint8_t *chr,uint8_t size1,uint8_t mode);

void OLED_ShowNum(uint8_t x,uint8_t y,u32 num,uint8_t len,uint8_t size1,uint8_t mode);

void OLED_ShowChinese(uint8_t x,uint8_t y,uint8_t num,uint8_t size1,uint8_t mode);

void OLED_ScrollDisplay(uint8_t num,uint8_t space,uint8_t mode);

void OLED_ShowPicture(uint8_t x,uint8_t y,uint8_t sizex,uint8_t sizey,uint8_t BMP[],uint8_t mode);

void OLED_Init(void);

#endif

3 测试

在main.c中加入如下代码:显示内容为微信搜一搜 MCU学习笔记 欢迎关注

       OLED_Init();

HAL_Delay(2000);

OLED_ShowChinese(18,0,0,16,1);//微

OLED_ShowChinese(36,0,1,16,1);//信

OLED_ShowChinese(54,0,2,16,1);//搜

OLED_ShowChinese(72,0,3,16,1);//一

OLED_ShowChinese(90,0,4,16,1);//搜号

OLED_ShowString(10,24,(unsigned char *)"MCU",16,1);

OLED_ShowChinese(40,24,5,16,1);//信

OLED_ShowChinese(58,24,6,16,1);//公

OLED_ShowChinese(76,24,7,16,1);//众

OLED_ShowChinese(94,24,8,16,1);//号

//OLED_ShowString(20,36,(unsigned char *)"2022/05/01",16,1);

OLED_ShowChinese(25,44,9,16,1);//欢

OLED_ShowChinese(43,44,10,16,1);//迎

OLED_ShowChinese(61,44,11,16,1);//关

OLED_ShowChinese(77,44,12,16,1);//注

OLED_Refresh();

发表于河南

猜你喜欢

转载自blog.csdn.net/chanchairen/article/details/124635254