1、前言
作为嵌入式软件开发,可能经常会使用单片机连接驱动显示屏,实现人机交互的功能,通常可选择的有 OLED 和 LCD 等,其中相关驱动代码例程网上更是数不胜数。
本文介绍的是 OLED, 常见代表有 0.96 寸的OLED,网上也有很多相关的驱动代码,但是大部分代码都是能用即可,不是特别关注驱动代码的整体架构,以下是个人整理的 OLED 驱动代码,支持配置 SPI 和 IIC 两种接口方式(目前只是测试了 SPI,IIC 有待验证)。
2、介绍
基于 stm32 的 0.96寸 OLED 驱动架构模块代码,代码主要特点是:
- 底层接口配置方便(SPI 和 IIC 可选)
- 字体大小等配置采用表驱动模式,添加/修改/删除方便快捷,支持中英文混合输入显示 (中文编码 GB2312)
- 支持浮点型数据显示
- OLED 采用双缓冲机制,实现 OLED 的画面操作和显示功能分离,降低画面操作相关函数的耗时
- 仿照函数 printf,实现格式化输出,支持窗口 printf 功能(支持回车换行操作),实现滚动式输出(窗口大小、字体可配置)
- 代码注释丰富,风格统一,便于阅读和使用
- ...
3、代码功能
源文件部分代码如下:
/** 字体大小配置表 */
static LCD_FontCfgType sg_tFontCfgTable[FONT_MAX_NUM] =
{
{12, 12, ASCII_6X12_DATA, FONT_12X12_IDX, FONT_12X12_DATA},
{16, 16, ASCII_8X16_DATA, FONT_16X16_IDX, FONT_16X16_DATA},
{24, 24, ASCII_12X24_DATA, FONT_24X24_IDX, FONT_24X24_DATA},
{32, 32, ASCII_16X32_DATA, FONT_32X32_IDX, FONT_32X32_DATA},
};
头文件部分代码如下:
/* OLED 初始化函数 ****************************************************************************************************/
extern void OLED_Init(void);
/* OLED 控制函数 ******************************************************************************************************/
extern void OLED_DisplayOn(void);
extern void OLED_DisplayOff(void);
/* 画点/读点函数 ******************************************************************************************************/
extern void OLED_DrawPoint(oledsize_t x, oledsize_t y, eOledcolor color);
extern void OLED_DrawRoughPoint(oledsize_t x, oledsize_t y, eOledcolor color, uint8_t size);
extern eOledcolor OLED_ReadPoint(oledsize_t x, oledsize_t y);
/* OLED 清屏函数 ******************************************************************************************************/
extern void OLED_Clear(uint8_t color);
extern void OLED_SetFill(oledsize_t sx, oledsize_t sy, oledsize_t width, oledsize_t high, eOledcolor color);
/* 画面操作函数 *******************************************************************************************************/
extern void OLED_SyncScreen(oledsize_t sx, oledsize_t sy, oledsize_t width, oledsize_t high);
extern void OLED_ShowTask(void);
extern void OLED_SetScreenOffset(oledsize_t x, oledsize_t y, oledsize_t width, oledsize_t high, uint8_t dir, uint8_t pixels);
/* 画图形函数 *********************************************************************************************************/
extern void OLED_DrawLine(oledsize_t sx, oledsize_t sy, oledsize_t width, oledsize_t high, uint8_t size);
extern void OLED_DrawRectangle(oledsize_t sx, oledsize_t sy, oledsize_t width, oledsize_t high, uint8_t size);
extern void OLED_DrawCircle(oledsize_t x, oledsize_t y, oledsize_t radius, uint8_t size);
/* 设置文本/数字函数 **************************************************************************************************/
extern void OLED_SetColor(eOledcolor backColor, eOledcolor pointColor);
extern void OLED_SetText(oledsize_t x, oledsize_t y, const char *pszStr, uint8_t isMultiLine, efontSize size);
extern void OLED_SetIntegerNum(oledsize_t x, oledsize_t y, int32_t num, uint8_t len, uint8_t zero, efontSize size);
extern void OLED_SetFloatNum(oledsize_t x, oledsize_t y, float num, uint8_t intLen, uint8_t decLen, uint8_t zero, efontSize size);
/* 格式化输出函数 *****************************************************************************************************/
extern void OLED_XYPrintf(oledsize_t x, oledsize_t y, uint8_t isMultiLine, efontSize size, const char *format, ...);
extern void OLED_Printf(const char *format, ...);
4、示例代码显示效果
其中 printf 输出采用了右侧半个屏幕进行刷新,滚动式打印内容。
1、前言
作为嵌入式软件开发,可能经常会使用单片机连接驱动显示屏,实现人机交互的功能,通常可选择的有 OLED 和 LCD 等,其中相关驱动代码例程网上更是数不胜数。
本文介绍的是 OLED, 常见代表有 0.96 寸的OLED,网上也有很多相关的驱动代码,但是大部分代码都是能用即可,不是特别关注驱动代码的整体架构,以下是个人整理的 OLED 驱动代码,支持配置 SPI 和 IIC 两种接口方式(目前只是测试了 SPI,IIC 有待验证)。
2、介绍
基于 stm32 的 0.96寸 OLED 驱动架构模块代码,代码主要特点是:
- 底层接口配置方便(SPI 和 IIC 可选)
- 字体大小等配置采用表驱动模式,添加/修改/删除方便快捷,支持中英文混合输入显示 (中文编码 GB2312)
- 支持浮点型数据显示
- OLED 采用双缓冲机制,实现 OLED 的画面操作和显示功能分离,降低画面操作相关函数的耗时
- 仿照函数 printf,实现格式化输出,支持窗口 printf 功能(支持回车换行操作),实现滚动式输出(窗口大小、字体可配置)
- 代码注释丰富,风格统一,便于阅读和使用
- ...
3、代码功能
源文件部分代码如下:
/** 字体大小配置表 */
static LCD_FontCfgType sg_tFontCfgTable[FONT_MAX_NUM] =
{
{12, 12, ASCII_6X12_DATA, FONT_12X12_IDX, FONT_12X12_DATA},
{16, 16, ASCII_8X16_DATA, FONT_16X16_IDX, FONT_16X16_DATA},
{24, 24, ASCII_12X24_DATA, FONT_24X24_IDX, FONT_24X24_DATA},
{32, 32, ASCII_16X32_DATA, FONT_32X32_IDX, FONT_32X32_DATA},
};
头文件部分代码如下:
/* OLED 初始化函数 ****************************************************************************************************/
extern void OLED_Init(void);
/* OLED 控制函数 ******************************************************************************************************/
extern void OLED_DisplayOn(void);
extern void OLED_DisplayOff(void);
/* 画点/读点函数 ******************************************************************************************************/
extern void OLED_DrawPoint(oledsize_t x, oledsize_t y, eOledcolor color);
extern void OLED_DrawRoughPoint(oledsize_t x, oledsize_t y, eOledcolor color, uint8_t size);
extern eOledcolor OLED_ReadPoint(oledsize_t x, oledsize_t y);
/* OLED 清屏函数 ******************************************************************************************************/
extern void OLED_Clear(uint8_t color);
extern void OLED_SetFill(oledsize_t sx, oledsize_t sy, oledsize_t width, oledsize_t high, eOledcolor color);
/* 画面操作函数 *******************************************************************************************************/
extern void OLED_SyncScreen(oledsize_t sx, oledsize_t sy, oledsize_t width, oledsize_t high);
extern void OLED_ShowTask(void);
extern void OLED_SetScreenOffset(oledsize_t x, oledsize_t y, oledsize_t width, oledsize_t high, uint8_t dir, uint8_t pixels);
/* 画图形函数 *********************************************************************************************************/
extern void OLED_DrawLine(oledsize_t sx, oledsize_t sy, oledsize_t width, oledsize_t high, uint8_t size);
extern void OLED_DrawRectangle(oledsize_t sx, oledsize_t sy, oledsize_t width, oledsize_t high, uint8_t size);
extern void OLED_DrawCircle(oledsize_t x, oledsize_t y, oledsize_t radius, uint8_t size);
/* 设置文本/数字函数 **************************************************************************************************/
extern void OLED_SetColor(eOledcolor backColor, eOledcolor pointColor);
extern void OLED_SetText(oledsize_t x, oledsize_t y, const char *pszStr, uint8_t isMultiLine, efontSize size);
extern void OLED_SetIntegerNum(oledsize_t x, oledsize_t y, int32_t num, uint8_t len, uint8_t zero, efontSize size);
extern void OLED_SetFloatNum(oledsize_t x, oledsize_t y, float num, uint8_t intLen, uint8_t decLen, uint8_t zero, efontSize size);
/* 格式化输出函数 *****************************************************************************************************/
extern void OLED_XYPrintf(oledsize_t x, oledsize_t y, uint8_t isMultiLine, efontSize size, const char *format, ...);
extern void OLED_Printf(const char *format, ...);
4、示例代码显示效果
其中 printf 输出采用了右侧半个屏幕进行刷新,滚动式打印内容。
举报