OLED(2)驱动篇

news2024/11/14 10:55:28

文章目录

    • 1 概述
    • 2 代码简述
      • 2.1 OLED 对象
      • 2.2 OLEDProtocol 对象
      • 2.3 OLEDFont 对象
    • 3 成果展示

1 概述

  • 1)代码仓库:这里尝试了两种面向对象的方式,不足之处敬请指正。

    • OOP 方式:https://gitee.com/luyaocf/demo-jlc_stm32f407_oop.git
    • Class In C:https://gitee.com/luyaocf/demo-jlc_stm32f407_cic.git

    本文主要以 Class In C 的方式记录,虽然它占用 RAM 高,但它更像 OOP。

  • 2)OLED 要显示中文汉字,有以下几点:

    • (1)首先是 OLED 的显示驱动,如 OLED 屏幕初始化,设置显示位置,数据写入方式等

    • (2)然后是通信协议,如采用 SPI 或 I2C,使用软件模拟简单,使用硬件实现更快。

    • (3)字库,一般汉字达到可辨认的最小规格应该为 16x16 像素,而就算最小支持的 GB2312 编码的也有几千个汉字,几百 KB 大小点阵数据,一般我们使用片外存储器件,如 w25qxx。(如果只是显示固定的几个汉字,那么存储到片上 FLASH 即可。)

    • (4)编码,汉字是有编码的,如果你的源文件编码为 UTF-8,而使用的字库为 GBK 的,两者没有转换关系,只能通过映射表来转换。(Linux 下有 iconv 库,单片机没那么富裕的空间,当然也可以像我一样同时生成 GBK 与 Unicode 字库,那么源文件编码无论是 UTF-8 或 GBK 都可以简单使用)

附录:点阵字库大小

2 代码简述

2.1 OLED 对象

  • 1)我们创建一个 OLED 对象,其内部持有两个对象的指针:
    • OLEDProtocol 对象:用来实现写点阵数据的协议;
    • OLEDFont 对象:用来根据汉字获取点阵字库。

另外,OLED 对象通过 size 来指定显示汉字大小;通过 mode 来配置汉字阴显或阳显;还具有很多函数,用来初始化、显示数字、字符串、清屏、画点等功能。

  • 2)显存缓冲区

这里我们建立一个显存缓冲区,与 OLED 内部显存对应起来,有两个目的:首先可以方便地获取当前显示的数据;其次通过一次刷新整个屏幕来避免频繁写入。

/**
 * Physically, OLED Graphic bits is [128][64](x * y).
 * Logically, OLED Graphic Memory is 8 * 128(page * segment). 128 * 8 is okay, except that it's
 * not convenient to display.
 */
uint8_t OLED_GRAPHIC_MEMORY[8][128];
  • 3)OLED 功能函数如下:
void (*init)   (OLED *this);
void (*clear)  (OLED *this);
void (*full)   (OLED *this);
void (*refresh)(OLED *this);

uint8_t (*showChar)    (OLED *this, uint8_t x, uint8_t y, char chr);
void (*showString)     (OLED *this, uint8_t x, uint8_t y, char *str);
void (*showNum)        (OLED *this, uint8_t x, uint8_t y, uint32_t num, uint8_t len);
void (*showSignedNum)  (OLED *this, uint8_t x, uint8_t y, int32_t num, uint8_t len);
void (*showHexNum)     (OLED *this, uint8_t x, uint8_t y, uint32_t num, uint8_t len);
void (*showBinNum)     (OLED *this, uint8_t x, uint8_t y, uint32_t num, uint8_t len);
void (*showFloatNum)   (OLED *this, uint8_t x, uint8_t y, float num, uint8_t len);
uint8_t (*showChinese) (OLED *this, uint8_t x, uint8_t y, char *cn);
void (*showImage)      (OLED *this, uint8_t x, uint8_t y, uint8_t width, uint8_t height, const uint8_t *dotMatrix);
void (*printf)         (OLED *this, uint8_t x, uint8_t y, char *format, ...);

void (*drawPoint)      (uint8_t x, uint8_t y, uint8_t point);

2.2 OLEDProtocol 对象

  • 1)OLEDProtocol 是一个抽象类,由 OLED 支持的各种协议实现类继承:
    • OLEDProtocolI2C 类:通过 I2C 协议读写 OLED 数据
    • OLEDProtocolSPI 类:通过 SPI 协议读写 OLED 数据
    • 还可以通过 OLEDProtocol6800、OLEDProtocol8080 协议实现类自行扩展。

  • 2)以 OLEDProtocolI2C 对象为例:
    • (1)继承 OLEDProtocol 类,需要实现父类的 write_byte() 函数
    • (2)持有一个 I2C 对象,而这个 I2C 对象可以是实现模拟 I2C 协议的 I2CSimulate 类,也可以是实现硬件 I2C 协议的 I2CHardware 类
    • (3)OLEDProtocolI2C 不用关心底层的 I2C 实现,它只要调用父类 I2C 的 send()、read() 函数来读写数据即可。

