OLED非等宽字体格式

news/2024/12/24 12:57:53 标签: ESP8266, 非等宽字体, Arduino IDE

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


http://www.niftyadmin.cn/n/1733109.html

相关文章

UML基础: 统一建模语言简介

http://www.ibm.com/developerworks/cn/rational/r-uml/UML基础: 统一建模语言简介文档选项打印本页将此页作为电子邮件发送级别: 初级Donald Bell, IBM 全球服务, IBM 2004 年 2 月 01 日回 顾20世纪晚期--准确地说是1997年,OMG组织(Object …

用软件过程——瀑布模型

http://www.caixiaodong.com/archives/76.html2009年10月11日 蔡晓东瀑布模型在中国的普及度非常之高。这得归功于我们的大学教育,学生们还没有理解软件为什么复杂,却已经知道软件的问题必须用“软件工程”来解决,其 中最基础的就是瀑布模型。…

VUE学习,vue运行环境搭建遇见的小问题

1.使用vscode来编辑项目,那么首先给它搭一个vue运行的环境,打开集成终端,使用npm install live-server -g安装live-server. problem1:cmd终端分行问题。解决方法:打开cmd.exe,右击其最右上角,选择属性&…

软件开发主要活动——需求分析

http://www.caixiaodong.com/archives/56.html需求分析活动解决软件开发“做什么”的问题。客户对于需求的认知并不清晰,且经常同时包含了几个层次的需求概念,提交给软件项目组,要求按需求实现。需求分析活动的目标,是为后续各活动…

Adafruit GFX字体制作

Adafruit GFX字体制作 陈拓 2021/07/08-2021/07/08 1. 概述 在《Adafruit GFX Library字体规范》 https://zhuanlan.zhihu.com/p/385486474 https://blog.csdn.net/chentuo2000/article/details/118369058 一文中我们详细说明了Adafruit GFX字体的规范,本文介绍…

通栏导航栏的制作,综合使用CSS属性,代码不超过30行

这篇文章,小编带领大家一同做一个利用CSS技术实现的导航栏。通过这个导航栏的制作,希望大家能够对前几篇文章中学习到的CSS属性能有一个整体的认识,并能够达到灵活运用的程度。 承接文章:灵活控制块级元素在一行内显示&#xff0c…

常用软件过程——RUP

RUP是用例驱动,以架构为中心,迭代式开发过程。 一、用例驱动 用例(Use Case)是一种通过用户的使用场景获得需求的技术。区别于传统的功能分解获取需求的办法,用例方法强调用户是如何使用系统的,即描述用户与…

在OLED上用大于126的ASCII码显示定制符号

在OLED上用大于126的ASCII码显示定制符号 陈拓 2021/07/09-2021/07/09 1. 概述 在做嵌入式开发时我们经常会遇到显示非ASCII码符号的问题,比如摄氏温度符号或者一个充电的电池图标。而通常的字体库只能显示标准ASCII字符集的32-126个可打印字符。 在本文中我们将…