OLED(3)字库篇

news2024/9/25 13:01:13

文章目录

    • 1 显示图片
      • 1.1 图片取模
    • 2 字符集与编码
      • 2.1 字符编码
      • 2.2 ASCII
      • 2.3 中文编码
        • 2.3.1 GB2312 标准
        • 2.3.2 GBK 编码
        • 2.3.3 GB18030
      • 2.4 Unicode 字符集和编码
        • 2.4.1 UTF-32
        • 2.4.2 UTF-16
        • 2.4.3 UTF-8
    • 3 字库 DIY
      • 3.1 生成字库
      • 3.2 烧录到 W25Qxx

1 显示图片

1.1 图片取模

  • 1)生成 bmp 点位图

    • (1)找到一张图片,在 PS(在线 PS:https://www.photopea.com/) 中打开:

    • (2)二值化处理:图像 -> 调整 -> 阈值,调整阈值

    • (3)大小调整:图像 -> 图像大小,调整到最大不能超过 64 x 64

    • (4)导出 bmp:文件 -> 导出为 -> 更多 -> bmp

  • 2)打开 bmp 图像:

  • (1)打开 “PCtoLCD2002完美版” 软件

  • (2)打开 bmp 图像:如果打开失败,就把图片用 Windows “画图” 软件重新另存一下。

  • 3)取模:记得选择 “阳码”,要不太丑了。

2 字符集与编码

2.1 字符编码

  • 1)字符集:顾名思义,字符的集合。比如将一副中国象棋随意放置在棋盘上。

  • 2)编码:按照一定的规则给字符集排序。这里的规则即为编码方式,同一个汉字可以有 GB2312、GBK、GB18010,还可以有 UTF-8、UTF-16、UTF-32 编码方式。就好像我们人为规定中国象棋上棋子的位置,这样当我们指定一个位置时,就可以取到已知的棋子。

2.2 ASCII

  • 1)ASCII:1 个字节,其中 32~127 表示空格、数字、标点、字母等可显示字符

2.3 中文编码

2.3.1 GB2312 标准
  • 1)GB2312 标准:

    • (1)小于 0x7F 的编码仍旧为 ASCII
    • (2)取消 0x7F 到 255 的扩展字符集
    • (3)两个大于 0x7F 的字节连在一起表示一个汉字,其中字节的取值范围为 0xA1 ~ 0xFE,可以表示 7000+ 符号,其中汉字 6763 个
    • (4)ASCII 里面原本有的数字、字母等也重新编码成 2 个字节,即 “全角” 字符
  • 2)区位码:GB2312 编码对收录字符进行了 “分区” 处理

    • (1)一共 94 个区,每区 94 个位,一共 8836 个码位
    • (2)GB2312 编码实现:高字节对应 94 个区,低字节对应 94 个位;则 GB2312 的区位码范围为 0101 ~ 9494。同时为兼容 ASCII,区号和位号分别加上 0xA0 偏移,即 0xA1A1 ~ 0xFEFE。
    • (3)汉字的编码范围为 0xB0A1 ~ 0xF7FE。高字节0xB0 ~ 0xF7(区号 16 ~ 87),低字节 0xA1 ~ 0xFE(区号 01 ~ 94)
    • (4)“啊” 字位于 16 区的 01 位,则其区位码为 1601,加上 0xA0 偏移后为 0xB0A1
  • 3)码位示意图:

    • 当生成字库时,要注意 0xXXA0、0xXXFF 要直接跳过,0xD7FA~0xD7FE 要设置占位数据
  • 4)GB2312 字符集:https://www.toolhelper.cn/Encoding/GB2312

2.3.2 GBK 编码
  • 1)GBK 编码方式:在 GB2312 标准上增加 14240 个新汉字(包括Big5)和符号

  • 2)GBK 编解码:

    • 编码:不再要求低字节编码必须大于 0x7F,只要高字节大于 0x7F 即可。这样即可兼容 ASCII 和 GB2312 标准
    • 解码:按字节遍历字符串,当遇到一个字符大于 0x7F 时,就再读取它后面的一个字符,两个字符合起来,用 GBK 解码。
  • 3)码位示意图:

  • 4)GBK 字符集:https://www.toolhelper.cn/Encoding/GBK
2.3.3 GB18030
  • 1) GB18030 的编码使用 4 个字节,它利用前面标准中的第 2 个字节未使用的 “0x30-0x39” 编码表示扩充四字节的后缀,兼容 GBK、 GB2312 及 ASCII 标准。

2.4 Unicode 字符集和编码

  • 1)Unicode 字符集:国际标准化组织(ISO)舍弃地区性方案,重新给全球所有文化使用的符号进行编号,对每一个字符指定唯一的编号(ASCII 字符编号不变),编号从 0x000000 到 0x10FFFF,称为 Unicode。

  • 2)Unicode 字符集只是对字符进行编号,但没有指定对字符的编码,常见的编码方式有 UTF-32、UTF-16、UTF-8。