2.3 OLEDFont 对象

  • 1)OLEDFont 不是抽象类,但它持有了抽象类 Storage 的指针。Storage 是存储抽象类,由各种可存储的各种外设设备类继承:
    • StorageFlash 类:可以理解为片上 FLASH,适用于小规模的点阵字库存储,如 ASCII 码的点阵数据。
    • W25Qxx 类:典型的如 W25Q64 8MB FLASH,已经可以满足大多数显示的需求
    • 还可以自行扩展 SDCardStorage 类,用来实现 SDCard 的字库数据存储。

  • 2)OLEDFont 调用抽象类 Storage 的 read() 函数来获取点阵,各个实现 Storage 类的存储设备各自实现 read() 函数来提供点阵数据。

  • 3)另一点值得一提的是,OLEDFont 需要指定编码(UTF-8、GB2312、GBK):

    • (1)UTF-8 编码:UTF-8 是编码方式不是字符集,需要首先转换为 Unicode 字符集编码,然后我们根据字符编码以及字库基地址计算出该汉字的存储位置,最后到存储设备对应的位置读取点阵数据
    • (2)GB2312 编码和 GBK 编码:这两者既是编码又是字符集,所以直接计算点阵数据位置即可。(由于 GBK 没有完全兼容 GB2312,所以这里我分开处理,实际使用中根据显示要求择一即可。)
    • (3)ASCII 编码:判断当前字符小于 0x7F 单独处理即可。

3 成果展示

  • 这里以嘉立创天空星 STM32F407 开发板为基础,因为它带有 SDCard 槽,可以方便地将自己制作的字库复制到板上的 W25Q64 中去(字库的制作及复制见下一章)。

下方图片使用 UTF-8 编码,可以看到 ASCII、汉字(包括 12、16、24 尺寸,以及正反显示)、图片都正常显示。

下方图片使用 GBK 编码测试字库,平均选择了 GBK 编码的几个区。第一行字体尺寸为 12x12 像素,有的字已经模糊得无法辨认了;第二行为 16x16 像素,显示效果刚刚好;第三行字体尺寸为 24x24 像素,清晰但不美观;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2161005.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【逐行注释】扩展卡尔曼滤波EKF和粒子滤波PF的效果对比,MATLAB源代码(无需下载,可直接复制)

文章目录 总述源代码运行结果改进方向总述 本代码使用 M A T L A B MATLAB MATL</

2024最新金九银十必问面试题大全

我花了三天时间&#xff0c;整理了100道最经典的常见测试面试题&#xff08;附答案&#xff09;&#xff01;完整版文档见文末&#xff01; 1、所做项目的情况&#xff0c;主要做什么类型的测试&#xff1f; 2、你在测试中发现了一个bug&#xff0c;但是开发经理认为这不是一…

基于yolov5的中国交通标志TT100K检测系统python源码+onnx模型+评估指标曲线+精美GUI界面

【算法介绍】 基于YOLOv5的中国交通标志TT100K检测系统是一种利用深度学习技术实现高效、准确交通标志识别的系统。该系统采用YOLOv5作为核心检测算法&#xff0c;凭借其速度快、准确性高的特点&#xff0c;在实时交通标志识别领域展现出显著优势。 TT100K数据集作为该系统的…

【学术会议征稿】2024年先进控制系统与自动化技术国际学术会议(ACSAT 2024)

2024年先进控制系统与自动化技术国际学术会议&#xff08;ACSAT 2024&#xff09; 2024 International Conference on Advanced Control Systems and Automation Technologies 2024年先进控制系统与自动化技术国际学术会议&#xff08;ACSAT 2024&#xff09;将于2024年11月15…

大模型推理革新:探索思维图(DoT)框架的逻辑与应用

姚期智院士领衔推出了大模型新推理框架&#xff0c;CoT的“王冠”已难以承载。 提出了思维图&#xff08;Diagram of Thought&#xff0c;DoT&#xff09;&#xff0c;使大模型的思考方式更接近人类。 团队为这一推理过程提供了数学基础&#xff0c;通过拓扑斯理论&#xff0…

【Finetune】(六)、transformers之IA-3微调

文章目录 0、IA-3基本原理1、IA-3微调实战1.1、导包1.2、加载数据集1.3、数据预处理1.4、创建模型1.5、LORA微调1.5.1、配置文件1.5.2、创建模型 1.6、配置训练参数1.7、创建训练器1.8、模型训练1.9、模型推理 0、IA-3基本原理 IA3的基本思想就是抑制和放大内部激活&#xff0c…

外包功能测试干了4年,技术退步太明显了。。。。。

