OLED(2)驱动篇

文章目录

    • 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.xdnf.cn/news/1544641.html

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

相关文章

Unity 设计模式 之 行为型模式-【命令模式】【责任链模式】

Unity 设计模式 之 行为型模式-【命令模式】【责任链模式】 目录 Unity 设计模式 之 行为型模式-【命令模式】【责任链模式】 一、简单介绍 二、命令模式(Command Pattern) 1、什么时候使用命令模式 2、使用命令模式的好处 3、使用时的注意事项 三…

FME学习笔记

读取数据 方法一:add reader 通过读模块来进行数据的读取 方法二:FeatureReader Parameters 通过转换器来进行数据的读取 可以通过空间范围进行筛选 在FME中,所有数据处理都要用到的,绝对的重点:转换器&#xff…

【Python】PyCharm: 强大的 Python 开发环境

⭕️宇宙起点 📢 引言🎬 什么是 PyCharm?🔨 PyCharm 的核心特性1. 智能代码编辑2. 调试和测试3. 项目和代码结构导航4. 集成 AI 助手5. 远程开发6. 集成数据库7. 科学工具8. 版本控制集成9. Web 开发 📦 安装 PyCharm&…

黑马智数Day4-1

新增月卡 配置路由完成跳转 {path: /cardAdd,component: () > import(/views/car/car-card/add-card) }<el-button type"primary" click"$router.push(/cardAdd)">添加月卡</el-button> 车辆信息表单验证 <el-form :model"carInf…

Bug:ThreadPoolTaskScheduler搭配CronTask完成定时任务,关闭scheduler后CronTask任务仍然执行?

【问题】执行下面代码后&#xff0c;关闭ThreadPoolTaskScheduler&#xff0c;CronTask仍然继续执行。 Configuration public class config {Beanpublic String getString() throws InterruptedException {Runnable runnable () -> {try {System.out.println("hello r…

《程序猿之设计模式实战 · 适配器模式》

&#x1f4e2; 大家好&#xff0c;我是 【战神刘玉栋】&#xff0c;有10多年的研发经验&#xff0c;致力于前后端技术栈的知识沉淀和传播。 &#x1f497; &#x1f33b; CSDN入驻不久&#xff0c;希望大家多多支持&#xff0c;后续会继续提升文章质量&#xff0c;绝不滥竽充数…

【后端开发】JavaEE初阶—线程安全问题与加锁原理(超详解)

前言&#xff1a; &#x1f308;上期博客&#xff1a;【后端开发】JavaEE初阶—Theard类及常见方法—线程的操作&#xff08;超详解&#xff09;-CSDN博客 &#x1f308;感兴趣的小伙伴看一看小编主页&#xff1a;GGBondlctrl-CSDN博客 &#x1f308;小编会在后端开发的学习中不…

关于javascript中防抖和节流的使用详解

防抖&#xff08;Debounce&#xff09;和节流&#xff08;Throttle&#xff09;是两种常见的优化技巧&#xff0c;通常用于控制函数在短时间内频繁触发的场景&#xff0c;尤其是在处理用户输入、滚动、窗口大小调整等事件时。它们的主要目的是减少不必要的函数调用&#xff0c;…

超详细超实用!!!AI编程之cursor编写设计模式开闭原则实例(四)

云风网 云风笔记 云风知识库 一、设计模式开闭原则定义 当应用的需求改变时&#xff0c;在不修改软件实体&#xff08;项目模块、类、接口方法&#xff09;的源代码或者二进制代码的前提下&#xff0c;可以扩展模块的功能&#xff0c;使其满足新的需求。即软件实体应当对扩展开…

【Linux】nginx连接前端项目

文章目录 一、项目编译1.编译文件2.dist文件 二、Linux nginx配置三、启动nginx 一、项目编译 1.编译文件 2.dist文件 二、Linux nginx配置 在Xshell软件中&#xff0c;点击CtrlAltF进入文件传输找到地址&#xff1a;/usr/local/nginx/html将dist文件传入 找到nginx.conf&…

git add成功后忘记commit的文件丢了?

