OLED非等宽字体格式

陈拓 2021/07/02-2021/07/07

1. 概述

用Arduino IDE进行ESP32和ESP8266开发时可以使用内置字体:

这3种字体都是非等宽的,在OLED这样的小屏幕上非等宽字体可以显示更多的字符,也更美观。

如果我们使用ESP-IRF进行ESP32开发,或者用RTOS SDK进行ESP8266开发时要使用这些字体就需要自己写OLED的显示驱动。因此我们需要了解这些非等宽字体的结构。

在Arduino IDE安装目录下的

Arduino\arduino-1.8.10\libraries\esp8266-oled-ssd1306-master\src\OLEDDisplayFonts.h文件定义了这三种字体。

如果你没有安装Arduino IDE,也可以从下面的网址找到:

https://github.com/ThingPulse/esp8266-oled-ssd1306/blob/master/src/OLEDDisplayFonts.h

如果需要更多的字体可以通过官方给定的网页定制。网址为:http://oleddisplay.squix.ch

该网页除了可以生成Arduino字体,还可以生成Adafruit GFX字体。Arduino IED也支持Adafruit GFX字体。关于Adafruit GFX字体的规范见:

《Adafruit GFX Library字体规范》

https://zhuanlan.zhihu.com/p/385486474

https://blog.csdn.net/chentuo2000/article/details/118369058

下面我们说明Arduino IDE内置非等宽字体的结构。

2. 非等宽字体的结构

用任意文本编辑工具打开OLEDDisplayFonts.h文件。或者打开网页:

https://github.com/ThingPulse/esp8266-oled-ssd1306/blob/master/src/OLEDDisplayFonts.h

其中包含了三种字体对应的3个数组ArialMT_Plain_10[]、ArialMT_Plain_16[]和ArialMT_Plain_24[]。每种字体数组由3部分组成,我们以ArialMT_Plain_10[]为例进行说明。

2.1 数组和特征说明

前四个字节是字体说明:

0x0A:字符集宽度(可变值,每个字符的实际宽度小于等于字符集宽度)

0x0D:字模高度(固定值)

0x20:第一个字符的ASCII值,从ASCII表的空格开始,空格的ASCII为32。

0xE0:字符个数224

2.2 跳转表

每个字符一行,用4个字节表示:

  1. 前两个字节表示字符字模所在该数组的起始位置。第一个字节为高位,第二个字节为低位。0xFF表示无地址。
  2. 第三个字节是字模所占的字节数
  3. 第四个字节表示字符的宽度,因为宽度是可变的,这是字符的实际宽度
  4. 注释给出了十进制的ASCII码值和数据的起始地址。例如//35:9表示ASCII码35的数据从9开始。

我们看第1个字符ASCII的空格,其数据地址是0xFF,0xFF,表示这个字符没有数据,也就是空,所以该字符的字节数是0x00。第4个字节0x03表示该字符的宽度。

第2个字符是!,ASCII为33,数据地址为0x0000,字节数为0x04,字符宽度为0x03。

第3个字符是",ASCII为34,数据地址为0x0004,字节数为0x05,字符宽度为0x04。

第4个字符是#,ASCII为35,数据地址为0x0009,字节数为0x09,字符宽度为0x06。

以此类推。

2.3 字符数据

举例,我们看字符”,双引号,ASCII码是34。

先看跳转表:0x00, 0x04, 0x05, 0x04,  // 34:4

数据是从// Font Data:的0x0004处开始的0x05个字节:

0x38,0x00,0x00,0x00,0x38, // 34

字模以逐列式排列点阵,因为字符的高是13,所以每列需要2个字节,第二个字节最高3个bit没有使用,总是0。用.代表0,用x代表1,将这5个字节展开成二进制,低位在上,高位在下,按列排列。每列2个字节,第一个字节在上,第二个字节在下,如图所示。

要注意的是,为了节省空间,每个字符最后全零的字节被省略了,例如本例,按照字符的宽和高计算需要8个字节的数据,实际上只有5个字节,后面3个全零字节被省略了。

  1. 显示效果

下图是ESP8266 RTOS SDK驱动0.96寸OLED显示屏的效果。

注意,要删除OLEDDisplayFonts.h文件中数组定义的关键字PROGMEM。

PROGMEM关键字被Arduino和AVR编程使用,在ESP8266和ESP32的官方开发环境RTOS SDK和ESP-IDF中要删除。

参考文档

  1. esp8266-oled-ssd1306/src/OLEDDisplayFonts.h
    https://github.com/ThingPulse/esp8266-oled-ssd1306/blob/master/src/OLEDDisplayFonts.h
  2. 有关SimpleGUI移植非等宽字符的介绍
    https://blog.csdn.net/eaglewzw/article/details/107602173

