LV16-26-LCD-07-任意大小字模?
本文主要是字模缩放的相关笔记,若笔记中有错误或者不合适的地方,欢迎批评指正😃。
点击查看使用工具及版本
Windows | windows11 |
Ubuntu | Ubuntu16.04的64位版本 |
VMware® Workstation 16 Pro | 16.2.3 build-19376536 |
SecureCRT | Version 8.7.2 (x64 build 2214) - 正式版-2020年5月14日 |
开发板 | 正点原子 i.MX6ULL Linux阿尔法开发板 |
uboot | NXP官方提供的uboot,NXP提供的版本为uboot-imx-rel_imx_4.1.15_2.1.0_ga(使用的uboot版本为U-Boot 2016.03) |
linux内核 | linux-4.15(NXP官方提供) |
STM32开发板 | 正点原子战舰V3(STM32F103ZET6) |
点击查看本文参考资料
- 通用
分类 | 网址 | 说明 |
官方网站 | https://www.arm.com/ | ARM官方网站,在这里我们可以找到Cotex-Mx以及ARMVx的一些文档 |
https://www.st.com/content/st_com/zh.html | ST官方网站,在这里我们可以找到STM32的相关文档 | |
https://www.stmcu.com.cn/ | 意法半导体ST中文官方网站,在这里我们可以找到STM32的相关中文参考文档 | |
http://elm-chan.org/fsw/ff/00index_e.html | FatFs文件系统官网 | |
教程书籍 | 《ARM Cortex-M3权威指南》 | ARM公司专家Joseph Yiu(姚文祥)的力作,中文翻译是NXP的宋岩 |
《ARM Cortex-M0权威指南》 | ||
《ARM Cortex-M3与Cortex-M4权威指南》 | ||
开发论坛 | http://47.111.11.73/forum.php | 开源电子网,正点原子的资料下载及问题讨论论坛 |
https://www.firebbs.cn/forum.php | 国内Kinetis开发板-野火/秉火(刘火良)主持的论坛,现也做STM32和i.MX RT | |
https://www.amobbs.com/index.php | 阿莫(莫进明)主持的论坛,号称国内最早最火的电子论坛,以交流Atmel AVR系列单片机起家,现已拓展到嵌入式全平台,其STM32系列帖子有70W+。 | |
http://download.100ask.net/index.html | 韦东山嵌入式资料中心,有些STM32和linux的相关资料也可以来这里找。 | |
博客参考 | http://www.openedv.com/ | 开源网-原子哥个人博客 |
http://blog.chinaaet.com/jihceng0622 | 博主是原Freescale现NXP的现场应用工程师 | |
cortex-m-resources | 这其实并不算是一个博客,这是ARM公司专家Joseph Yiu收集整理的所有对开发者有用的官方Cortex-M资料链接(也包含极少数外部资源链接) |
- STM32
STM32 | STM32 HAL库开发实战指南——基于F103系列开发板 | 野火STM32开发教程在线文档 |
STM32库开发实战指南——基于野火霸道开发板 | 野火STM32开发教程在线文档 |
- SD卡
SD Association | 提供了SD存储卡和SDIO卡系统规范 |
- 字符编码参考网站
千千秀字 (qqxiuzi.cn) | 字符编码及转换测试 |
Unicode – The World Standard for Text and Emoji | Unicode官网 |
点击查看相关文件下载
STM32F103xx英文数据手册 | STM32F103xC/D/E系列的英文数据手册 |
STM32F103xx中文数据手册 | STM32F103xC/D/E系列的中文数据手册 |
STM32F10xxx英文参考手册(RM0008) | STM32F10xxx系列的英文参考手册 |
STM32F10xxx中文参考手册(RM0008) | STM32F10xxx系列的中文参考手册 |
Arm Cortex-M3 处理器技术参考手册-英文版 | Cortex-M3技术参考手册-英文版 |
STM32F10xxx Cortex-M3编程手册-英文版(PM0056) | STM32F10xxx/20xxx/21xxx/L1xxxx系列Cortex-M3编程手册-英文版 |
SD卡相关资料——最新版本 | 有关SD卡的一些资料可以从这里下载 |
SD卡相关资料——历史版本 | 有关SD卡的一些历史版本资料可以从这里下载,比如后边看的SD卡2.0协议 |
SD 2.0 协议标准完整版 | 这是一篇关于SD卡2.0协议的中文文档,还是比较有参考价值的,可以一看 |
我们要是想显示不同大小的字符怎么办?重新生成不同大小的字模?这当然是可以的啦,但是吧,要是需要的大小有很多怎么办,比如说我们需要16x16的,32x32的,64x64的,……,这样的话,都生成数组,然后放在文件里嘛,中文也都做成字库嘛?这样其实是可以的,只要内存足够就行,但是这样其实是很浪费资源的,它们的字模都是一样的,但是仅仅就是大小不同,我们就不能用一张表,然后对字体进行缩放,得到其他大小的字模嘛?当然可以啦,下边就来学习一下这个字模缩放的流程啦。
注意后边主要是以英文字模的缩放为例,来说明缩放的原理,我们使用的字模大小为宽16高16,对应到英文的话,就是宽8高16啦。
一、基本原理
其实对于字模缩放来说,基本原理很简单,我们以之前从linux内核源码中复制出来的8x16的字模 “A”为例。
1. 原字模数据
1.1 字模数组
它对应的字模数组为:
1 | uint8_t fontdata_8x16[] = { |
1.2 打印函数
1 | void printf_Charater_8x16(void) |
1.3 打印效果
2. 横向放大2倍
2.1 基本原理
我们想要横向放大两倍,那么我们可以采用这样的方式,我们将每一列,都复制一列,然后填充到这一列的后一列:
2.2 字模数组
1 | uint8_t fontdata_16x16[] = { |
2.3 打印函数
1 | void printf_Charater_16x16(void) |
2.4 打印效果
3. 纵向放大2倍
3.1 基本原理
与横向放大类似,只是每行往下一行复制一行,行数加一倍:
3.2 字模数组
1 | uint8_t fontdata_8x32[] = { |
3.3 打印函数
1 | void printf_Charater_8x32(void) |
3.4 打印效果
4. 整体放大2倍
4.1 基本原理
整体放大的原理与上边类似,只是综合了横向放大和纵向放大:
4.2 字模数组
1 | uint8_t fontdata_16x32[] = { |
4.3 打印函数
1 | void printf_Charater_16x32(void) |
4.4 打印效果
5. 循环与宽高
从上边我们可以得到如下结论
原始宽高 | 目标宽高 | 缩放说明 | 字节数 |
---|---|---|---|
8x16 | 8x16 | 不缩放 | 16行数据,每行8位(一个字节) |
8x16 | 16x16 | 横向放大2倍 | 16行数据,每行16位(两个字节) |
8x16 | 8x32 | 纵向放大2倍 | 32行数据,每行8位(一个字节) |
8x16 | 16x32 | 整体放大2倍 | 32行数据,每行16位(两个字节) |
我们要是按行处理的话:
1 | 需要处理的行数 = 高 |
二、缩放实现
我这里只是实现了英文字符的缩放实现,主要是熟悉一下原理。
1. 位到字节的映射
首先,我们为了方便处理,将字模的每一个像素点都映射成一个字节,就是原本一个像素点是一个位表示的,现在扩展到1个字节,扩展后的这个字节依然表示这个像素点点亮或者不点亮,取值只有1和0两种,仅仅是从一个位变成了一个字节而已。
1 | /** |
函数实现可以查看Hardware/lcd.c · sumumm/STM32F103-Prj - 码云 - 开源中国 (gitee.com)
2. 字模缩放
1 | /** |
函数实现可以查看Hardware/lcd.c · sumumm/STM32F103-Prj - 码云 - 开源中国 (gitee.com)
3. 显示缩放后的字符
1 | /** |
函数实现可以查看Hardware/lcd.c · sumumm/STM32F103-Prj - 码云 - 开源中国 (gitee.com)
4. 测试函数
1 | void LCD_Test(void) |
最后缩放确实是实现了,但是以我所使用的字体,放大后锯齿特别严重,这个吧,可能还需要算法优化,以后再说吧。