少走弯路:单片机使用点阵字体通过像素化的正确获取

PCtoLCD2002完美版:嵌入式点阵显示开发的字模提取与图像取模终极指南 在嵌入式系统开发中,点阵显示是连接单片机与用户界面的基础技术。其核心原理是将图形或文字转换为由0和1组成的二进制数据(即字模),通过特定扫描方式驱动屏幕像素亮灭。这项技术对于资源受限的嵌入式设备具有重要价值,能实现高效、低功耗的定制化显示。在OLED、LCD等屏幕驱动场景中,取模工具是生成显示数据的关键。PCtoLCD2002作为一款经典的点阵字模提取软件,通过设置取模方式、阴码阳码等参数,可精准生成匹配硬件的十六进制数组。本文结合取模方式、阴码阳码等核心概念,深入解析如何利用该工具高效完成从图像到单片机代 阅读详情

要在单片机内自由显示文字,必须准备相应的字库。之前也发文介绍过:

在esp32(esp8266) 提供软字库显示中文的解决方案_esp32中文字库-优快云博客

包括已经开源的项目:

https://github.com/StarCompute/tftziku

 这种字体获取思路是:把GB2312字符集输出到一块画布上,然后获取画布的像素点,依照像素点的值解析成0或者1。单片机的输出类似如下:

 对于字符的显示基本没有问题,但是如果你仔细看就会察觉到这里面有瑕疵:

“2”显示不完整,3的显示不标准。

造成这一问题的原因是因为字符被输出到画布的时候都会边缘模糊,每个像素都是RGB的,哪怕我们使用的字体颜色是纯黑black也同样有这个问题,所以在实际生成这个字库的时候使用了某个值来判断,例如:

            if dotpix[0] > 90 and dotpix[1] > 90 and dotpix[2] > 90:
                # img.getpixel()
                ss += " 1"
                chars += "1"

            else:
                ss += "  "
                chars += "0"

上面的dotpix是dotpix = img.getpixel((d, i)) 从画布获取的对应像素点,dotpix是个RGB的像素点,这个90是一遍一遍尝试过后相对最优的取值。

这个判断值如果给的太大,字库会存在残缺,反之出现严重的粘连,笔画越密集的地方越容易出问题。

这个问题困扰了好久,尝试过各种方案都无法解决,你们从网上能找到的字符像素化很多都是HZK16这种宋体16号的字库,如果要使用其他楷体,雅黑等等以及不同字号的时候就无解了。

哥有强迫症,隔一段时间就尝试找一下方案,各种调整参数,反正各种折腾下来这个时间跨度有一年以上了,直到今天又看了一下,还是不行,然后深入了一下:

im = Image.new('RGB', (256, 256), (0, 0, 0))

在这个Image对象的new方法中深入了一下,看到了

    im = Image()
    if mode == "P" and isinstance(color, (list, tuple)) and len(color) in [3, 4]:
        # RGB or RGBA value for a P image
        from . import ImagePalette

        im.palette = ImagePalette.ImagePalette()
        color = im.palette.getcolor(color)

这个mode,除了RGB和RGBA外居然还有一个P,虽然不懂这个P到底是干啥的,但是大胆尝试了一下:

im = Image.new('P', (256, 256), (0, 0, 0))

这一改就发现之前的dotpix = img.getpixel((d, i)) 工作不正常,以前是个RGB的像素点,现在居然这个像素点直接返回了0或者1,我靠,一下就猜测可能这次对了。

以前是:


            dotpix = img.getpixel((d, i))
            if dotpix[0] > 90 and dotpix[1] > 90 and dotpix[2] > 90:
                # img.getpixel()
                ss += " 1"
                chars += "1"

            else:
                ss += "  "
                chars += "0"

现在是:


            dotpix = img.getpixel((d, i))
            chars+=str(dotpix)

验证如下:

            
            
 111        
1   1       
1   1       
   1        
  1         
 1          
1           
11111       
            
            

    对比一下像素方式生产的结果:



     1 1 1
   1     1
   1     1
         1
       1

         1
   1 1 1 1

最后重新生成的字库显示如下:

这个就是完全正常的,和PCtoLCD2018的输出是一模一样的 。

