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下载工具,采用内部高速晶振。不同的SMT32芯片,基本配置都是一样,只需要做稍微的更改即可,后面会提到需要更改哪些地方。

    该程序使用模拟IIC,不是硬件IIC,只需将SCL,SDA对应的STM32G030F6P6引脚设为推挽输出即可,另外注意移植代码时需要修改为对应引脚。

      该程序在CubeMX下完成,该程序基于中景园STM32标准库函数示例程序修改的。标准库函数例程和本案例完整代码工程获取方式为微信公众号MCU学习笔记回复IIC驱动获取下载地址。

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

2.1基本配置

     首先利用CubeMX工具进行基本配置,配置内容主要包括设置PB6、PB7为输出模式;设置PB14和PB13为SWCLK调试接口;设置PA12下拉输输出模式和PA11为上拉输入模式。时钟采用芯片内部高速时钟,部分配置如下图所示。

2.2 1.54OLED端口含义

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

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

       这里OLED的SCL接STM32的PB7,SDA接单片机的PB9,如果采用模拟IIC,这两个引脚是可以随意改动,只需要在CubeMX上事先配置好对应引脚为OutPut模式。这里接PB9和PB7,因为这两个引脚可以作为硬件IIC使用。

2.4  1.54寸OLED液晶屏驱动程序

     首先修改oled.c文件,删除#include "delay.h",将u8全部替换为uint8_t;将u16全部替换为uint16_t;修改OLED的初始化函数,删除如下代码,因为初始化已经在主函数通过MX_GPIO_Init()实现。将delay_ms(200)用HAL_Delay(200)替换。

           

//修改之后的OLED的初始化代码

void OLED_Init(void)

{

OLED_RES_Clr();

//delay_ms(200);

HAL_Delay(200);

OLED_RES_Set();

OLED_WR_Byte(0xAE,OLED_CMD);//--turn off oled panel

OLED_WR_Byte(0xFD,OLED_CMD);

OLED_WR_Byte(0x12,OLED_CMD);

OLED_WR_Byte(0xd5,OLED_CMD);//--set display clock divide ratio/oscillator frequency

OLED_WR_Byte(0xA0,OLED_CMD);

OLED_WR_Byte(0xA8,OLED_CMD);//--set multiplex ratio(1 to 64)

OLED_WR_Byte(0x3f,OLED_CMD);//--1/64 duty

OLED_WR_Byte(0xD3,OLED_CMD);//-set display offset Shift Mapping RAM Counter (0x00~0x3F)

OLED_WR_Byte(0x00,OLED_CMD);//-not offset

OLED_WR_Byte(0x40,OLED_CMD);//--set start line address  Set Mapping RAM Display Start Line (0x00~0x3F)

OLED_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(0xDA,OLED_CMD);//--set com pins hardware configuration

OLED_WR_Byte(0x12,OLED_CMD);

OLED_WR_Byte(0x81,OLED_CMD);//--set contrast control register

OLED_WR_Byte(0xBF,OLED_CMD);// Set SEG Output Current Brightness

OLED_WR_Byte(0xD9,OLED_CMD);//--set pre-charge period

OLED_WR_Byte(0x25,OLED_CMD);//Set Pre-Charge as 15 Clocks & Discharge as 1 Clock

OLED_WR_Byte(0xDB,OLED_CMD);//--set vcomh

OLED_WR_Byte(0x34,OLED_CMD);//Set VCOM Deselect Level

OLED_WR_Byte(0xA4,OLED_CMD);// Disable Entire Display On (0xa4/0xa5)

OLED_WR_Byte(0xA6,OLED_CMD);// Disable Inverse Display On (0xa6/a7)

OLED_Clear();

OLED_WR_Byte(0xAF,OLED_CMD);

}

pping RAM Counter (0x00~0x3F)

OLED_WR_Byte(0x00,OLED_CMD);//-not offset

OLED_WR_Byte(0xd5,OLED_CMD);//--set display clock divide ratio/oscillator frequency

OLED_WR_Byte(0x80,OLED_CMD);//--set divide ratio, Set Clock as 100 Frames/Sec

OLED_WR_Byte(0xD9,OLED_CMD);//--set pre-charge period

OLED_WR_Byte(0xF1,OLED_CMD);//Set Pre-Charge as 15 Clocks & Discharge as 1 Clock

      接下来修改oled.h文件,这里主要是将对连接OLED的SCK和SDA的两个标准库读写操作用HAL库操作。

#ifndef __OLED_H

#define __OLED_H 

//#include "stm32f0xx.h"

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

#include "stm32g0xx_hal.h"

//-----------------测试LED端口定义---------------- 

//

//#define LED_ON        GPIO_ResetBits(GPIOA,GPIO_Pin_15)

//#define LED_OFF       GPIO_SetBits(GPIOA,GPIO_Pin_15)

//-----------------OLED端口定义---------------- 

/******2.改为hal对GPIO操作*****/

//SCL----->PB7

//SDA----->PB9

#define OLED_SCL_Clr() HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_RESET)//SCL

#define OLED_SCL_Set() HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_SET)

#define OLED_SDA_Clr() HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9, GPIO_PIN_RESET)//DIN

#define OLED_SDA_Set() HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9, GPIO_PIN_SET)

#define OLED_RES_Clr() HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_RESET)//RES

#define OLED_RES_Set() HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_SET)

#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 I2C_Start(void);

void I2C_Stop(void);

void I2C_WaitAck(void);

void Send_Byte(uint8_t dat);

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

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 测试

猜你喜欢

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