先说一下自己的情况&#xff0c;本科生生&#xff0c;18年通过校招进入武汉某软件公司&#xff0c;干了差不多4年的功能测试&#xff0c;今年中秋&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能…

详细七种msvcr71.dll丢失的解决方法,快速修复错误的msvcr71.dll问题

今天&#xff0c;我打算跟大家分享一个有关电脑提示“msvcr71.dll丢失”的问题&#xff0c;并且会给出7种msvcr71.dll丢失的解决方法。但愿在大家工作期间遇到类似问题的时候&#xff0c;这些方法能够起到一定的帮助作用。同时在帮助大家了解msvcr71.dll文件。 如果遇到“msvcr…

面试知识点总结篇二

一、makefile链接库参数 LIBS -L/path/to/lib -lmylib//&#xff0c;-lmylib会链接名为libmylib.so或libmylib.a的库。all: myprogrammyprogram: myprogram.ogcc -o myprogram myprogram.o $(LIBS)//此处使用myprogram.o: myprogram.cgcc -c myprogram.c二、shell指令 Shell…

JAVA开源项目 影城管理系统 计算机毕业设计

本文项目编号 T 045 &#xff0c;文末自助获取源码 \color{red}{T045&#xff0c;文末自助获取源码} T045&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 用…

无人机视角下的车辆数据集

车辆数据集 无人机视角下的车辆数据集。数据集为无人机俯拍的真实场景下的车辆机动车数据集。数据集已经标注好&#xff0c;yolo格式&#xff0c;txt标签。数据集已经划分好训练集&#xff08;20970张图片&#xff09;验证集&#xff08;5242张图片&#xff09;测试集&#xff…

企业级Windows server服务器技术(1)

windows server服务器安装 准备工作&#xff1a; 1.准备安装的镜像 2.安装好虚拟机VMware或者virtual box 3.准备安装的位置&#xff08;选择你的电脑的磁盘上比较空闲的位置&#xff0c;新建一个文件夹并命名&#xff09; 4.开始安装&#xff08;按步骤&#xff09;----…

Threejs绘制圆锥体

上一章节实现了胶囊体的绘制&#xff0c;这节来绘制圆锥体&#xff0c;圆锥体就是三角形旋转获得的&#xff0c;如上文一样&#xff0c;先要创建出基础的组件&#xff0c;包括场景&#xff0c;相机&#xff0c;灯光&#xff0c;渲染器。代码如下&#xff1a; initScene() {this…

电力系统中有哪些好的运维的平台?

摘要&#xff1a;介绍台商大厦&#xff0c;采用综合保护装置、多功能仪表、变压器温控仪、直流屏、烟雾传感器、门磁开关、网络摄像头等设备&#xff0c;采集配电现场的各种电参量和状态信号。系统采用现场就地组网的方式&#xff0c;组网后通过现场网关远传至阿里云平台&#…

【模板进阶】std::enable_if

一、 SFINAE 在介绍 s t d : : e n a b l e _ i f std::enable\_if std::enable_if之前&#xff0c;先介绍一个概念&#xff1a; S F I N A E SFINAE SFINAE&#xff0c;全称是&#xff1a; S u b s t i t u t i o n F a i l u r e i s n o t a n E r r o r Substitution\ Fai…

【java21】java21新特性之JavaDoc中支持代码片段

在Java18之前&#xff0c;已经支持在JavaDoc中引入代码片段&#xff0c;这样可以在某些场景下更好的展示描述信息&#xff0c;但是之前的支持功能有限&#xff0c;比如我想高亮代码片段中的某一段代码是无能为力的。现在Java18优化了这个问题&#xff0c;增加了snippet来引入更…

短视频矩阵管理系统贴牌 源码开发

抖音账号矩阵的开发核心维度包括&#xff1a; 多账号管理开发维度&#xff1a;通过运用不同类型的账号矩阵&#xff0c;可以实现统一且便捷的管理。目前&#xff0c;矩阵系统支持管理抖音、快手、视频号,b站的账号&#xff0c;未来计划加入小红书,tk等等的账号管理。 矩阵账号…

如何编写高质量的用户故事

本文详细介绍了如何在敏捷开发过程中编写高质量用户故事&#xff08;User Story&#xff09;&#xff0c;包括用户故事的定义、结构、撰写技巧以及如何与产品待办列表&#xff08;Product Backlog&#xff09;中的其他工作项&#xff08;PBI&#xff09;相结合&#xff0c;以提…

【Elasticsearch系列廿二】特殊参数

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

解释器模式原理剖析和Spring中的应用

解释器模式原理剖析和Spring中的应用 解释器模式 是一种行为型设计模式&#xff0c;它定义了一种语言的文法表示&#xff0c;并提供了一个解释器来处理该文法的表达式。解释器模式可以用于构建语法解释器&#xff0c;例如计算器、简单编程语言的解释器等。 核心思想&#xff1a…