OLED非等宽字体格式相关推荐

  1. ffmpegguitool下载不了_-非等宽unicode 点阵字库工具(GuiTool)下载1.06 -旋风软件园...

    v1.06 (20120410) FontMaker(点阵字库) 1. 增加系统字体支持,操作更简单,快捷. v1.05 (20120324) FontMaker(点阵字库) 1. 修正了字符对齐问题 ...

  2. html字体代码大全_Vba群发邮件及HTML设置字体格式的代码

    按如下数据群发邮件 Sub 在EXCEL中用VBA群发N个Outlook邮件并简单设置邮件正文格式() Dim a, b As Object '定义2个对象型变量 Dim m, n, i As Lon ...

  3. 前端图片压缩上传(纯js的质量压缩,非长宽压缩)

    前端图片压缩上传(纯js的质量压缩,非长宽压缩) 此demo为大于1M对图片进行压缩上传 若小于1M则原图上传,可以根据自己实际需求更改. demo源码如下: <!DOCTYPE html> ...

  4. Android实现自定义字体格式液晶数字

    最近在研究点心省电,想做个类似的产品,看到界面听炫的, 在实现过程中发现android不支持液晶显示的数字格式,一时陷入 困境. 最后自己,通过查看Linux系统下的字库ttf,查看实现了起功能, 顺 ...

  5. css linux 等宽字体,CSS3 等宽字体与ch单位的详解

    下面我们来看一篇关于CSS3 等宽字体与ch单位的使用方法介绍,希望这篇文章能够让各位理解到css中ch单位及字体等宽问题哦. 一.什么是等宽字体? 所谓等宽字体,一般是针对英文字体而言的.东亚字体, ...

  6. 关于字体族、字体格式

    一.字体族 我们平时泛称的字体(如:Times Consolas Arial 微软雅黑-)其实都是字体族,因为其中包含许多种变体(如:常规 粗体 斜体 斜体加粗-),但是这些变体又是同属于一种字型. ...

  7. CSS非布局样式-字体

    本文内容整理于慕课网视频教程 对于CSS中的字体属性(font-family),有几个方面的知识需要了解. 一:字体的分类 有两个类型的名称可用于分类字体: 字体族名称(family-name) 族类 ...

  8. Visual Studio 2019 设置等宽字体 DejaVu Sans Mono

    Visual Studio 2019 设置等宽字体 DejaVu Sans Mono 文章目录 Visual Studio 2019 设置等宽字体 DejaVu Sans Mono I - 前言 II ...

  9. Word 参考文献 引用 自动更新 引用字体格式批量改动

    目前在写毕业论文,参考文献的改动真是头疼,逐一对照引用不说,一旦文献引用要增删改,后面的都要改.针对这个问题,特意去查了查文献引用然后自动更新的方法,在这记录一下,方便以后查看. V1.0_2020. ...

最新文章

  1. git常用命令及规范流程
  2. linux 进程原理内存,linux进程通信之共享内存原理(基于linux 1.2.13)
  3. 安装smac的注意事项
  4. C#中Invoke的用法(转)
  5. 开源netcore前后端分离,前端服务端渲染方案
  6. 移动端判断手机横竖屏状态
  7. 前后端开发的心得体会_社招后端三面总结以及学习经验感言(操详细)
  8. 想要你的HTTP稳定不蹦,必须吃透「负载均衡」
  9. Origin 去demo水印
  10. Adobe Premiere Pro (PR) 视频剪辑相关应用
  11. 美化你的Xfce桌面
  12. wordpress企业网站模板
  13. TCP之 select模型
  14. 用图形计算机玩游戏,专业图形显卡能玩游戏吗?专业图形显卡和游戏显卡区别是什么?...
  15. java后台生成二维码以及页面显示二维码方式
  16. 领导的沉默,背后到底隐藏着什么?
  17. python 上传图片到七牛云上
  18. CAD编辑器中CAD线型怎么修改?
  19. kitti rotation,label等细节相关
  20. android无法启动守护进程,Android Studio无法启动守护进程异常怎么解决?

热门文章

  1. 响应式布局或自适应网页设计
  2. 序列流_SequenceInputStream类
  3. 500 Internal Privoxy Error解决方法
  4. 列表数据批量删除思想
  5. 3月19日,30秒知全网,精选7个热点///申请百度智能云文心一言企业版API调用服务测试的企业用户达9万
  6. 【AI 写作】《开发者思维:技术如何驱动企业的未来》全书目录、什么是开发者思维? 开发者思维与企业战略的关系?
  7. BITCS2016程序设计 | 20. 猜-丁-壳!
  8. 幼儿园语言活动包括哪几类_幼儿园语言活动课反思
  9. 基于MATLAB的GSE、GSS、GDD的五天运行法计算
  10. 503 Service Unavailable