2.4.1 UTF-32
  • 1)Unicode 字符集每个字符都用 4 个字节来表示。
    • 不兼容 ASCII
    • 浪费存储空间,大量常用字符只需要 2 个字节就能表示。
    • 存储时需要指定字节顺序
2.4.2 UTF-16
  • 1)用 2 个或 4 个字节表示。

    • 0 ~ 0xFFFF 使用 2 个字节表示
    • 将 0xD800 ~ 0xDBFF 映射到 Unicode 字符集中编号超出 0xFFFF 的字符
  • 2)解码:读取两个字节,如果不在 0xD800 ~ 0xDBFF,则以双字节解析,找到对应编号的字符;如果在,则以 4 字节解析

  • 3)节约空间。但仍然不兼容 ASCII,仍有大小端格式

2.4.3 UTF-8
  • 1)变长:1、2、3、4 字节长度

  • 2)编码方式:

    • (1)单字节:最高位为 1,其余位表示 Unicode 编号。即对于 Unicode 编号为 0x0000000 ~ 0x0000007F 的字符,UTF-8 只需要 1 个字节,兼容 ASCII
    • (2)N 个字节:最高字节的前 N 位为 1,第 N+1 位为 0;其它字节前两位为 10;剩余的 N 个字节的其余空位填充 Unicode 编号。
    UnicodeUTF-8
    编号范围第一字节第二字节第三字节第四字节第五字节
    0000 0000 - 0000 007F0xxx xxxx
    0000 0080 - 0000 07FF110x xxxx10xx xxxx
    0000 0800 - 0000 FFFF1110 xxxx10xx xxxx10xx xxxx
    0001 0000 - 0010 FFFF1111 0xxx10xx xxxx10xx xxxx10xx xxxx
    0020 0000 - 03FF FFFF1111 10xx10xx xxxx10xx xxxx10xx xxxx10xx xxxx
  • 3)解码:

    • 如果第一个字节 >> 7 为 0,则以单字节解析
    • 如果第一个字节 >> 5 为 0b110,则以双字节解析
    • 如果第一个字节 >> 4 为 0b1110,则以三字节解析
    • 如果第一个字节 >> 3 为 0b11110,则以四字节解析

3 字库 DIY

  • 参考:
    • https://www.bilibili.com/read/cv17325269/
    • https://blog.csdn.net/Joseph__Lagrange/article/details/118021733
    • https://blog.csdn.net/bitslink/article/details/137418422

3.1 生成字库

在编写 OLED 驱动时,需要以 “纵向,先上下后左右,低位在前” 的方式制作 Unicode 和 GBK 编码字库,市面上有不少生成字库的软件,没有找到合适的。

  • 1)源码地址:https://gitee.com/luyaocf/oled_font_library.git

基于 Python 开发,可以下载下来定制化运行,也可以下载我打包的发行版。软件界面如下:

字库

原理简要说明:

  • (1)字符的编码可以理解成整数,如 “路” 在 GBK 编码中为 0xC2B7。那么我们以指定的编码 GBK、大小端的将该整数转换为汉字即可。遍历 GBK 编码的范围的所有整数即可得到所有的 GBK 编码汉字(记得剔除掉其中未编码的数,如 GBK 中的 0xXX7F, 0xXXFF 等位置。)
  • (2)以指定的像素大小(如 16x16)生成一张图片,然后将指定汉字显示到上面,再对图片进行二值化处理(有内容的像素点为 1,无内容的像素点为 0),最后生成一个字节数组。
    • 显示汉字到图片上时可以指定字体,如宋体、楷体等(我试过,只有宋体能看)
    • 图片二值化后生成的 16x16 字节数组如下,看出什么字没有^_-

  • (3)根据指定的显示方式(先左右还是先上下,高位在前还是低位在前,纵向还是横向等),将上述的字节数组转换成点阵数组。
    • 转换时要注意,字节数组每个字节只表示一个像素,而且是横向保存的。如果显示方式是纵向,要注意遍历方式。

3.2 烧录到 W25Qxx

制作的字节在电脑本地,怎么让单片机使用呢?写入到单片机可访问的板上存储器件即可。这里我选择通过 SDCard 写入到板上 W25Q64 中。

  • 1)字库地址分配(8M 的 W25Q64)
    • Unicode 的范围,0x4E00 ~ 0x9FFF,约 2 万个汉字
    • GB2312 的范围,0xB0A1 ~ 0xF7FE,约 6700 个常用汉字
