由于OLED有很多显示函数所以我想用一个handler集合所有的函数,这样就可以方便看有哪些函数可以使用
Cisjy/STM32_driver (github.com)
i2c
其中的SYS_CLK是时钟频率
.h
#ifndef __I2C_C_H__
#define __I2C_C_H__
#include "delay.h"
#define SYS_CLK 72
#define I2C_WRITE 0
#define I2C_READ 1
#define I2C_ACK 0
#define I2C_NACK 1
typedef struct
{
GPIO_TypeDef *SCL_Port;
uint16_t SCL_Pin;
GPIO_TypeDef *SDA_Port;
uint16_t SDA_Pin;
} i2c_gpio_pin_t;
typedef struct
{
i2c_gpio_pin_t *i2c_gpio_pin;
void (*Init)(i2c_gpio_pin_t *i2c_gpio_pin);
void (*DeInit)(i2c_gpio_pin_t *i2c_gpio_pin);
void (*Start)(i2c_gpio_pin_t *i2c_gpio_pin);
void (*Stop)(i2c_gpio_pin_t *i2c_gpio_pin);
uint8_t (*WaitAck)(i2c_gpio_pin_t *i2c_gpio_pin);
void (*SendByte)(i2c_gpio_pin_t *i2c_gpio_pins, uint8_t Data);
uint8_t (*ReadByte)(i2c_gpio_pin_t *i2c_gpio_pin, uint8_t ack);
} i2c_driver_interface_t;
void I2C_Init(i2c_gpio_pin_t *gpio_pin);
void I2C_Start(i2c_gpio_pin_t *gpio_pin);
void I2C_Stop(i2c_gpio_pin_t *gpio_pin);
void I2C_SendByte(i2c_gpio_pin_t *gpio_pin, uint8_t data);
uint8_t I2C_ReadByte(i2c_gpio_pin_t *gpio_pin, uint8_t ack);
uint8_t I2C_WaitAck(i2c_gpio_pin_t *gpio_pin);
void I2C_Ack(i2c_gpio_pin_t *gpio_pin);
void I2C_Nack(i2c_gpio_pin_t *gpio_pin);
#endif /* __I2C_C_H */
.c
#include "i2c_c.h"
/**
* @brief: enable the clock of the specified GPIO port
* @param {GPIO_TypeDef} *GPIOx
* @return {*}
*/
void Enable_GPIO_Clock(GPIO_TypeDef *GPIOx)
{
if (GPIOx == GPIOA)
{
__HAL_RCC_GPIOA_CLK_ENABLE();
}
else if (GPIOx == GPIOB)
{
__HAL_RCC_GPIOB_CLK_ENABLE();
}
else if (GPIOx == GPIOC)
{
__HAL_RCC_GPIOC_CLK_ENABLE();
}
else if (GPIOx == GPIOD)
{
__HAL_RCC_GPIOD_CLK_ENABLE();
}
else if (GPIOx == GPIOE)
{
__HAL_RCC_GPIOE_CLK_ENABLE();
}
}
// #define I2C_W_SCL(x) HAL_GPIO_WritePin(I2C_GPIO_Port, I2C_SCL_Pin, (x) ? GPIO_PIN_SET : GPIO_PIN_RESET)
// #define I2C_W_SDA(x) HAL_GPIO_WritePin(I2C_GPIO_Port, I2C_SDA_Pin, (x) ? GPIO_PIN_SET : GPIO_PIN_RESET)
void I2C_W_SCL(i2c_gpio_pin_t *gpio_pin, uint8_t state)
{
state ? HAL_GPIO_WritePin(gpio_pin->SCL_Port, gpio_pin->SCL_Pin, GPIO_PIN_SET)
: HAL_GPIO_WritePin(gpio_pin->SCL_Port, gpio_pin->SCL_Pin, GPIO_PIN_RESET);
}
void I2C_W_SDA(i2c_gpio_pin_t *gpio_pin, uint8_t state)
{
state ? HAL_GPIO_WritePin(gpio_pin->SDA_Port, gpio_pin->SDA_Pin, GPIO_PIN_SET)
: HAL_GPIO_WritePin(gpio_pin->SDA_Port, gpio_pin->SDA_Pin, GPIO_PIN_RESET);
}
void I2C_Init(i2c_gpio_pin_t *gpio_pin)
{
Enable_GPIO_Clock(gpio_pin->SCL_Port);
Enable_GPIO_Clock(gpio_pin->SDA_Port);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.Pin = gpio_pin->SCL_Pin | gpio_pin->SDA_Pin;
GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_OD;
GPIO_InitStructure.Speed = GPIO_SPEED_MEDIUM;
HAL_GPIO_Init(gpio_pin->SCL_Port, &GPIO_InitStructure);
HAL_GPIO_Init(gpio_pin->SDA_Port, &GPIO_InitStructure);
delay_init(SYS_CLK);
I2C_W_SCL(gpio_pin, 1);
I2C_W_SDA(gpio_pin, 1);
}
void I2C_Start(i2c_gpio_pin_t *gpio_pin)
{
I2C_W_SDA(gpio_pin, 1);
I2C_W_SCL(gpio_pin, 1);
delay_us(2);
I2C_W_SDA(gpio_pin, 0);
delay_us(2);
I2C_W_SCL(gpio_pin, 0);
}
void I2C_Stop(i2c_gpio_pin_t *gpio_pin)
{
I2C_W_SDA(gpio_pin, 0);
delay_us(2);
I2C_W_SCL(gpio_pin, 1);
delay_us(2);
I2C_W_SDA(gpio_pin, 1);
}
void I2C_SendByte(i2c_gpio_pin_t *gpio_pin, uint8_t data)
{
uint8_t i;
for (i = 0; i < 8; i++)
{
I2C_W_SDA(gpio_pin, (data & 0x80) >> 7);
delay_us(2);
I2C_W_SCL(gpio_pin, 1);
delay_us(2);
I2C_W_SCL(gpio_pin, 0);
data <<= 1;
}
I2C_W_SDA(gpio_pin, 1);
}
uint8_t I2C_ReadByte(i2c_gpio_pin_t *gpio_pin, uint8_t ack)
{
uint8_t i, data = 0;
for (i = 0; i < 8; i++)
{
data <<= 1;
I2C_W_SCL(gpio_pin, 1);
delay_us(2);
if (GPIO_PIN_SET == HAL_GPIO_ReadPin(gpio_pin->SDA_Port, gpio_pin->SDA_Pin))
{
data++;
}
I2C_W_SCL(gpio_pin, 0);
delay_us(1);
}
if (I2C_ACK == ack)
{
I2C_Ack(gpio_pin);
}
else
{
I2C_Nack(gpio_pin);
}
return data;
}
/**
* @brief :
* @param {i2c_gpio_pin_t} *gpio_pin
* @return uint8_t 1:nack 0:ack
*/
uint8_t I2C_WaitAck(i2c_gpio_pin_t *gpio_pin)
{
uint8_t ack = 0;
I2C_W_SDA(gpio_pin, 1);
delay_us(2);
I2C_W_SCL(gpio_pin, 1);
delay_us(2);
if (GPIO_PIN_SET == HAL_GPIO_ReadPin(gpio_pin->SDA_Port, gpio_pin->SDA_Pin))
{
ack = 1;
}
I2C_W_SCL(gpio_pin, 0);
delay_us(2);
return ack;
}
/**
* @brief : i2c master send ack
* @param {i2c_gpio_pin_t} *gpio_pin
* @return {*}
*/
void I2C_Ack(i2c_gpio_pin_t *gpio_pin)
{
I2C_W_SDA(gpio_pin, 0);
I2C_W_SCL(gpio_pin, 1);
delay_us(2);
I2C_W_SCL(gpio_pin, 0);
I2C_W_SDA(gpio_pin, 1);
delay_us(2);
}
/**
* @brief : i2c master send nack
* @param {i2c_gpio_pin_t} *gpio_pin
* @return {*}
*/
void I2C_Nack(i2c_gpio_pin_t *gpio_pin)
{
I2C_W_SDA(gpio_pin, 1);
I2C_W_SCL(gpio_pin, 1);
delay_us(2);
I2C_W_SCL(gpio_pin, 0);
delay_us(2);
}
OLED
.h
#ifndef __OLED_H__
#define __OLED_H__
#include "i2c_c.h"
#define OLED_SLAVE_ADDR 0x3C // OLED原始地址
typedef struct oledHandleTypeDef oledHandleTypeDef;
struct oledHandleTypeDef
{
i2c_driver_interface_t *i2c_driver_interface;
void (*Clear)(oledHandleTypeDef *oled_handle);
/**
* @brief oled清除指定行
* @param {oledHandleTypeDef} *oled_handle
* @param {uint8_t} line 1~4
* @return {*}
*/
void (*ClearLine)(oledHandleTypeDef *oled_handle, uint8_t line);
/**
* @brief oled清除指定位置
* @param {oledHandleTypeDef} *oled_handle
* @param {uint8_t} line 1~4
* @param {uint8_t} column 1~16
* @return {*}
*/
void (*ClearPoint)(oledHandleTypeDef *oled_handle, uint8_t line, uint8_t column);
void (*ShowChar)(oledHandleTypeDef *oled_handle, uint8_t Line, uint8_t Column, char Char);
void (*ShowString)(oledHandleTypeDef *oled_handle, uint8_t Line, uint8_t Column, char *String);
void (*ShowNum)(oledHandleTypeDef *oled_handle, uint8_t Line, uint8_t Column, uint32_t Number, uint8_t Length);
void (*ShowSignedNum)(oledHandleTypeDef *oled_handle, uint8_t Line, uint8_t Column, int32_t Number, uint8_t Length);
void (*ShowHexNum)(oledHandleTypeDef *oled_handle, uint8_t Line, uint8_t Column, uint32_t Number, uint8_t Length);
void (*ShowBinNum)(oledHandleTypeDef *oled_handle, uint8_t Line, uint8_t Column, uint32_t Number, uint8_t Length);
};
uint8_t OLED_Init(oledHandleTypeDef *oled_handle,
i2c_driver_interface_t *i2c_driver_interface);
/*how to use----------------------------------------*/
/*
oledHandleTypeDef oled_handle;
i2c_driver_interface_t i2c_driver = {
.i2c_gpio_pin = &(i2c_gpio_pin_t){.SCL_Pin = GPIO_PIN_8,
.SCL_Port = GPIOB,
.SDA_Pin = GPIO_PIN_9,
.SDA_Port = GPIOB},
.Init = I2C_Init,
.Start = I2C_Start,
.Stop = I2C_Stop,
.WaitAck = I2C_WaitAck,
.SendByte = I2C_SendByte};
OLED_Init(&oled_handle, &i2c_driver);
*/
#endif
.c
#include "OLED_Font.h"
#include "OLED.h"
static void Init(oledHandleTypeDef *oled_handle);
static void Clear(oledHandleTypeDef *oled_handle);
static void ClearLine(oledHandleTypeDef *oled_handle, uint8_t line);
static void ClearPoint(oledHandleTypeDef *oled_handle, uint8_t line, uint8_t column);
static void ShowChar(oledHandleTypeDef *oled_handle, uint8_t Line, uint8_t Column, char Char);
static void ShowString(oledHandleTypeDef *oled_handle, uint8_t Line, uint8_t Column, char *String);
static void ShowNum(oledHandleTypeDef *oled_handle, uint8_t Line, uint8_t Column, uint32_t Number, uint8_t Length);
static void ShowSignedNum(oledHandleTypeDef *oled_handle, uint8_t Line, uint8_t Column, int32_t Number, uint8_t Length);
static void ShowHexNum(oledHandleTypeDef *oled_handle, uint8_t Line, uint8_t Column, uint32_t Number, uint8_t Length);
static void ShowBinNum(oledHandleTypeDef *oled_handle, uint8_t Line, uint8_t Column, uint32_t Number, uint8_t Length);
/**
* @brief :oled 写命令
* @param {oledHandleTypeDef} *oled_handle
* @param {uint8_t} Command
* @return {*}
*/
void OLED_WriteCommand(oledHandleTypeDef *oled_handle, uint8_t Command)
{
oled_handle->i2c_driver_interface->Start(oled_handle->i2c_driver_interface->i2c_gpio_pin);
oled_handle->i2c_driver_interface->SendByte(oled_handle->i2c_driver_interface->i2c_gpio_pin, OLED_SLAVE_ADDR << 1 | I2C_WRITE);
oled_handle->i2c_driver_interface->WaitAck(oled_handle->i2c_driver_interface->i2c_gpio_pin);
oled_handle->i2c_driver_interface->SendByte(oled_handle->i2c_driver_interface->i2c_gpio_pin, 0x00);
oled_handle->i2c_driver_interface->WaitAck(oled_handle->i2c_driver_interface->i2c_gpio_pin);
oled_handle->i2c_driver_interface->SendByte(oled_handle->i2c_driver_interface->i2c_gpio_pin, Command);
oled_handle->i2c_driver_interface->WaitAck(oled_handle->i2c_driver_interface->i2c_gpio_pin);
oled_handle->i2c_driver_interface->Stop(oled_handle->i2c_driver_interface->i2c_gpio_pin);
}
/**
* @brief OLED写数据
* @param Data 要写入的数据
* @retval 无
*/
void OLED_WriteData(oledHandleTypeDef *oled_handle, uint8_t Data)
{
oled_handle->i2c_driver_interface->Start(oled_handle->i2c_driver_interface->i2c_gpio_pin);
oled_handle->i2c_driver_interface->SendByte(oled_handle->i2c_driver_interface->i2c_gpio_pin, OLED_SLAVE_ADDR << 1 | I2C_WRITE); // 从机地址
oled_handle->i2c_driver_interface->WaitAck(oled_handle->i2c_driver_interface->i2c_gpio_pin);
oled_handle->i2c_driver_interface->SendByte(oled_handle->i2c_driver_interface->i2c_gpio_pin, 0x40); // 写数据
oled_handle->i2c_driver_interface->WaitAck(oled_handle->i2c_driver_interface->i2c_gpio_pin);
oled_handle->i2c_driver_interface->SendByte(oled_handle->i2c_driver_interface->i2c_gpio_pin, Data);
oled_handle->i2c_driver_interface->WaitAck(oled_handle->i2c_driver_interface->i2c_gpio_pin);
oled_handle->i2c_driver_interface->Stop(oled_handle->i2c_driver_interface->i2c_gpio_pin);
}
/**
* @brief OLED设置光标位置
* @param Y 以左上角为原点,向下方向的坐标,范围:0~7
* @param X 以左上角为原点,向右方向的坐标,范围:0~127
* @retval 无
*/
void OLED_SetCursor(oledHandleTypeDef *oled_handle, uint8_t Y, uint8_t X)
{
OLED_WriteCommand(oled_handle, 0xB0 | Y); // 设置Y位置
OLED_WriteCommand(oled_handle, 0x10 | ((X & 0xF0) >> 4)); // 设置X位置高4位
OLED_WriteCommand(oled_handle, 0x00 | (X & 0x0F)); // 设置X位置低4位
}
/**
* @brief OLED清屏
* @param 无
* @retval 无
*/
static void Clear(oledHandleTypeDef *oled_handle)
{
uint8_t i, j;
for (j = 0; j < 8; j++)
{
OLED_SetCursor(oled_handle, j, 0);
for (i = 0; i < 128; i++)
{
OLED_WriteData(oled_handle, 0x00);
}
}
}
/**
* @brief oled清除指定行
* @param {oledHandleTypeDef} *oled_handle
* @param {uint8_t} line 1~4
* @return {*}
*/
static void ClearLine(oledHandleTypeDef *oled_handle, uint8_t line)
{
uint8_t i, j;
uint8_t startPage = (line - 1) * 2; // Calculate the starting page based on the line number
for (j = 0; j < 2; j++)
{
OLED_SetCursor(oled_handle, startPage + j, 0); // Move to the correct page
for (i = 0; i < 128; i++)
{
OLED_WriteData(oled_handle, 0x00); // Clear the entire row
}
}
}
/**
* @brief oled清除指定点
* @param {oledHandleTypeDef} *oled_handle
* @param {uint8_t} line 1~4
* @param {uint8_t} column 列位置,范围:1~16
* @return {*}
*/
static void ClearPoint(oledHandleTypeDef *oled_handle, uint8_t line, uint8_t column)
{
uint8_t page = (line - 1) * 2;
uint8_t pos = (column - 1) * 8;
for (uint8_t i = 0; i < 2; i++)
{
OLED_SetCursor(oled_handle, page + i, pos);
for (uint8_t j = 0; j < 8; j++)
{
OLED_WriteData(oled_handle, 0x00);
}
}
}
/**
* @brief OLED显示一个字符
* @param Line 行位置,范围:1~4
* @param Column 列位置,范围:1~16
* @param Char 要显示的一个字符,范围:ASCII可见字符
* @retval 无
*/
static void ShowChar(oledHandleTypeDef *oled_handle, uint8_t Line, uint8_t Column, char Char)
{
uint8_t i;
OLED_SetCursor(oled_handle, (Line - 1) * 2, (Column - 1) * 8); // 设置光标位置在上半部分
for (i = 0; i < 8; i++)
{
OLED_WriteData(oled_handle, OLED_F8x16[Char - ' '][i]); // 显示上半部分内容
}
OLED_SetCursor(oled_handle, (Line - 1) * 2 + 1, (Column - 1) * 8); // 设置光标位置在下半部分
for (i = 0; i < 8; i++)
{
OLED_WriteData(oled_handle, OLED_F8x16[Char - ' '][i + 8]); // 显示下半部分内容
}
}
/**
* @brief OLED显示字符串
* @param Line 起始行位置,范围:1~4
* @param Column 起始列位置,范围:1~16
* @param String 要显示的字符串,范围:ASCII可见字符
* @retval 无
*/
static void ShowString(oledHandleTypeDef *oled_handle, uint8_t Line, uint8_t Column, char *String)
{
uint8_t i;
for (i = 0; String[i] != '\0'; i++)
{
ShowChar(oled_handle, Line, Column + i, String[i]);
}
}
/**
* @brief OLED次方函数
* @retval 返回值等于X的Y次方
*/
uint32_t OLED_Pow(uint32_t X, uint32_t Y)
{
uint32_t Result = 1;
while (Y--)
{
Result *= X;
}
return Result;
}
/**
* @brief OLED显示数字(十进制,正数)
* @param Line 起始行位置,范围:1~4
* @param Column 起始列位置,范围:1~16
* @param Number 要显示的数字,范围:0~4294967295
* @param Length 要显示数字的长度,范围:1~10
* @retval 无
*/
static void ShowNum(oledHandleTypeDef *oled_handle, uint8_t Line, uint8_t Column, uint32_t Number, uint8_t Length)
{
uint8_t i;
for (i = 0; i < Length; i++)
{
ShowChar(oled_handle, Line, Column + i, Number / OLED_Pow(10, Length - i - 1) % 10 + '0');
}
}
/**
* @brief OLED显示数字(十进制,带符号数)
* @param Line 起始行位置,范围:1~4
* @param Column 起始列位置,范围:1~16
* @param Number 要显示的数字,范围:-2147483648~2147483647
* @param Length 要显示数字的长度,范围:1~10
* @retval 无
*/
static void ShowSignedNum(oledHandleTypeDef *oled_handle, uint8_t Line, uint8_t Column, int32_t Number, uint8_t Length)
{
uint8_t i;
uint32_t Number1;
if (Number >= 0)
{
ShowChar(oled_handle, Line, Column, '+');
Number1 = Number;
}
else
{
ShowChar(oled_handle, Line, Column, '-');
Number1 = -Number;
}
for (i = 0; i < Length; i++)
{
ShowChar(oled_handle, Line, Column + i + 1, Number1 / OLED_Pow(10, Length - i - 1) % 10 + '0');
}
}
/**
* @brief OLED显示数字(十六进制,正数)
* @param Line 起始行位置,范围:1~4
* @param Column 起始列位置,范围:1~16
* @param Number 要显示的数字,范围:0~0xFFFFFFFF
* @param Length 要显示数字的长度,范围:1~8
* @retval 无
*/
static void ShowHexNum(oledHandleTypeDef *oled_handle, uint8_t Line, uint8_t Column, uint32_t Number, uint8_t Length)
{
uint8_t i, SingleNumber;
for (i = 0; i < Length; i++)
{
SingleNumber = Number / OLED_Pow(16, Length - i - 1) % 16;
if (SingleNumber < 10)
{
ShowChar(oled_handle, Line, Column + i, SingleNumber + '0');
}
else
{
ShowChar(oled_handle, Line, Column + i, SingleNumber - 10 + 'A');
}
}
}
/**
* @brief OLED显示数字(二进制,正数)
* @param Line 起始行位置,范围:1~4
* @param Column 起始列位置,范围:1~16
* @param Number 要显示的数字,范围:0~1111 1111 1111 1111
* @param Length 要显示数字的长度,范围:1~16
* @retval 无
*/
static void ShowBinNum(oledHandleTypeDef *oled_handle, uint8_t Line, uint8_t Column, uint32_t Number, uint8_t Length)
{
uint8_t i;
for (i = 0; i < Length; i++)
{
ShowChar(oled_handle, Line, Column + i, Number / OLED_Pow(2, Length - i - 1) % 2 + '0');
}
}
/**
* @brief OLED初始化
* @param 无
* @retval 无
*/
static void Init(oledHandleTypeDef *oled_handle)
{
uint32_t i, j;
for (i = 0; i < 1000; i++) // 上电延时
{
for (j = 0; j < 1000; j++)
;
}
oled_handle->i2c_driver_interface->Init(oled_handle->i2c_driver_interface->i2c_gpio_pin);
OLED_WriteCommand(oled_handle, 0xAE); // 关闭显示
OLED_WriteCommand(oled_handle, 0xD5); // 设置显示时钟分频比/振荡器频率
OLED_WriteCommand(oled_handle, 0x80);
OLED_WriteCommand(oled_handle, 0xA8); // 设置多路复用率
OLED_WriteCommand(oled_handle, 0x3F);
OLED_WriteCommand(oled_handle, 0xD3); // 设置显示偏移
OLED_WriteCommand(oled_handle, 0x00);
OLED_WriteCommand(oled_handle, 0x40); // 设置显示开始行
OLED_WriteCommand(oled_handle, 0xA1); // 设置左右方向,0xA1正常 0xA0左右反置
OLED_WriteCommand(oled_handle, 0xC8); // 设置上下方向,0xC8正常 0xC0上下反置
OLED_WriteCommand(oled_handle, 0xDA); // 设置COM引脚硬件配置
OLED_WriteCommand(oled_handle, 0x12);
OLED_WriteCommand(oled_handle, 0x81); // 设置对比度控制
OLED_WriteCommand(oled_handle, 0xCF);
OLED_WriteCommand(oled_handle, 0xD9); // 设置预充电周期
OLED_WriteCommand(oled_handle, 0xF1);
OLED_WriteCommand(oled_handle, 0xDB); // 设置VCOMH取消选择级别
OLED_WriteCommand(oled_handle, 0x30);
OLED_WriteCommand(oled_handle, 0xA4); // 设置整个显示打开/关闭
OLED_WriteCommand(oled_handle, 0xA6); // 设置正常/倒转显示
OLED_WriteCommand(oled_handle, 0x8D); // 设置充电泵
OLED_WriteCommand(oled_handle, 0x14);
OLED_WriteCommand(oled_handle, 0xAF); // 开启显示
Clear(oled_handle); // OLED清屏
}
/**
* @brief :
* @param {oledHandleTypeDef} *oled_handle
* @param {i2c_driver_interface_t} *i2c_driver_interface
* @return {*}
*/
uint8_t OLED_Init(oledHandleTypeDef *oled_handle,
i2c_driver_interface_t *i2c_driver_interface)
{
oled_handle->i2c_driver_interface = i2c_driver_interface;
oled_handle->Clear = Clear;
oled_handle->ClearLine = ClearLine;
oled_handle->ClearPoint = ClearPoint;
oled_handle->ShowChar = ShowChar;
oled_handle->ShowString = ShowString;
oled_handle->ShowNum = ShowNum;
oled_handle->ShowSignedNum = ShowSignedNum;
oled_handle->ShowHexNum = ShowHexNum;
oled_handle->ShowBinNum = ShowBinNum;
Init(oled_handle); // OLED内部初始化
return 0;
}
font.h
#ifndef __OLED_FONT_H
#define __OLED_FONT_H
#include "stm32f1xx_hal.h"
/*OLED字模库,宽8像素,高16像素*/
const uint8_t OLED_F8x16[][16]=
{
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,// 0
0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x33,0x30,0x00,0x00,0x00,//! 1
0x00,0x10,0x0C,0x06,0x10,0x0C,0x06,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//" 2
0x40,0xC0,0x78,0x40,0xC0,0x78,0x40,0x00,
0x04,0x3F,0x04,0x04,0x3F,0x04,0x04,0x00,//# 3
0x00,0x70,0x88,0xFC,0x08,0x30,0x00,0x00,
0x00,0x18,0x20,0xFF,0x21,0x1E,0x00,0x00,//$ 4
0xF0,0x08,0xF0,0x00,0xE0,0x18,0x00,0x00,
0x00,0x21,0x1C,0x03,0x1E,0x21,0x1E,0x00,//% 5
0x00,0xF0,0x08,0x88,0x70,0x00,0x00,0x00,
0x1E,0x21,0x23,0x24,0x19,0x27,0x21,0x10,//& 6
0x10,0x16,0x0E,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//' 7
0x00,0x00,0x00,0xE0,0x18,0x04,0x02,0x00,
0x00,0x00,0x00,0x07,0x18,0x20,0x40,0x00,//( 8
0x00,0x02,0x04,0x18,0xE0,0x00,0x00,0x00,
0x00,0x40,0x20,0x18,0x07,0x00,0x00,0x00,//) 9
0x40,0x40,0x80,0xF0,0x80,0x40,0x40,0x00,
0x02,0x02,0x01,0x0F,0x01,0x02,0x02,0x00,//* 10
0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0x00,
0x01,0x01,0x01,0x1F,0x01,0x01,0x01,0x00,//+ 11
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x80,0xB0,0x70,0x00,0x00,0x00,0x00,0x00,//, 12
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x01,//- 13
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x30,0x30,0x00,0x00,0x00,0x00,0x00,//. 14
0x00,0x00,0x00,0x00,0x80,0x60,0x18,0x04,
0x00,0x60,0x18,0x06,0x01,0x00,0x00,0x00,/// 15
0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,
0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,//0 16
0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,
0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//1 17
0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,
0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,//2 18
0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,
0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00,//3 19
0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,
0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00,//4 20
0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,
0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00,//5 21
0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,
0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00,//6 22
0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,
0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,//7 23
0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,
0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00,//8 24
0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,
0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00,//9 25
0x00,0x00,0x00,0xC0,0xC0,0x00,0x00,0x00,
0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,//: 26
0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,
0x00,0x00,0x80,0x60,0x00,0x00,0x00,0x00,//; 27
0x00,0x00,0x80,0x40,0x20,0x10,0x08,0x00,
0x00,0x01,0x02,0x04,0x08,0x10,0x20,0x00,//< 28
0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00,
0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x00,//= 29
0x00,0x08,0x10,0x20,0x40,0x80,0x00,0x00,
0x00,0x20,0x10,0x08,0x04,0x02,0x01,0x00,//> 30
0x00,0x70,0x48,0x08,0x08,0x08,0xF0,0x00,
0x00,0x00,0x00,0x30,0x36,0x01,0x00,0x00,//? 31
0xC0,0x30,0xC8,0x28,0xE8,0x10,0xE0,0x00,
0x07,0x18,0x27,0x24,0x23,0x14,0x0B,0x00,//@ 32
0x00,0x00,0xC0,0x38,0xE0,0x00,0x00,0x00,
0x20,0x3C,0x23,0x02,0x02,0x27,0x38,0x20,//A 33
0x08,0xF8,0x88,0x88,0x88,0x70,0x00,0x00,
0x20,0x3F,0x20,0x20,0x20,0x11,0x0E,0x00,//B 34
0xC0,0x30,0x08,0x08,0x08,0x08,0x38,0x00,
0x07,0x18,0x20,0x20,0x20,0x10,0x08,0x00,//C 35
0x08,0xF8,0x08,0x08,0x08,0x10,0xE0,0x00,
0x20,0x3F,0x20,0x20,0x20,0x10,0x0F,0x00,//D 36
0x08,0xF8,0x88,0x88,0xE8,0x08,0x10,0x00,
0x20,0x3F,0x20,0x20,0x23,0x20,0x18,0x00,//E 37
0x08,0xF8,0x88,0x88,0xE8,0x08,0x10,0x00,
0x20,0x3F,0x20,0x00,0x03,0x00,0x00,0x00,//F 38
0xC0,0x30,0x08,0x08,0x08,0x38,0x00,0x00,
0x07,0x18,0x20,0x20,0x22,0x1E,0x02,0x00,//G 39
0x08,0xF8,0x08,0x00,0x00,0x08,0xF8,0x08,
0x20,0x3F,0x21,0x01,0x01,0x21,0x3F,0x20,//H 40
0x00,0x08,0x08,0xF8,0x08,0x08,0x00,0x00,
0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//I 41
0x00,0x00,0x08,0x08,0xF8,0x08,0x08,0x00,
0xC0,0x80,0x80,0x80,0x7F,0x00,0x00,0x00,//J 42
0x08,0xF8,0x88,0xC0,0x28,0x18,0x08,0x00,
0x20,0x3F,0x20,0x01,0x26,0x38,0x20,0x00,//K 43
0x08,0xF8,0x08,0x00,0x00,0x00,0x00,0x00,
0x20,0x3F,0x20,0x20,0x20,0x20,0x30,0x00,//L 44
0x08,0xF8,0xF8,0x00,0xF8,0xF8,0x08,0x00,
0x20,0x3F,0x00,0x3F,0x00,0x3F,0x20,0x00,//M 45
0x08,0xF8,0x30,0xC0,0x00,0x08,0xF8,0x08,
0x20,0x3F,0x20,0x00,0x07,0x18,0x3F,0x00,//N 46
0xE0,0x10,0x08,0x08,0x08,0x10,0xE0,0x00,
0x0F,0x10,0x20,0x20,0x20,0x10,0x0F,0x00,//O 47
0x08,0xF8,0x08,0x08,0x08,0x08,0xF0,0x00,
0x20,0x3F,0x21,0x01,0x01,0x01,0x00,0x00,//P 48
0xE0,0x10,0x08,0x08,0x08,0x10,0xE0,0x00,
0x0F,0x18,0x24,0x24,0x38,0x50,0x4F,0x00,//Q 49
0x08,0xF8,0x88,0x88,0x88,0x88,0x70,0x00,
0x20,0x3F,0x20,0x00,0x03,0x0C,0x30,0x20,//R 50
0x00,0x70,0x88,0x08,0x08,0x08,0x38,0x00,
0x00,0x38,0x20,0x21,0x21,0x22,0x1C,0x00,//S 51
0x18,0x08,0x08,0xF8,0x08,0x08,0x18,0x00,
0x00,0x00,0x20,0x3F,0x20,0x00,0x00,0x00,//T 52
0x08,0xF8,0x08,0x00,0x00,0x08,0xF8,0x08,
0x00,0x1F,0x20,0x20,0x20,0x20,0x1F,0x00,//U 53
0x08,0x78,0x88,0x00,0x00,0xC8,0x38,0x08,
0x00,0x00,0x07,0x38,0x0E,0x01,0x00,0x00,//V 54
0xF8,0x08,0x00,0xF8,0x00,0x08,0xF8,0x00,
0x03,0x3C,0x07,0x00,0x07,0x3C,0x03,0x00,//W 55
0x08,0x18,0x68,0x80,0x80,0x68,0x18,0x08,
0x20,0x30,0x2C,0x03,0x03,0x2C,0x30,0x20,//X 56
0x08,0x38,0xC8,0x00,0xC8,0x38,0x08,0x00,
0x00,0x00,0x20,0x3F,0x20,0x00,0x00,0x00,//Y 57
0x10,0x08,0x08,0x08,0xC8,0x38,0x08,0x00,
0x20,0x38,0x26,0x21,0x20,0x20,0x18,0x00,//Z 58
0x00,0x00,0x00,0xFE,0x02,0x02,0x02,0x00,
0x00,0x00,0x00,0x7F,0x40,0x40,0x40,0x00,//[ 59
0x00,0x0C,0x30,0xC0,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x01,0x06,0x38,0xC0,0x00,//\ 60
0x00,0x02,0x02,0x02,0xFE,0x00,0x00,0x00,
0x00,0x40,0x40,0x40,0x7F,0x00,0x00,0x00,//] 61
0x00,0x00,0x04,0x02,0x02,0x02,0x04,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//^ 62
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,//_ 63
0x00,0x02,0x02,0x04,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//` 64
0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,
0x00,0x19,0x24,0x22,0x22,0x22,0x3F,0x20,//a 65
0x08,0xF8,0x00,0x80,0x80,0x00,0x00,0x00,
0x00,0x3F,0x11,0x20,0x20,0x11,0x0E,0x00,//b 66
0x00,0x00,0x00,0x80,0x80,0x80,0x00,0x00,
0x00,0x0E,0x11,0x20,0x20,0x20,0x11,0x00,//c 67
0x00,0x00,0x00,0x80,0x80,0x88,0xF8,0x00,
0x00,0x0E,0x11,0x20,0x20,0x10,0x3F,0x20,//d 68
0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,
0x00,0x1F,0x22,0x22,0x22,0x22,0x13,0x00,//e 69
0x00,0x80,0x80,0xF0,0x88,0x88,0x88,0x18,
0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//f 70
0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x00,
0x00,0x6B,0x94,0x94,0x94,0x93,0x60,0x00,//g 71
0x08,0xF8,0x00,0x80,0x80,0x80,0x00,0x00,
0x20,0x3F,0x21,0x00,0x00,0x20,0x3F,0x20,//h 72
0x00,0x80,0x98,0x98,0x00,0x00,0x00,0x00,
0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//i 73
0x00,0x00,0x00,0x80,0x98,0x98,0x00,0x00,
0x00,0xC0,0x80,0x80,0x80,0x7F,0x00,0x00,//j 74
0x08,0xF8,0x00,0x00,0x80,0x80,0x80,0x00,
0x20,0x3F,0x24,0x02,0x2D,0x30,0x20,0x00,//k 75
0x00,0x08,0x08,0xF8,0x00,0x00,0x00,0x00,
0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//l 76
0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00,
0x20,0x3F,0x20,0x00,0x3F,0x20,0x00,0x3F,//m 77
0x80,0x80,0x00,0x80,0x80,0x80,0x00,0x00,
0x20,0x3F,0x21,0x00,0x00,0x20,0x3F,0x20,//n 78
0x00,0x00,0x80,0x80,0x80,0x80,0x00,0x00,
0x00,0x1F,0x20,0x20,0x20,0x20,0x1F,0x00,//o 79
0x80,0x80,0x00,0x80,0x80,0x00,0x00,0x00,
0x80,0xFF,0xA1,0x20,0x20,0x11,0x0E,0x00,//p 80
0x00,0x00,0x00,0x80,0x80,0x80,0x80,0x00,
0x00,0x0E,0x11,0x20,0x20,0xA0,0xFF,0x80,//q 81
0x80,0x80,0x80,0x00,0x80,0x80,0x80,0x00,
0x20,0x20,0x3F,0x21,0x20,0x00,0x01,0x00,//r 82
0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x00,
0x00,0x33,0x24,0x24,0x24,0x24,0x19,0x00,//s 83
0x00,0x80,0x80,0xE0,0x80,0x80,0x00,0x00,
0x00,0x00,0x00,0x1F,0x20,0x20,0x00,0x00,//t 84
0x80,0x80,0x00,0x00,0x00,0x80,0x80,0x00,
0x00,0x1F,0x20,0x20,0x20,0x10,0x3F,0x20,//u 85
0x80,0x80,0x80,0x00,0x00,0x80,0x80,0x80,
0x00,0x01,0x0E,0x30,0x08,0x06,0x01,0x00,//v 86
0x80,0x80,0x00,0x80,0x00,0x80,0x80,0x80,
0x0F,0x30,0x0C,0x03,0x0C,0x30,0x0F,0x00,//w 87
0x00,0x80,0x80,0x00,0x80,0x80,0x80,0x00,
0x00,0x20,0x31,0x2E,0x0E,0x31,0x20,0x00,//x 88
0x80,0x80,0x80,0x00,0x00,0x80,0x80,0x80,
0x80,0x81,0x8E,0x70,0x18,0x06,0x01,0x00,//y 89
0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x00,
0x00,0x21,0x30,0x2C,0x22,0x21,0x30,0x00,//z 90
0x00,0x00,0x00,0x00,0x80,0x7C,0x02,0x02,
0x00,0x00,0x00,0x00,0x00,0x3F,0x40,0x40,//{ 91
0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,//| 92
0x00,0x02,0x02,0x7C,0x80,0x00,0x00,0x00,
0x00,0x40,0x40,0x3F,0x00,0x00,0x00,0x00,//} 93
0x00,0x06,0x01,0x01,0x02,0x02,0x04,0x04,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//~ 94
};
#endif
使用
oledHandleTypeDef oled_handle;
i2c_driver_interface_t i2c_driver = {
.i2c_gpio_pin = &(i2c_gpio_pin_t){.SCL_Pin = GPIO_PIN_8,
.SCL_Port = GPIOB,
.SDA_Pin = GPIO_PIN_9,
.SDA_Port = GPIOB},
.Init = I2C_Init,
.Start = I2C_Start,
.Stop = I2C_Stop,
.WaitAck = I2C_WaitAck,
.SendByte = I2C_SendByte};
OLED_Init(&oled_handle, &i2c_driver);
void StartTask03(void const *argument)
{
for (;;)
{
// oled_display(&oled_page);
oled_handle.Clear(&oled_handle);
oled_handle.ShowString(&oled_handle, 1, 1, "Hello World!");
oled_handle.ShowChar(&oled_handle, 2, 1, 'H');
oled_handle.ShowSignedNum(&oled_handle, 3, 1, -123, 4);
oled_handle.ShowNum(&oled_handle, 4, 1, 123456789, 9);
osDelay(4000);
}
}