两种不同模式生成的字放大很多倍后进行对比:

前面是RGB模式,后面是P模式,简单的看就是一个锯齿的问题,其实并不是这么简单,因为这其实又涉及到两种图的基本构成,所以并不是简单的锯齿化这个问题。

详细代码就不贴出来了,了解了原理怎么都可以写出代码来。

ESP32 带字库显示中文终极方案 不论要使用GB2312整体字符集还是自定义部分中文,整体便捷性都基本达到了最优,这是其他方案无法替代的。目前迎来了大结局:这个在esp32,esp8266上显示中文的方案已经做到了最优,项目被开源到了。调用方式被优化,各种注释被加进去,存储编码从16进制化成了终极的64进制,已经不能再调整进制了。要知道最初接触这块内容,使用其他方案可是1000K左右啊!下面是不同字号,不同编码方式宋体字符在GB2312的字库大小对比。字库生成后自动上传到单片机等等,反正能做的优化全做了。 阅读详情

相关推荐

从时序到指令集:1602液晶屏驱动原理与51单片机实战指南

在嵌入式系统开发中,液晶显示模块是实现人机交互的基础外设之一。其核心原理是通过控制器接收并解析指令与数据,驱动液晶面板按特定时序显示字符。掌握液晶驱动的关键在于理解其通信时序、指令系统与存储器映射,这不仅能实现稳定显示,更是学习更复杂显示设备的基础。以经典的HD44780控制器为例,它通过一套清晰的指令集管理显示数据,开发者需严格按照时序图操作RS、E、R/W及数据总线。这种底层驱动技术广泛应用于温湿度监控、设备状态指示等需要简单文本显示的嵌入式场景。本文以1602字符液晶模块为具体案例,深入解析其指令系统

weixin_30378623的博客 382

自己设计一种运行在单片机的嵌入式gui图形库—字体转换工具

2、移植矢量字体解码库stb_truetype。3、编写字体转换的代码。

ttlalu的博客 612

STM32F103C8T6驱动ST7735彩屏全流程(附工程文件下载)

本文详细介绍了使用STM32F103C8T6微控制器驱动ST7735 TFT彩屏的完整流程。内容涵盖硬件SPI连接、底层驱动程序编写、模块化软件架构设计以及高级图形与字体显示功能的实现,并提供了高度解耦、易于移植的完整工程文件,帮助开发者快速点亮屏幕并构建嵌入式图形界面。

weixin_29194817的博客 432

单片机系统中的一种文字平滑(抗锯齿)显示方法(附取模软件)

这是之前一个项目中已实现的方法,现在整理后拿出来分享。 单片机系统中文字显示部分一般用的是用取模软件取出字模后输出到屏幕上显示,这种方式显示的字体有锯齿,在DPI低的显示屏上锯齿效果非常明显。对于单色屏来说,这种情况无解。但是对于彩屏来说,如果还是用这种方式就显得有点落伍了,由于屏幕可显示的颜色丰富了许多,完全可以把显示效果做得更好,至少去掉字体边缘的锯齿。 一、思路 1、自制字体取模软件,...

dalingjishunan的博客 7899

51单片机IIC OLED驱动开发:从协议解析到Proteus仿真与实物调试

IIC(Inter-Integrated Circuit)是一种同步、半双工的串行通信总线协议,广泛应用于微控制器与外围设备(如传感器、存储器、显示屏)之间的短距离通信。其核心原理是通过SCL时钟线和SDA数据线,在主从设备间以起始/停止信号、数据位传输及应答机制实现可靠的数据交换。掌握IIC协议对于嵌入式开发至关重要,它能帮助开发者高效驱动各类外设,构建稳定可靠的硬件系统。在嵌入式显示领域,OLED屏幕因其高对比度、低功耗等优点被广泛采用,而通过软件模拟IIC驱动OLED(如SSD1306芯片)是常见的工

weixin_34210740的博客 338

ST7735显示模块新手教程:从点亮到显示文字

手把手教你如何点亮st7735屏幕并实现文字显示,涵盖接线、初始化和代码调试全过程,适合初学者快速上手st7735这类小型TFT屏幕的应用开发。

weixin_42596214的博客 1155