W25Q64 地址字符点阵大小
0x007FF000 ~ 0x0068D000unicode 241480k(0x00172000)
0x0068D000 ~ 0x005E8000unicode 16660k(0x000A5000)
0x005E8000 ~ 0x0056B000unicode 12500k(0x0007D000)
0x0056B000 ~ 0x003C4800gbk 241690k(0x001A6800)
0x003C4800 ~ 0x00309000gbk 16750k(0x000BB800)
0x00309000 ~ 0x0027A800gbk 12570k(0x0008E800)
0x0027A800 ~ 0x001E9800gb2312 24580k(0x00091000)
0x001E9800 ~ 0x001A8800gb2312 16260k(0x00041000)
0x001A8800 ~ 0x00176800gb2312 12200k(0x00032000)

total font_lib_size: 6.53MB(0x00688800)

  • 2)源码地址:https://gitee.com/luyaocf/demo-jlc_stm32f407_fontlib.git

    • 该程序基于嘉立创天空星 STM32F407,其它芯片请自行移植。
    • 将字库文件放置到 SDCard 的根目录,上电,等待绿色 LED 闪烁即表示字库复制完成,也可连接串口线观察烧录日志。
  • 参考:

    • https://blog.csdn.net/a390478024/article/details/126779849
    • https://blog.csdn.net/xuan530482366/article/details/123713602

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

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

相关文章

【完整梳理验证】企业微信第三方应用接入全流程java版

企业微信第三方应用接入全流程java版 1. 概念与流程1.1 概念1、企业内部应用2、`第三方应用`3、代开发自建应用1.2 流程1.2.1 全局流程1.2.2 应用配置1.2.3 数据流程2. 核心文档2.1 理解第三方应用开发流程和概念2.1.1 应用开发阶段2.1.2 应用推广阶段2.1.3 基本流程1)前期应用…

【VUE_ruoyi-vue】基于ruoyi-vue框架实现简单的系统通用文件模块

