stm32hal库iic驱动oled屏幕源码
时间: 2023-06-16 14:08:29 浏览: 63
以下是使用STM32 HAL库驱动OLED屏幕的源代码。请注意,这只是一个基本的示例,可能需要根据您的硬件和要求进行修改。
```
#include "stm32xxxx.h"
#include "stm32xxxx_hal.h"
#define OLED_ADDR 0x78
I2C_HandleTypeDef hi2c;
void OLED_Init(void)
{
uint8_t init_cmds[] = {0xAE, 0xD5, 0x80, 0xA8, 0x3F, 0xD3, 0x00, 0x40, 0x8D, 0x14, 0x20, 0x00, 0xA0, 0xC8, 0xDA, 0x12, 0x81, 0xCF, 0xD9, 0xF1, 0xDB, 0x40, 0xA4, 0xA6, 0xAF};
uint8_t i;
for (i = 0; i < sizeof(init_cmds); i++)
{
HAL_I2C_Mem_Write(&hi2c, OLED_ADDR, 0x00, 1, &init_cmds[i], 1, 10);
}
}
void OLED_SetPos(uint8_t x, uint8_t y)
{
HAL_I2C_Mem_Write(&hi2c, OLED_ADDR, 0x00, 1, &x, 1, 10);
HAL_I2C_Mem_Write(&hi2c, OLED_ADDR, 0x00, 1, &y, 1, 10);
}
void OLED_WriteCmd(uint8_t cmd)
{
uint8_t buf[2] = {0x00, cmd};
HAL_I2C_Master_Transmit(&hi2c, OLED_ADDR, buf, 2, 10);
}
void OLED_WriteData(uint8_t data)
{
uint8_t buf[2] = {0x40, data};
HAL_I2C_Master_Transmit(&hi2c, OLED_ADDR, buf, 2, 10);
}
void OLED_Clear(void)
{
uint8_t i, j;
for (i = 0; i < 8; i++)
{
OLED_SetPos(i, 0);
for (j = 0; j < 128; j++)
{
OLED_WriteData(0x00);
}
}
}
void OLED_PutChar(uint8_t x, uint8_t y, uint8_t c)
{
uint8_t i, j, tmp;
tmp = c - ' ';
for (i = 0; i < 8; i++)
{
OLED_SetPos(x, y + i);
for (j = 0; j < 6; j++)
{
if ((Font6x8[tmp][j] >> i) & 0x01)
{
OLED_WriteData(0xff);
}
else
{
OLED_WriteData(0x00);
}
}
}
}
void OLED_PutString(uint8_t x, uint8_t y, uint8_t *str)
{
while (*str != '\0')
{
OLED_PutChar(x, y, *str++);
x += 6;
}
}
int main(void)
{
uint8_t buffer[2];
HAL_Init();
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
__HAL_RCC_I2C1_CLK_ENABLE();
GPIO_InitTypeDef gpio_init;
gpio_init.Pin = GPIO_PIN_6 | GPIO_PIN_7;
gpio_init.Mode = GPIO_MODE_AF_OD;
gpio_init.Pull = GPIO_PULLUP;
gpio_init.Speed = GPIO_SPEED_FREQ_HIGH;
gpio_init.Alternate = GPIO_AF4_I2C1;
HAL_GPIO_Init(GPIOB, &gpio_init);
hi2c.Instance = I2C1;
hi2c.Init.Timing = 0x10909CEC;
hi2c.Init.OwnAddress1 = 0;
hi2c.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
hi2c.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
hi2c.Init.OwnAddress2 = 0;
hi2c.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
hi2c.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
if (HAL_I2C_Init(&hi2c) != HAL_OK)
{
Error_Handler();
}
OLED_Init();
OLED_Clear();
OLED_PutString(0, 0, "Hello, World!");
while (1)
{
}
}
```
请注意,此示例假定您的OLED屏幕使用I2C接口,并且连接到STM32的I2C1端口。您需要根据您的硬件和要求进行修改。