STM32汉字显示方法

cc936 里面包含的两个数组 oem2uni 和 uni2oem 存放 unicode 和 gbk 的互相转换对照表,这两个数组很大,这里我们利用 ALIENTEK 提供的一个 C 语言数组转 BIN(二进制)的软件:C2B 转换助手 V1.1.exe,将这两个数组转为 BIN 文件,我们将这两个数组拷贝出来存放为一个新的文本文件,假设为 UNIGBK.TXT,然后用 C2B 转换助手打开这个文本文件,然后点击转换,就可以在当前目录下(文本文件所在目录下)得到一个 UNIGBK.bin 的文 件。

m0_70118892的博客 6814

LVGL嵌入式GUI开发实战:从移植到性能优化全记录

在MCU资源受限的嵌入式环境下,图形界面开发一直是个难题。传统裸机自绘需要手动管理像素、坐标和刷新逻辑,代码复杂且难以维护。而嵌入式图形库LVGL凭借轻量、可移植、开源的特点,成为单片机UI开发的主流选择。它通过局部缓冲与脏矩形机制,在仅有几十KB内存的单片机上也能流畅运行,同时提供控件、布局、动画和事件系统,让开发者从底层绘图细节中解放出来,专注于产品交互逻辑。本文从实际工程出发,讲解LVGL的移植要点、显示缓冲配置、SPI屏与DMA提速方法,并针对中文字体、内存紧张、触摸漂移等高频问题进行排查思路梳理,

weixin_29190651的博客 180

使用51单片机控制lcd1602字体显示

51单片机(BST)+1602显示屏。注:X表示可以是0,也可以是1;代码一: 要求显示字母‘a’

李明的博客 1992

基于ESP8266与GP1287 VFD屏打造网络时钟:硬件驱动与NTP同步详解

在物联网和嵌入式开发领域,微控制器与显示设备的交互是基础且核心的技术环节。其原理在于主控芯片通过特定的通信协议(如SPI、I2C或并行总线)向显示控制器发送数据与指令,从而控制像素的亮灭以呈现信息。这项技术的价值在于能够将处理器的运算结果可视化,是人机交互的关键接口,广泛应用于智能家居、工业仪表和消费电子等场景。本文聚焦于一个具体的工程实践:利用ESP8266 Wi-Fi模块驱动一块GP1287真空荧光显示屏(VFD)构建网络时钟。其中,ESP8266作为主控,负责通过NTP协议从互联网同步精确时间,而GP

weixin_34259816的博客 302

STC89C52RC驱动0.96寸OLED屏:从SPI通信到图形显示实战

在嵌入式系统开发中,单片机与外围设备的通信是核心基础。串行外设接口(SPI)作为一种高速、全双工的同步通信协议,因其接线简单、速率高而被广泛用于连接传感器、存储器和显示模块。其工作原理基于主从架构,通过时钟线同步,在数据线上进行逐位传输,实现对设备的精确控制。这项技术的价值在于能够以极少的IO口资源,高效驱动复杂的片上系统。在物联网设备、便携式仪器等应用场景中,常需通过SPI驱动OLED显示屏来构建人机交互界面。本文聚焦于使用经典的STC89C52RC单片机,通过模拟SPI协议驱动基于SSD1306芯片的0

weixin_33314040的博客 267

【STM32学习】基于I2C协议的OLED显示(利用U8G2库)

这次的博客主要了解学习了I2C协议和时序协议,移植修改u8g2代码,利用u8g2库实现界面可视化技术,让嵌入式学习变得可视化,变得精彩。

2301_78895982的博客 1601

ST7567A驱动程序解析:一步步点亮12864点阵屏

在嵌入式显示应用中,LCD控制器是连接MCU与点阵屏的桥梁。ST7567A作为常见的单色LCD控制芯片,负责管理128×64点阵的显存和扫描时序,通过SPI或并口协议接收命令与数据。理解其显存分页结构、A0指令/数据切换时序以及初始化序列,是编写可靠驱动代码的前提。掌握这些底层原理不仅能快速点亮屏幕,还能有效排查白屏、花屏、显示错位等常见故障,显著提升开发效率。在STM32、Arduino或51等平台的项目中,无论是调试COG封装的12864屏,还是移植现成例程,都需要熟悉ST7567A的驱动流程。从解压一