基于ruoyi-vue框架,新增一个简单的系统通用文件模块,服务与各个模块涉及到文件上传信息的记录和相关展示 运行sql,创建数据库表 DROP TABLE IF EXISTS sys_file_info; CREATE TABLE sys_file_info (id int(11) NOT NULL AUTO_INCREMENT COMMENT id,lin…

怎样才能远程了解在iPhone、iPad上看了什么网站、用了什么APP?

有不少家长在网上吐槽: ——自家小孩每天抱着手机看,一看就两三个小时,到底在看什么? ——没有不允许小孩玩手机,但他一玩就一整天,用什么户外活动、家庭活动都吸引不回来。 ——每次问小孩在手机上看什…

【C++掌中宝】用最少的话让你全方位理解内联函数

文章目录 引言1. 什么是内联函数2. 工作原理3. 内联函数的编程风格4. 使用限制5. 内联函数与宏的比较6. 优缺点7. 何时使用内联函数8. 补充9. 总结结语 引言 在C编程中,函数的调用开销是程序运行效率的一个重要影响因素。为了解决频繁调用函数时的性能问题&#xf…

8080时序

通过RS来区分是命令还是数据 在WR高电平时,将数据放入D[0:15]数据线上 在WR上升沿,读取D[0:15]数据线上的数据 //提前把默认信号设置为对应电平 static inline void LcdSendCmd(uint16_t cmdVal) {LCD_CS_RESET();//cs输出低电平,表示片选…

【Diffusion分割】MedSegDiff-v2:Diffusion模型进行医学图像分割

MedSegDiff-V2: Diffusion-Based Medical Image Segmentation with Transformer 摘要: 最近的研究揭示了 DPM 在医学图像分析领域的实用性,医学图像分割模型在各种任务中表现出的出色性能就证明了这一点。尽管这些模型最初是以 UNet 架构为基础的&…

低代码BPA(业务流程自动化)技术探讨

一、BPA流程设计平台的特点 可视化设计工具 大多数BPA流程设计平台提供直观的拖拽式界面,用户可以通过图形化方式设计、修改及优化业务流程。这种可视化的方式不仅降低了门槛,还便于非技术人员理解和参与流程设计。集成能力 现代BPA平台通常具备与其他系…

My_String完善

#include "my_string_ok.h" My_string_Ok::My_string_Ok():size(20) { len 0; ptr new char[size]; ptr[len] \0; } My_string_Ok::My_string_Ok(int num,char c) { cout<<"有参构造"<<endl; ptr new char [20] ; len 0; for…

K8s安装部署(v1.28)--超详细(cri-docker作为运行时)

1、准备环境 ip角色系统主机名cpumem192.168.40.129mastercentos7.9k8smaster48192.168.40.130node1centos7.9k8snode148192.168.40.131node2centos7.9k8snode248192.168.40.132node3centos7.9k8snode348 2、系统配置&#xff08;所有节点&#xff09; 重要&#xff1a;首先…

怎么更换自己的ip地址?多种方法可实现

在当今的数字化时代&#xff0c;IP地址作为我们在网络世界中的“身份证”&#xff0c;扮演着举足轻重的角色。然而&#xff0c;有时候出于隐私保护、网络安全或是访问特定服务等需求&#xff0c;我们可能需要更换自己的IP地址。那么&#xff0c;如何实现这一目标呢&#xff1f;…

2024年10月2-4日(星期三-星期五)骑行(石林-老圭山)

2024年10月2-4日 (星期六&#xff09;骑行&#xff08;石林-大草坪---长坪---石头寨---海邑镇---老圭山&#xff09;&#xff0c;早8:30到9:00&#xff0c;新螺蛳湾客运站正门&#xff0c;地铁二号线南部客运站站出口集合&#xff0c;9:30装车&#xff0c;10:00出发。偶遇地点:…

网络安全前景大好,转行这些职位成了“香饽饽”

网络安全就业前景 大数据、人工智能、云计算、物联网、5G等新兴技术的高速发展&#xff0c;蒸蒸日上。但是随之也出现了许多问题&#xff0c;比如&#xff1a;政府单位、企业、个人信息泄露&#xff0c;网络安全问题日益严峻&#xff0c;网络空间安全建设刻不容缓。 网络安全…

【unity进阶知识3】封装一个事件管理系统

前言 框架的事件系统主要负责高效的方法调用与数据传递&#xff0c;实现各功能之间的解耦&#xff0c;通常在调用某个实例的方法时&#xff0c;必须先获得这个实例的引用或者新实例化一个对象&#xff0c;低耦合度的框架结构希望程序本身不去关注被调用的方法所依托的实例对象…

亲测好用,吐血整理 ChatGPT 3.5/4.0新手使用手册~

都知道ChatGPT很强大&#xff0c;聊聊天、写论文、搞翻译、写代码、写文案、审合同等等&#xff0c;无所不能~ 那么到底怎么使用呢&#xff1f;其实很简单了&#xff0c;国内AI产品发展也很快&#xff0c;很多都很好用了~ 我一直在用&#xff0c;建议收藏下来~ 有最先进、最…

古代的“契丹人”在今天属于哪个民族

在中国古代&#xff0c;自从我国历史上的夏朝建立以来&#xff0c;一共出现了二十多个朝代。随着朝代的不断更替&#xff0c;社会也在不断前进。如今&#xff0c;封建社会已经成为过去&#xff0c;朝代和政权已不再是同一个概念。例如&#xff0c;在三国时期&#xff0c;魏、蜀…

可视掏耳勺鸡肋吗?高清可视掏耳勺牌子推荐!

很多人习惯在洗漱完顺手拿一根棉签掏耳朵&#xff0c;但是棉签的表面直径大且粗糙&#xff0c;不易将耳朵深处的耳垢挖出&#xff0c;耳垢堆积在耳道深处长时间不清理会导致堵塞耳道&#xff0c;引起耳鸣甚至感染。而可视掏耳勺作为一种新型的挖耳工具&#xff0c;它的安全性也…

羽毛球场馆预约系统,便捷管理预约

全国羽毛球运动的热度不断上升&#xff0c;在健身行业中掀起了一股羽毛球热潮。同时羽毛球运动的风靡&#xff0c;也吸引了不少人入局&#xff0c;各种大大小小的羽毛球馆不断出现&#xff0c;为大众的羽毛球喜好提供了场地。 随着互联网的发展&#xff0c;羽毛球馆也开始向线…

程序员转型攻略:数据分析师、AI大模型工程师、产品经理、云计算工程师,哪个更适合你?

先给结论再说理由&#xff1a;数据分析师、AI大模型工程师、产品经理和云计算工程师。 这些领域不仅因应了当前技术发展的趋势&#xff0c;也为程序员提供了转型的广阔舞台和职业发展的新机遇。 一起来看看吧&#xff01; 数据分析师&#xff1a;数据驱动决策的关键 程序员…

开源大模型技术路线及趋势

1. 三个维度 大模型研发力量 学术机构 大模型创业公司 科技大厂 旗舰开源模型的形态/模态 基础大模型 -> instruct大模型 -> 多模态&#xff08;VL大模型 -> 类gpt-4o大模型&#xff09; 时间线 23年上半年 23年下半年 24年 25年 2. 核心观察 学术机构及…

帮助中心:如何搭建有效解决客户问题的内容

在竞争激烈的市场环境中&#xff0c;优质的客户服务是企业脱颖而出的关键之一。而搭建一个高效、全面的帮助中心&#xff0c;提供有效解决客户问题的内容&#xff0c;则是提升客户满意度和忠诚度的重要途径。本文将探讨如何搭建这样一个帮助中心&#xff0c;以确保客户在遇到问…