拓冰建站拓冰建站
首页 / 资讯中心 / 正文

PCtoLCD2002取模工具详解:从汉字点阵到OLED字模生成

简介PCtoLCD2002 完美版是一套面向图形设计、摄影后期、网页开发及视频制作等专业用户的显示器色彩校准工具用于解决屏幕偏色、跨设备色彩不一致、设计稿与成品差异明显等痛点。包内共 19 个文件以 exe 主程序为核心辅以 bpl 运行库、ini 配置、h 头文件、ptl 字库模板及 txt 说明文档整体包体积仅 1.15MB轻量便携解压即可使用。软件覆盖色彩管理、色彩校准、色彩空间转换等完整流程可细致调节亮度、对比度、色温与饱和度并支持 sRGB、Adobe RGB、Apple RGB 等常见空间转换满足跨平台工作流需求随包附带的 ASCII、GB2312 字库文件与使用说明能帮助用户快速理解字模取法、配置参数及校准步骤避免因色彩偏差返工。目前已有 155 人学习下载适合需要精准校色、追求视觉输出一致性的设计与影像从业者可直接利用该工具快速完成显示器色彩匹配。1. 为什么一个二十年前的取模工具到现在还有人到处找“完美版”先讲个场景。你做一个OLED小项目屏幕点亮了IIC和SPI的时序也调通了却发现屏幕上只能显示英文和数字。想显示一个“中”字查了半天字库表手算点阵算到头晕。这时候群里老哥甩过来一句话用PCtoLCD2002一键生成。这个软件我第一次接触是在大学做智能小车的时候。当时以为只是个简陋的小工具结果十几年过去我电脑上换了好几台这个软件的压缩包却一直在收藏夹里躺着。虽然现在新的取模工具也不少比如有些在线取模网页、VS Code插件、甚至Image2Lcd这类的付费软件但只要涉及汉字点阵、OLED屏、LCD模块的字模提取绝大多数人首先想起的还是PCtoLCD2002。原因很简单免费、绿色、不用安装、功能足够、界面还是中文的。至于网上流传的“PCtoLCD2002 完美版”其实是相对于早年间一些有功能限制的版本而言的。有些旧版本只支持16x16字模或者生成的数组格式写得比较死不能自定义字节宽度和取模方向。“完美版”的字库更全支持多种取模方式可以灵活配置生成C51格式的数组。不过说实话所谓“完美版”也不是什么官方版本而是各路高手在原始软件基础上整合字库、调整默认配置后重新打包的。这也是为什么你在不同网站下载到的“完美版”界面略有差异默认参数也不完全一样。但核心功能是一致的学会一套其他版本基本都能上手。这软件适合谁用很明确做单片机开发的、画PCB顺带写固件的、玩Arduino和ESP8266/ESP32的、以及做嵌入式课程设计的学生。它解决的核心问题只有一个——把“字符和图片”翻译成“点阵字节数组”让MCU能直接拿去驱动LCD/OLED屏幕。2. 拿到软件先别急着用界面逻辑和关键参数之间的关系第一次打开PCtoLCD2002的人多半会先被那一堆选项搞懵。界面左侧是字模预览区右侧是各种模式和参数设置。很多人上来就输入汉字点“生成”确实能出数组但大概率点出来的字在屏上是倒的、反的、横七竖八的。这不是软件有问题而是它的设计逻辑要求你先弄清楚屏幕和驱动方式再反过来设置参数。2.1 先搞清楚你的屏幕是“逐行扫描”还是“逐列扫描”这个软件最关键的一个设置就是取模方式。常见的有“逐行式”、“逐列式”、“行列式”等。你得先知道你的屏幕驱动IC是怎么把显存映射到像素点的。比如SSD1306这类OLED驱动它的显存是按页page组织的每一页是8个像素高从左到右逐列排列。SPI传输默认就是逐列传输。所以如果你用的是SSD1306驱动取模方式一般选择“逐列式”并且方向是从左到右、从上到下。而传统的1602、12864这类并行LCD或者某些用KS0108驱动的屏幕是按行扫描的那就得选“逐行式”。这一点如果选错屏幕上的字会被撕裂、错位看起来像乱码。一个很典型的现象你用SSD1306选了逐行式生成的字模放进程序里屏幕上显示的汉字各段是错开的上半部分和下半部分完全不在同一个位置。2.2 阴码、阳码、字节倒序这些不是玄学在PCtoLCD2002里还有个容易让人犹豫的地方“阴码”和“阳码”的选项。我这里给你一个实用的对应关系阴码1表示点亮0表示熄灭。也就是说你取出来的数据里为1的位对应屏幕上的亮点。适合屏幕驱动里往显存直接写高电平亮的屏。阳码0表示点亮1表示熄灭。适合那些驱动IC里写0才亮的屏或者你后续代码中做了按位取反操作。大部分单片机驱动的OLED和LCD用的是阴码就是数据位的“1”亮。但具体还得看你驱动函数怎么写的。假如你用的移植例程里的画点函数是往显存写1代表亮那就选阴码如果它的底层是写0亮就选阳码。这个判断方法非常直接不需要去翻屏幕的数据手册。字节倒序这个问题在串行传输的屏上比较多见。如果你生成的数组发到屏上显示出来是每个字节的位左右镜像了比如“丨”变成了像镜像的竖线那就是字的左右反了。这时候不要重新取模直接在软件里勾选“字节倒序”或者“高低位交换”重新生成即可。这个选项在PCtoLCD2002的界面里叫法不一老版本叫“高位在前/低位在前”新整合版本叫“反转字节”实质都一样。2.3 字宽、字高和偏移量参数不是摆设选字模式时比如你选16x16得明白这个尺寸的含义。16x16汉字就是每个字符用一个长16像素、宽16像素的方阵来表示。但实际很多显示屏不是刚好16像素对齐的。比如你OLED是128x64分辨率显示4行每行8个汉字平均每个汉字占16x16那正好。可如果你要做开机动画需要一个大号的“温”字想让它占32x32阵列那你不能直接在软件里输入一个汉字然后选32x32吗可以但要注意PCtoLCD2002自带的字库是点阵字库通常16x16居多你强行选32x32软件会用插值放大出来的字边缘会有锯齿。我的做法是大字尽量用矢量字库来转或者先用画图软件把文字写成位图再导入到PCtoLCD2002用“图形模式”来自动提取点阵。这个思路很多新手不知道但做出来的效果比硬拉字库好太多。偏移量这个参数主要是当你需要字模在屏幕上有一定边距或内部缩进时用的。比如你做一个带边框的菜单项想让文字在框内居左5个像素那就把横向偏移设为5生成的字模就自动带出偏移。实测下来这个参数在给OLED菜单排版时特别好用。3. 把“你好”变成OLED能直接用的数组完整操作步骤这一节我直接带你走一遍完整流程。假设你的屏幕是0.96寸OLED驱动IC是SSD1306接口IIC分辨率128x64MCU是STM32F103C8T6。目标在屏幕上居中显示“你好”两个字每个字16x16生成C语言数组。3.1 设置参数的点位顺序打开PCtoLCD2002照着我的顺序设置别跳着选模式选“汉字”而不是“图形”。字体大小那里输入16宽和高都填16字体选宋体或者仿宋都行点阵效果差异不大。取模方向选“逐列式”。取模走向选“从左到右从上到下”。输出数制选“十六进制”。勾选“自定义格式”在格式框里填0x%02X,这样可以生成标准C数组元素。阴码多数屏幕选这个如果你的驱动例程反着来的选阳码再试。每行显示数据数填16也就是生成后每行16个字节。这些设置里面最容易出错的是第3步和第5步。逐列式对应SSD1306的页寻址模式如果你用页寻址方式刷屏选这个没错。十六进制输出则是为了后续代码能直接用{0x00, 0x3E, ...}这样的格式粘进数组。3.2 生成字模并修正格式设置完成之后在左侧输入框里写入“你好”点击“生成字模”。你会看到右侧预览区出现一个16x32的点阵预览两个汉字上下排列。下方输出区有一段C语言格式的数组。这里有个小坑PCtoLCD2002默认会把多个字连续排列但部分版本不加分隔符你需要确认每一行的末尾是逗号。如果用的是我上面填的自定义格式0x%02X,那么每生成一个字节就会自动带逗号直接复制就行。复制出来的数组类似这样const unsigned char code font_your_hello[32] { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x08, 0x08, 0x08, 0x7F, 0x00, // ... 中间省略 ... };注意如果你的编译器是GCC比如Keil MDK的AC6或者STM32CubeIDE要去掉code关键字。code是Keil C51编译器用来把数据放到ROM的写法ARM编译器不认识它。每次看到有人把code一粘贴到STM32工程里编译报错我就知道又是直接照搬了51的取模示例。3.3 写入取模函数把数组刷到屏上拿到字模数组之后要配合一个显示函数来用。SSD1306的基础画点函数通常长这样void OLED_DrawPoint(uint8_t x, uint8_t y, uint8_t t);然后显示一个16x16汉字的核心逻辑是逐字节扫描字模数据根据每一位是否为1决定是否画点。伪代码如下for (int i 0; i 16; i) { // 16列 for (int j 0; j 2; j) { // 每列2个字节因为16行像素分两个8位字节 for (int k 0; k 8; k) { if (font_your_hello[i * 2 j] (0x01 k)) { OLED_DrawPoint(x i, y j * 8 k, 1); } } } }这里需要特别提醒取模方向“逐列式”情况下i * 2 j这个索引顺序和字节内位的顺序对应关系取决于你选的是“低位在前”还是“高位在前”。多数情况下上面这段代码配合“低位在前”是能直接用的。如果你发现字是斜着被拆开的那大概率是位顺序反了改成(0x80 k)再试即可。第一次跑通之后把“你好”换成你自己的菜单名把显示坐标用宏定义提出来以后改内容只需要在软件里重新生成数据复制粘贴进常量表编译下载就完事。4. 图片转点阵、自定义字库这些扩展玩法其实很好用很多人以为PCtoLCD2002只能提取汉字点阵其实它的图形模式也相当能打。要做开机LOGO、显示物联网设备的状态图标或者把一张32x32的小图变成OLED上能显示的界面都可以用这个工具。4.1 从位图到字模图片取模的操作细节打开软件模式切换到“图形”然后“文件”菜单里“打开图像”。这里首先要注意图像格式和尺寸。PCtoLCD2002对BMP格式兼容性最好PNG格式的图片也支持但颜色深度要注意。它本质上是把图片按颜色阈值二值化不是做灰度图。彩色图片最好先在画图软件里转成纯黑白两色否则取模出来的边缘会很脏。具体操作为先准备好一张BMP位图尺寸尽量和显示区域一样。比如我要在OLED左上角显示一个16x16的心形图标那就先在画图软件里把画布尺寸改成16x16用铅笔工具画好纯黑白的图形保存为BMP再导入PCtoLCD2002。导入后软件会显示一个放大后的预览图。点“生成字模”你会看到输出区出现一个数组其数据结构同样遵循你设定的取模方式。我一般把这种方式生成的数组当作图标资源来管理一个数组代表一个图标代码里用统一的绘图函数绘制。图片取模比文字取模更容易出现“字反了”的情况因为图片本身有左右概念。文字反了你可能能猜出来图片反了你一下子能看出来图标是左右颠倒的。遇到这种情况不需要去折腾原图直接在软件的取模走向选项里勾选“从右到左”或者勾选“水平镜像”再重新生成。4.2 把PCtoLCD2002当作字库生成器来用除了直接生成数组PCtoLCD2002还可以批量生成整套字库。很多做家用小仪表的开发者需要在程序里动态显示温度、湿度、电压、时间等数字这些数字如果用图片图标搞定太费事如果动态画又涉及字库索引。更实用的做法是在PCtoLCD2002里选“ASCII字符”模式一次性生成“0~9、A~Z、a~z、冒号、句号、负号”这些字符的字模存成一个大数组。用的时候通过字符的ASCII码减去起始字符的ASCII码得到偏移量再从大数组里定位到对应字模数据。这种做法的好处是你只需要一张16x8的ASCII字模表全屏幕的数字和英文都可以动态显示内存占用非常小特别适合只有几KB RAM的芯片。4.3 用自建BMP实现艺术字和特殊符号OLED上要显示中文艺术字或者复杂的特殊符号比如电池电量图标、WiFi信号标志别想着在字库里找因为点阵字库根本不可能覆盖到这些。标准做法是用系统自带的画图软件新建一个32x32的画布用文字工具选择自己喜欢的字体输入内容或者用图形拼出所需符号然后保存为单色BMP再导入PCtoLCD2002生成字模。画布尺寸建议用8的整数倍不光方便取模也方便你推算显示时的行列关系。生成之后放在程序里你会得到一个带锯齿感的漂亮图标这在OLED小屏幕上观感很好因为屏幕本身像素颗粒大点阵风格反而更协调。5. 那些年大家踩过的坑方向不对、反白、字节顺序错乱的排查链路这个工具给人的第一印象简单但实际用起来几乎每个刚上手的人都会在屏幕显示效果上翻车。这里我总结几条最典型的问题并给出从“现象”到“原因”再到“解决”的完整排查思路你下次遇到可以直接对着查。5.1 现象一汉字是反的或者左右对调屏幕上显示的字左右镜像了比如“中”字的竖线跑到了右边。这种问题一般是取模方向或者字节位序的问题。排查步骤如下第一步检查“逐列式/逐行式”是否选对。SSD1306的SPI/IIC写入显存按列扫描选逐列式。如果你之前选的是逐行式把方向改过来重新生成字模立竿见影。第二步看字节内位顺序。如果选“逐列式”但是字依然镜像那就是字节倒序的问题。在软件里勾选“字节倒序”或者设置高低位交换重新生成。第三步如果字不是完全镜像而是左右各半互换、像撕裂一样那是驱动函数里画点循环的列索引和字模的列索引错位了。检查代码中的for循环确认列号和字模数据的对应关系。5.2 现象二显示出来的字是“反白”的亮的地方不亮暗的地方亮这个就很简单了你的阴码/阳码选反了。不需要重新取模在代码里对每个字节做~data按位取反或者回到软件改选另外一个选项重新生成。我通常的做法是在代码里写一个预处理宏比如#define OLED_REVERSE(data) (~(data))这样在调试时切换显示极性时非常快不用重新粘贴数据。5.3 现象三字是好的但整体错位了像被搓麻花一样这种情况多半是“取模走向”和屏幕扫描方向不一致。比如屏幕是左上角开始扫描但你在软件里选了“从右到左、从下到上”那么字就会以屏幕中心为轴旋转。解决办法是统一取模走向标准配置是“从左到右、从上到下”。另外还有一个隐蔽的原因单片机端显示函数里的x、y坐标做了翻转。比如你明明往(0,0)画点屏幕实际点亮的却是(0,7)。这时候从软件方面怎么调都没用得检查你的OLED_Set_Pos或者Set_Column、Set_Page函数设的坐标是不是跟显存映射一致。STM32的SSD1306例程里常见一个错误是OLED_WR_Byte(0xB0 y, OLED_CMD);这行的页地址计算如果是y方向写死的话显示位置就会整体偏离。5.4 现象四数组长度不对编译报错数组越界这也是常见的低级错误。16x16汉字16列每列2字节总共32字节。如果你生成出来的数组长度不是32而是40那说明取的还是旧版字库或者设置里“横向取模”没选对。不要在图方便直接硬改数组长度回到软件里检查“每行显示数据数”和“字宽×字高/8”是否匹配。对于16x16的字每行显示16字节才是对的8字节是另一套标准。6. 我的日常用法和一些压箱底的建议最后说点我自己的使用习惯算是个人的经验总结你可以把它当成一种参考不必全盘照搬。一是统一字模格式。我手头所有项目的字模生成规则都固定了取模方向逐列式、从左上角开始、16位/8位统一、阴码、十六进制输出、每行16字节。这样不管换哪个项目我从旧工程里拷贝字模数组过来稍微改一下数组名就能直接用。二是给字模数组加注释。生成之后我在数组前面会加一行注释标明“这是哪几个字、尺寸多少、取模方向是逐列式、阴码”。这个习惯帮我省了非常多时间。你想想半年后打开一个工程看到一堆十六进制数组完全没有注释你根本不知道该往哪个坐标放、起点是哪里。而只要有一行注释所有信息一目了然。三是不要迷信“完美版”。PCtoLCD2002的“完美版”和普通版在核心取模功能上并没有本质区别主要差异在于内嵌字库是否完整、默认设置是否顺手。如果你只是日常显示汉字随便一个能跑起来的版本都够用。我见过有人为了找所谓“完美版”到处下载结果压缩包带了个全家桶反而浪费大量时间。关键还是把自己常用的那套参数固化下来记在笔记里比什么版本都管用。最后补充一个小技巧每次生成的数组我会顺手把它存成一个单独的头文件例如font_menu.h里面只放常量数组。这样主程序代码干净而且如果后续要改菜单文字只替换这个头文件就行不用动其他逻辑代码。我做的时间显示界面、温湿度仪表盘、配网页面都是靠这种“一个页面一个字模头文件”的方法来组织的实测工程维护效率很高。PCtoLCD2002这个软件论界面它停留在上世纪论功能今天的在线工具也未必比它顺手。可能这正是它能在嵌入式圈子里活这么多年、至今还被大家称作“完美版”的原因——它把一件小事做到了极致做成了无数单片机开发者绕不开的基础设施。本文还有配套的精品资源点击获取
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门