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

【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 将格式化后的内容写入 buffer
    vsprintf(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.kler.cn/a/320447.html

相关文章:

  • 机器学习(西瓜书)-BP神经网络实现
  • Java-异步方法@Async+自定义分布式锁注解Redission例子
  • H.265流媒体播放器EasyPlayer.js视频流媒体播放器关于直播流播放完毕是否能监听到
  • 如何在MindMaster思维导图中制作PPT课件?
  • Restful API接⼝简介及为什么要进⾏接⼝压测
  • 面试经典 150 题:20、2、228、122
  • 【RabbitMQ 项目】服务端:路由交换模块
  • 详解HTTP/HTTPS协议
  • Centos7.9在K8s安装生产级别的分布式存储Rook+Ceph
  • 微深节能 堆取料机动作综合检测系统 格雷母线
  • nginx模块篇(四)
  • Tomcat后台弱口令部署war包
  • 深度学习电脑独显GPU占用一直0%解决方式
  • 任务管理与守护进程【Linux】
  • Git 分支管理全攻略:一篇博客带你玩转代码分支!
  • Redis缓存技术 基础第一篇(快速入门与安装部署)
  • 获取 Jupyter Notebook IPython kernel 在电脑中的目录位置
  • Linux CentsOS定时删除一个目录下(包含子目录)的改动时间大于12小时的文件
  • SQL Server 2022的数据类型
  • Educational Codeforces Round 21 G. Anthem of Berland(DP+KMP)
  • 简易STL实现 | Set 的实现
  • python sqlite3数据库介绍(如何使用参数化查询防止SQL注入攻击)(直接通过网络让其他主机访问某台主机上的SQLite数据库是不被直接支持的)
  • vscode 配置django
  • 成都睿明智科技有限公司赋能商家高效变现
  • 从零开始的软件开发详解:数字药店系统源码与医保购药APP
  • 替换jar包中class文件