weixin_33314040的博客 241

字体像素化很多都是错的

昨天的推送谈了字体像素化的纠偏问题。

Sean.Pu的专栏 646

快乐8 Ai大模型XGBoost LightGBM预测系统

随机森林回归:通过集成多个决策树模型,提高预测的准确性和稳定性。XGBoost:一种基于梯度提升的强大模型,擅长处理结构化数据。LightGBM:一种高效的基于决策树算法的分布式梯度提升框架,具有快速的训练速度和低内存消耗。高预测准确率:通过集成多种模型,提供更为精准的预测结果。多种预测方法:支持同尾号、重号、温号、连号和综合预测等多种预测策略,满足不同用户的需求。实时日志:在预测过程中,用户可以实时查看系统的预测进度和结果。

m0_72636583的博客 1万+

神联动:LSTM+卡尔曼滤波!一区大门轻松开!

近来热度飙升,成为时间序列预测和状态估计等领域的香饽饽,非常好发高区!主要在于:这两者结合,不仅能提高模型预测准确性;还能拓展应用场景,为我们的论文创新提供发挥空间,且当下还在蓝海阶段,还不算卷。具体点说:卡尔曼滤波擅长处理线性状态估计和噪声,能使LSTM更好地适应动态环境的变化,减少噪声干扰,降低预测误差。而LSTM通过捕捉长期依赖关系,擅长处理非线性时间序列,能够弥补卡尔曼滤波在这方面的不足,从而把应用场景从传统的状态估计,延伸到金融预测、工业检测、自动驾驶等任务。

2401_82426425的博客 2209

字模软件实战指南:从PCtoLCD2002到LcmSim的高效开发技巧

本文为嵌入式开发者提供了一套从PCtoLCD2002到LcmSim的字模软件高效开发实战指南。文章详细对比了PCtoLCD2002、LcmZimo、TakeDotLib和LcmSim等核心工具的特点与适用场景,分享了字体生成、效果模拟、代码集成及自动化工作流等关键技巧,旨在帮助开发者快速构建清晰的嵌入式显示界面,规避常见开发陷阱。

u0v1w2x3的博客 257

T分布和T检验的理解,Python代码实现T检验的计算

每天学习一点,每天进步一点。 声明:本人所有的原创,都是自己在学习过程中的记录点滴,不一定都是对的,肯定也会有一些错误的想法。所以大家看一看就好,不可尽信。当然也欢迎指出。 T分布 定义,有来自标准正态分布的样本X ~ N(0,1),和来自卡方n分布的Y ~ X2(n), 那么有 Z= X/√(Y/n) 成为符合自由度为n的T分布 我们用Python代码画一下他的图形 # 给一个自由度,返回这个自由度的卡方分布 X²(n) def product(n): n = np.ceil(n).astype

PY_smallH的博客 8485

ESP32+LCD12864实战:中文显示与自定义图标仪表盘教程

点阵液晶屏是嵌入式设备常见的显示方案,而12864分辨率的小尺寸LCD凭借低成本、低功耗和成熟生态,在工业仪表、家电面板中应用广泛。理解其控制芯片(如ST7920)的指令集和接口模式,是驱动显示的基础;借助U8g2图形库,开发者无需关心底层时序,即可快速实现文本、图形和位图渲染。这一技术栈尤其适合需要简洁中文界面的场景,结合ESP32的高性能和丰富外设,能够轻松构建环境监测、数据可视化等交互界面。本文基于ESP32与ST7920控制器的12864液晶屏,从硬件接线、软件配置到中文字体渲染与自定义图标取模,完

weixin_33928137的博客 189

YOLOv13改进策略【Neck】| CVPR2024 LGAG:大核分组注意力门模块,3×3分组卷积与注意力协同的特征精准融合

