当前位置:实例文章 » 其他实例» [文章]STM32(HAL库)软件IIC驱动OLED

STM32(HAL库)软件IIC驱动OLED

发布人:shili8 发布时间:2025-01-01 21:34 阅读次数:0

**STM32 HAL 库 IIC 驱动 OLED**

本文将介绍如何使用 STM32 的 HAL 库 IIC 驱动来控制一个 OLED 显示屏。我们将使用 STM32F4Discovery 板作为开发板。

### 硬件准备* STM32F4Discovery 板* OLED 显示屏(例如 SSD1306 或 SH1106)
* IIC 接口线(例如4PIN 或2PIN)

### 软件准备* STM32CubeIDE (STM32 的 IDE)
* HAL 库 IIC 驱动源码### IIC 驱动 OLED#### IIC 驱动源码首先,我们需要在 STM32CubeIDE 中创建一个新项目。选择 "Empty Project",然后选择 "STM32F4Discovery" 作为开发板。

接下来,我们需要添加 HAL 库 IIC 驱动源码。我们可以从 STM32CubeMX 中导出 IIC 驱动源码,并将其粘贴到我们的项目中。

IIC 驱动源码如下:

c#include "stm32f4xx_hal.h"
#include "iic_driver.h"

#define I2C_SPEED100000void iic_init(void)
{
 // IIC 初始化 HAL_I2C_InitTypeDef iic_InitStruct;
 iic_InitStruct.I2C_ClockSpeed = I2C_SPEED;
 iic_InitStruct.I2C_DutyCycle = I2C_DUTYCYCLE_2;
 iic_InitStruct.I2C_Mode = I2C_MODE_STANDARD;
 iic_InitStruct.I2C_NumbOfModes =1U;
 HAL_I2C_Init(&hi2c1, &iic_InitStruct);
}

void iic_write_byte(uint8_t addr, uint8_t data)
{
 // IIC 写字节 HAL_I2C_Master_TransmitTypeDef transmit_InitStruct;
 transmit_InitStruct.Address = addr;
 transmit_InitStruct.DataLength =1U;
 transmit_InitStruct.Data = (uint8_t*) &data;
 HAL_I2C_Master_Transmit(&hi2c1, addr, data,1U,1000);
}

void iic_write_command(uint8_t addr, uint8_t command)
{
 // IIC 写命令 HAL_I2C_Master_TransmitTypeDef transmit_InitStruct;
 transmit_InitStruct.Address = addr;
 transmit_InitStruct.DataLength =1U;
 transmit_InitStruct.Data = (uint8_t*) &command;
 HAL_I2C_Master_Transmit(&hi2c1, addr, command,1U,1000);
}

void iic_write_data(uint8_t addr, uint8_t* data, uint16_t len)
{
 // IIC 写数据 HAL_I2C_Master_TransmitTypeDef transmit_InitStruct;
 transmit_InitStruct.Address = addr;
 transmit_InitStruct.DataLength = len;
 transmit_InitStruct.Data = (uint8_t*) data;
 HAL_I2C_Master_Transmit(&hi2c1, addr, data, len,1000);
}

void iic_read_byte(uint8_t addr, uint8_t* data)
{
 // IIC读字节 HAL_I2C_Master_ReceiveTypeDef receive_InitStruct;
 receive_InitStruct.Address = addr;
 receive_InitStruct.DataLength =1U;
 receive_InitStruct.Data = (uint8_t*) data;
 HAL_I2C_Master_Receive(&hi2c1, addr, data,1U,1000);
}

void iic_read_data(uint8_t addr, uint8_t* data, uint16_t len)
{
 // IIC读数据 HAL_I2C_Master_ReceiveTypeDef receive_InitStruct;
 receive_InitStruct.Address = addr;
 receive_InitStruct.DataLength = len;
 receive_InitStruct.Data = (uint8_t*) data;
 HAL_I2C_Master_Receive(&hi2c1, addr, data, len,1000);
}


#### OLED 驱动源码接下来,我们需要添加 OLED 驱动源码。我们可以从 OLED 的数据手册中找到相关的命令和函数。

OLED 驱动源码如下:

c#include "stm32f4xx_hal.h"
#include "iic_driver.h"

void oled_init(void)
{
 // OLED 初始化 iic_write_command(0x3C,0xAE);
}

void oled_clear_screen(void)
{
 // OLED 清屏 uint8_t data[16];
 for (int i =0; i < 16; i++)
 data[i] =0;
 iic_write_data(0x3C, data,16);
}

void oled_draw_pixel(int x, int y)
{
 // OLED 绘制像素 uint8_t data[16];
 for (int i =0; i < 16; i++)
 data[i] =0;
 if (x >=0 && x <=127 && y >=0 && y <=63)
 data[y *2 + x /8] |=1 << (x %8);
 iic_write_data(0x3C, data,16);
}

void oled_draw_line(int x1, int y1, int x2, int y2)
{
 // OLED 绘制线 if (x1 == x2) {
 for (int i = y1; i <= y2; i++)
 oled_draw_pixel(x1, i);
 } else if (y1 == y2) {
 for (int i = x1; i <= x2; i++)
 oled_draw_pixel(i, y1);
 }
}


#### 主函数最后,我们需要添加主函数。我们可以在主函数中初始化 IIC 驱动和 OLED 驱动,然后使用 OLED 驱动来绘制一些图形。

主函数如下:

cint main(void)
{
 // 初始化 IIC 驱动 iic_init();

 // 初始化 OLED 驱动 oled_init();

 // 绘制一些图形 oled_clear_screen();
 for (int i =0; i < 16; i++)
 oled_draw_pixel(i, i);

 while (1)
 ;
}


### 总结本文介绍了如何使用 STM32 的 HAL 库 IIC 驱动来控制一个 OLED 显示屏。我们首先初始化 IIC 驱动,然后初始化 OLED 驱动,最后使用 OLED 驱动来绘制一些图形。

IIC 驱动源码和 OLED 驱动源码都包含在本文中,可以直接复制到 STM32CubeIDE 中使用。

希望本文对您有所帮助。

其他信息

其他资源

Top