本文目标&#xff1a;开发人员&#xff0c;在了解git fsck命令用法的条件下&#xff0c;进行git add成功但由于误操作导致丢失的文件找回&#xff0c;达到找回丢失文件的程度。 文章目录 1 痛点2 解决方案3 总结/练习 1 痛点 开发过程中&#xff0c;分支太多&#xff08;基线分…

CREO教程——2 绘制标准图纸

CREO教程——2 绘制标准图纸 说明&#xff1a;继承第一章设置好的配置文件&#xff0c;这一章进行学习分享如何定制自己的图纸图框&#xff0c;参考国家标准距&#xff0c;定制属于设计师或单位的通用图框。 1.设置工作目录 1.1设置工作目录 1.打开软件设置工作目录&#x…

u盘格式化怎么恢复数据?四款工具来救急!

工作中真的没少碰到过那些让人头疼的数据丢失问题&#xff0c;特别是U盘里的宝贝数据一不小心就“蒸发”了&#xff0c;简直让人欲哭无泪。不过别担心&#xff0c;我作为一个数据恢复的新手小白&#xff0c;最近可是亲测了几款超给力的数据恢复软件&#xff0c;今天就来跟大家分…

19c-TNS-12541: TNS:no listener

有套19c单机&#xff0c;没应用任何的补丁&#xff0c;使用lsnrctl status查看监听是异常的&#xff0c;但是lsnrctl start发现监听已运行&#xff0c;当前业务连接都正常&#xff0c; orcl:/home/oracledb> lsnrctl status LSNRCTL for Linux: Version 19.0.0.0.0 - Pro…

打造灵活DateTimePicker日期时间选择器组件:轻松实现时间的独立清除功能

element ui中日期和时间选择器&#xff08;DateTimePicker&#xff09;是一个常见且重要的组件。它允许用户轻松地选择日期和时间&#xff0c;极大地提升了用户体验。然而&#xff0c;在某些场景下&#xff0c;用户可能需要更细粒度的控制&#xff0c;例如单独清除已选择的时间…

下载与安装|Inventor 2025百度云资源分享附教程

如大家所了解的&#xff0c;Inventor是一款专业的三维可视化实体建模软件&#xff0c;主要用于各类二维机械制图、三维制图的设计和开发等操作&#xff0c;可以广泛地应用于零件设计、钣金设计、装配设计等领域。 不同领域的应用证明了Inventor具有强大的兼容性&#xff0c;基…

监控易监测对象及指标之:全面监控Oracle ODBC数据库

在数字化时代&#xff0c;数据库作为存储和管理企业核心数据的基石&#xff0c;其稳定性和性能直接关系到业务的连续性和效率。Oracle数据库以其强大的功能和稳定性&#xff0c;广泛应用于各行各业。为了确保Oracle数据库的稳定运行和高效性能&#xff0c;对其进行全面监控显得…

备战软考Day04-计算机网络

1、计算机网络的分类 2、七层网络体系结构 3、网络的设备与标准 4、TCP/IP协议族 TCP/IP作为Internet的核心协议&#xff0c;被广泛应用于局域网和广域网中&#xff0c;目前已成为事实上的国际标准 1、TCP/IP分层模型 TCP/IP协议是Internet的基础和核心&#xff0c;和OSI参考…

git命令将已经commit的代码push到其他分支

文章目录 一&#xff1a;对于多分支的代码库&#xff0c;将提交记录从一个分支转移到另一个分支是常见需求方法1&#xff1a;撤销commit操作方法2&#xff1a;实用命令git cherry-pick 来移动commit 二、不小心revert导致代码消失的问题 一&#xff1a;对于多分支的代码库&…

【Diffusion分割】FDiff-Fusion:基于模糊学习的去噪扩散融合网络

FDiff-Fusion: Denoising diffusion fusion network based on fuzzy learning for 3D medical image segmentation 摘要&#xff1a; 近年来&#xff0c;去噪扩散模型在图像分割建模中取得了令人瞩目的成就。凭借其强大的非线性建模能力和优越的泛化性能&#xff0c;去噪扩散模…