本文记录的是利用LGAG 模块改进 YOLOv13 的颈部融合部分。(Large-kernel Grouped Attention Gate)通过3×3分组卷积与注意力机制结合,引导解码器处理特征与跳接特征的精准融合。本文利用模块,通过3×3分组卷积扩大感受野以捕捉更广泛局部空间上下文,同时结合注意力机制生成自适应注意力系数,对YOLOv13中关键目标特征赋予高激活值、抑制冗余背景特征,在特征融合阶段实现全局语义与局部细节的高效结合,减少计算成本的同时提升特征表达能力,增强模型对复杂场景下目标的检测精度与效

Limiiiing的博客 104

芒果YOLOv7改进04:Loss篇:原创改进损失函数Repulsion:独家首发最新改进Repulsion Loss解决目标遮挡场景下检测,为解决密集人群检测中遮挡设计的损失函数,打造高效检测器涨点

YOLOv7原创改进Repulsion|首发最新改进为解决密集人群检测中遮挡设计的损失函数

包括YOLOv5、YOLOv7、YOLOv8等模型改进 3253

STM32显示器选型与驱动实战:从接口协议到GUI集成的全解析

在嵌入式系统开发中,显示器作为人机交互的核心组件,其选型与驱动是连接硬件与应用的关键环节。从基本原理看,显示器通过特定接口协议与微控制器通信,将数字信号转换为可视信息。常见接口包括并行、串行(SPI/I2C)、RGB及MIPI DSI等,每种接口在速度、引脚资源和驱动复杂度上各有权衡。在STM32这类资源受限的MCU上,合理选择显示器类型(如段码屏、字符LCD、图形OLED或TFT)并优化驱动,能显著提升系统性能和开发效率。例如,通过FSMC外设驱动并行接口屏,或利用DMA加速数据传输,都是重要的工程实践。

weixin_33675507的博客 329

系统架构设计(以飞控系统、航电系统、机电管理系统、电子电气架构为例)

系统架构涉及对系统的结构和行为进行高层次的描述。它包括系统的组成部分、这些部分之间的关系、与外部环境的交互方式,以及满足特定功能和非功能性需求的方法。系统架构定义了系统的总体设计蓝图,指导系统的开发、集成、部署和维护。系统架构设计的目的是通过合理的结构和设计原则,确保系统能够高效、稳定、安全地运行,满足当前和未来的需求,同时具备良好的维护性、扩展性和可持续性。良好的系统架构不仅能够提高系统的开发效率和运行性能,还能降低长期的维护和运营成本,支持系统的持续演进和技术更新。

qq_41854911的博客 3052

STM32上LVGL中文字库显示全解析:编码、生成与外部存储方案

在嵌入式UI开发中,字符串编码与字符集映射是影响文本显示的基础机制。UTF-8作为一种通用编码标准,决定了MCU端如何解析中文字符;而字库文件的结构与存储方式,则直接影响渲染效率与资源占用。LVGL因其轻量高效被广泛用于STM32等平台,但默认并不包含中文字形,需要通过工具将TTF字体转换为LVGL可识别的格式。LvglFontTool是一款常用的字库生成工具,能够输出C数组或bin文件。针对单片机Flash和RAM资源受限的问题,业界普遍采用SPI Flash或SD卡存储字库,并通过按需加载或整体映射的方

weixin_29168675的博客 192

09 SAP CPI 访问公共API接口

我在网上找了一个公共API,入参输入汉字返回拼音。至此,一个真正的访问API的接口就做好了。点击保存时可看到红叉报错。

SAP CPI 477

国科大学习资料--VLSI测试与可测试设计--2020期末考试试题

国科大学习资料–VLSI测试与可测试设计–2020期末考试试题 国科大学习资料–VLSI测试与可测试设计–2020期末考试试题 国科大学习资料–VLSI测试与可测试设计–2020期末考试试题 一、概念题 1简述可测试性测度与两个主要的测度指标的含义; 2以March C-算法为例,说明March算法的构成,以及March C-算法的故障覆盖率; 3“效果-原因”诊断法和“原因效果诊断法”的不同; 4列举四条扫描设计时出现的问 题及解决办法; 5最少写出1149.1与1500的五点不同; = = = = =

无名何许人的博客 1150
上一篇: ESP32 开源WIFI MESH 库painlessMesh的一些说明
下一篇: 字体像素化很多都是错的
platform
博客等级 码龄26年 1117粉丝 351原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值