当前位置: 首页 > news >正文

【STM32 HAL库】OLED显示模块

【STM32 HAL库】OLED显示模块

  • 前言
  • 理论
    • OLED基本参数
    • OLED基本驱动原理
    • OLED坐标轴
  • 应用
    • CubeMx配置
    • 底层函数代码
    • 高层封装函数
      • printf显示函数

前言

本文为笔者学习 OLED 的总结,基于keysking的视频内容,如有错误,欢迎指正

理论

OLED基本参数

分辨率
在这里插入图片描述
常见的oled显示模块的分辨率为128*64,即横向128个像素点,纵向64个像素点

OLED基本驱动原理

在这里插入图片描述

OLED坐标轴

在这里插入图片描述

应用

CubeMx配置

在这里插入图片描述

底层函数代码

OLED驱动的底层函数代码通常由厂商提供,只需理解并调用相应函数即可
在这里我贴一下我使用的OLED_SSD1306驱动
,由keysking提供

高层封装函数

printf显示函数

/*** @brief 类似printf函数,在 OLED 指定行和列处打印格式化的字符串** @param line OLED 显示的行数(从 0行 开始),每行高度为 16 像素* @param column OLED 显示的列号(从 0列 开始),每列宽度为 8 像素* @param format 格式化字符串,必须加双引号,类似 `printf` 的入参格式。* @param ... 可变参数,用于替换 `format` 字符串中的占位符。** @note 该函数使用 `vsprintf` 进行字符串格式化,`buffer` 大小为 128 字节。`OLED_PrintString` 函数将最终的字符串显示在 OLED 上,使用 16x16 的字体和常规显示模式。*/
void OLED_printf(uint8_t line, uint8_t column, const char *format, ...)
{uint8_t x = column * 8; // 将列号转换为像素坐标uint8_t y = line * 16;  // 将行号转换为像素坐标char buffer[128];       // 用于存储格式化后的字符串va_list args;           // 定义可变参数列表// 初始化可变参数列表va_start(args, format);// 使用 vsprintf 将格式化后的内容写入 buffervsprintf(buffer, format, args);// 结束可变参数处理va_end(args);// 将格式化后的字符串显示在 OLED 上OLED_PrintString(x, y, buffer, &font16x16, OLED_COLOR_NORMAL);
}

接下来补充说明一下可变参数

... 为可变参数,... 本身并不是一种特定的类型,而是表示参数列表的可变性。允许在运行时接收任意数量和类型的参数,具体类型由传入的参数决定。
... 可接收任意数量和类型的参数,但参数与参数直接需用 , 分隔。
定义 argsva_list 类型(可变参数列表),用于存储任意数量和类型的可变参数。
va_start(args,format); 将可变参数列表 args 的开始索引指向 format 参数的下一位(下一位就是 ... 可变参数的原因与函数调用约定和栈布局有关,不用深究。
va_start(args, format); 初始化 args,将列表开始索引指向 format 参数的下一位,(表示这后续的参数都是 args
vsprintf(buffer, format, args); 先扫描 format 字符串并读取其占位符—>再读取 args 中的可变参数并填入占位符—>最后将格式化后的结果写入 buffer 字符串。
va_end(args); 用于结束可变参数处理,释放资源。为保证代码的可移植性和规范性,处理完可变参数后应调用。

http://www.lryc.cn/news/441426.html

相关文章:

  • Redis---卸载Redis
  • 《C++模板元编程实战》阅读记录
  • pybind11 学习笔记
  • 36.贪心算法3
  • htop(1) command
  • ODrive学习——添加485编码器支持
  • 在OSX上: 使用brew安装nginx 后,在通过编译安装第三方模块
  • C++初阶学习第六弹------标准库中的string类
  • Linux基础-Makefile的编写、以及编写第一个Linux程序:进度条(模拟在 方便下载的同时,更新图形化界面)
  • 华为云DevSecOps和DevOps
  • RESTful API设计中的GET与POST:何时及为何成为首选?
  • 秋招自我介绍
  • html加载页面
  • 【数据可视化】Arcgis api4.x 热力图、时间动态热力图、timeSlider时间滑块控件应用 (超详细、附免费教学数据、收藏!)
  • WEB攻防-JavaWweb项目JWT身份攻击组件安全访问控制
  • 【C++算法】模拟算法
  • 模版进阶(template)
  • vue2与vue3的区别
  • 借助大模型将文档转换为视频
  • UE5安卓项目打包安装
  • MSF的使用学习
  • C++ —— 关于vector
  • 设计模式——对象池模式
  • 【VitualBox】VitualBox的网络模式+网络配置
  • 「Netmarble 小镇」活动来了:踏上穿越标志性世界的旅程!
  • MySQL 中的索引覆盖扫描:加速查询的秘密武器
  • 【机器学习】经典数据集鸢尾花的分类识别
  • Oracle从入门到放弃
  • 学习笔记 - 知识图谱的符号表示方法
  • 探索RESTful风格的网络请求:构建高效、可维护的API接口【后端 20】