Skip to content

取模软件在线版(字模提取 / 汉字取模 / 图片取模)

免费在线取模软件,PCtoLCD2002 的网页替代,Mac/Linux 免安装:汉字取模、图片取模生成 OLED/LCD 的 C 数组,12×12、16×16 点阵字库不糊;显示乱码?粘贴字模数组反查取模方式。SSD1306、Adafruit GFX、U8g2 一键预设。

无追踪 浏览器中运行 免费
全部在浏览器本地完成——文字和图片不会离开你的设备。

对应 SSD1306 / SSD1309 / SH1106 / ST7565 的页显存和 MicroPython framebuf.MONO_VLSB——字节可直接写入屏幕。

点阵预览

点击像素可翻转亮灭。
    4 个字 · 128 字节
    对照表:「中」(16×16)在每种取模方式下的字节

    阴码,GNU Unifont 字形。拿这些字节和你手里的数组对比,就能看出它是按哪种方式取的。

    取模方式 取模走向 字节(十六进制)
    逐行式(横向字节) 顺向(高位在前,首点在 bit7) 01 00 01 00 01 00 01 00 3F F8 21 08 21 08 21 08 21 08 21 08 3F F8 21 08 01 00 01 00 01 00 01 00
    逐行式(横向字节) 逆向(低位在前,首点在 bit0) 80 00 80 00 80 00 80 00 FC 1F 84 10 84 10 84 10 84 10 84 10 FC 1F 84 10 80 00 80 00 80 00 80 00
    逐列式(纵向字节) 顺向(高位在前,首点在 bit7) 00 00 00 00 0F F0 08 20 08 20 08 20 08 20 FF FF 08 20 08 20 08 20 08 20 0F F0 00 00 00 00 00 00
    逐列式(纵向字节) 逆向(低位在前,首点在 bit0) 00 00 00 00 F0 0F 10 04 10 04 10 04 10 04 FF FF 10 04 10 04 10 04 10 04 F0 0F 00 00 00 00 00 00
    列行式(纵向字节,SSD1306 页顺序) 顺向(高位在前,首点在 bit7) 00 00 0F 08 08 08 08 FF 08 08 08 08 0F 00 00 00 00 00 F0 20 20 20 20 FF 20 20 20 20 F0 00 00 00
    列行式(纵向字节,SSD1306 页顺序) 逆向(低位在前,首点在 bit0) 00 00 F0 10 10 10 10 FF 10 10 10 10 F0 00 00 00 00 00 0F 04 04 04 04 FF 04 04 04 04 0F 00 00 00
    行列式(横向字节,8 列一条) 顺向(高位在前,首点在 bit7) 01 01 01 01 3F 21 21 21 21 21 3F 21 01 01 01 01 00 00 00 00 F8 08 08 08 08 08 F8 08 00 00 00 00
    行列式(横向字节,8 列一条) 逆向(低位在前,首点在 bit0) 80 80 80 80 FC 84 84 84 84 84 FC 84 80 80 80 80 00 00 00 00 1F 10 10 10 10 10 1F 10 00 00 00 00

    点阵字库:GNU Unifont(16 点)与 Fusion Pixel Font(12 点),均以 SIL Open Font License 1.1 授权。 许可证全文

    8 种取模方式与走向组合均与独立参考实现逐字节对拍;预设依据 SSD1306、SH1106、ST7565 数据手册以及 Adafruit GFX、U8g2、LVGL、MicroPython 源码核对。 — Go Tools 团队 · 2026年10月3日

    由 Go Tools 工程团队开发并验证。

    速查

    SSD1306 OLED 取模选什么?

    阴码 · 列行式 · 逆向 阴码、列行式、逆向(低位在前)——字节直接写入显存时。

    Adafruit GFX drawBitmap() 取模选什么?

    阴码 · 逐行式 · 顺向 阴码、逐行式、顺向(高位在前),每行补齐到整字节。

    一个 16×16 汉字多少字节?

    32 字节 任何取模方式下都是 32 字节;12×12 是 24 字节,8×16 的 ASCII 是 16 字节。

    顺向和逆向是什么意思?

    逆向 = 低位在前 顺向 = 高位在前(先取到的点放 bit7);逆向 = 低位在前(先取到的点放 bit0)。

    什么是取模(字模提取)?

    SSD1306、SH1106、ST7565 这类图形 OLED/LCD 控制器本身没有字库。要显示一个字,单片机得把一小块「亮 / 不亮」的点阵写进显存,一个点占一位,八个点凑一个字节。把字形变成这串字节的过程,就是嵌入式开发里说的取模,也叫字模提取——过去大家用的是 Windows 上的 PCtoLCD2002、字模提取 V2.1 这类软件。

    光有字节还不够。同一个 16×16 的字可以按四种方式排(逐行、逐列、列行、行列),每种方式又分「先取到的点放最高位」还是「放最低位」,组合起来是 8 串完全不同的字节,而屏幕只认其中一种。这就是为什么从教程里抄来的字模,显示出来常常是镜像、上下颠倒或者上下两半错开。

    // 中 (16x16), pages of columns, LSB first, lit = 1 — SSD1306 page order
    const unsigned char zhong[32] = {
      0x00,0x00,0xF0,0x10,0x10,0x10,0x10,0xFF,0x10,0x10,0x10,0x10,0xF0,0x00,0x00,0x00,
      0x00,0x00,0x0F,0x04,0x04,0x04,0x04,0xFF,0x04,0x04,0x04,0x04,0x0F,0x00,0x00,0x00
    };
    // First 16 bytes = page 0 (rows 0-7), one byte per column, bit 0 = top row

    这个取模工具能做什么

    12×12、16×16 汉字点阵清晰不糊

    网页取模工具大多用浏览器的矢量字体再二值化,12px 宋体下「中」字的上下两横会整条消失。这里内置真正的点阵字库:16×16 覆盖 GB2312 全部 6763 个汉字,12×12 缺 143 个生僻字,会自动改用系统字体并标出来。

    PCtoLCD2002 的取模选项一个不少

    逐行式、逐列式、列行式、行列式,顺向(高位在前)、逆向(低位在前),阴码、阳码。叫法沿用 PCtoLCD2002,含义按 SSD1306 数据手册和常见 OLED 例程的设置核对过,老工程用的是哪组设置,这里照着选即可。

    预设会告诉你它对应什么

    选 SSD1306、Adafruit GFX 或 XBM,选项自动设好。手动改了任何一项,下方会提示这组字节能被哪些屏幕和库直接读取——或者明确告诉你没有主流库用这种排法。

    字模数组还原预览(反查取模方式)

    拿到一段不知道怎么取的字模?粘进来,8 种取模方式 × 走向的解读并排画出来,读得出字的那一张就是答案,点一下就把设置应用到生成器。

    图片取模:缩放、阈值、抖动

    Logo、图标、照片按屏幕尺寸缩放后二值化,可选固定阈值、Floyd–Steinberg 或 Atkinson 抖动。透明区域按背景处理,阈值在所有模式下都生效。

    直接粘进工程的输出

    C51 风格二维数组带 /*"中",0*/ 注释、Arduino PROGMEM 带偏移量、MicroPython 字典、A51 的 DB 行或纯十六进制。生成的 C 代码用 -Wall -Wextra -pedantic 编译无警告。

    取模实例

    「中」给 SSD1306 OLED(16×16,列行式,逆向)

    中
    00 00 F0 10 10 10 10 FF 10 10 10 10 F0 00 00 00 00 00 0F 04 04 04 04 FF 04 04 04 04 0F 00 00 00

    共 32 字节:前 16 个是第 0 页(第 0–7 行)的 16 列,后 16 个是第 1 页(第 8–15 行)。第 7 列的 0xFF 八位全亮,正是贯穿上下的那一竖。

    同一个「中」给 Adafruit GFX drawBitmap(逐行式,顺向)

    中
    01 00 01 00 01 00 01 00 3F F8 21 08 21 08 21 08 21 08 21 08 3F F8 21 08 01 00 01 00 01 00 01 00

    每行 2 字节,共 16 行。0x01 0x00 就是中间那一竖:最左边的点放在第一个字节的 bit7,所以第 7 列落在 bit0。把这串字节按 SSD1306 页写进去只会得到乱码——同一个字,排法不同。

    16 点字库里的半角「A」(8×16)

    A
    00 00 00 00 18 24 24 42 42 7E 42 42 42 42 00 00

    英文、数字是半宽:8×16 共 16 字节,逐行式下每行一个字节。如果驱动要求每个字都是 16×16,勾选「半角字符也按全角宽度输出」。

    12×12 为什么是 24 字节而不是 18

    中(12×12,逐行式,顺向)
    00 00 04 00 04 00 FF E0 84 20 84 20 84 20 FF E0 04 00 04 00 04 00 04 00

    每行 12 个点要占 2 个字节,第二个字节的低 4 位是补位。12 行 × 2 字节 = 24。所有显示库都按 (宽 + 7) / 8 个字节寻址一行,压成 18 字节反而谁都读不对。

    怎么给 LCD/OLED 取字模

    1. 1

      输入文字或拖入图片

      文字取模用的是真正的点阵字体:12×12(Fusion Pixel)或 16×16(GNU Unifont),英文和数字自动按半宽。Logo、图标走「图片取模」,设好目标尺寸,比如 128×64。

    2. 2

      选目标屏幕或库

      SSD1306 / SH1106 / ST7565 直接写显存要列行式、逆向;Adafruit GFX、TFT_eSPI、U8g2 drawBitmap、LVGL 要逐行式、顺向;XBM / U8g2 drawXBM 是逐行式、逆向。选预设就自动设好,不用记。

    3. 3

      看预览,必要时点像素修改

      预览里画的就是要编码的那组点阵。点任意一个像素可以翻转它,字偏了用「右移」「下移」微调。

    4. 4

      复制或下载

      输出格式可选 C51(PCtoLCD2002 风格)、Arduino PROGMEM、MicroPython bytearray、A51 汇编或纯十六进制。输出第一行注释写明了取模方式、走向和字号,数组自带说明。

    显示乱码对照表:现象 → 选错了哪一项

    每 8 个点一组左右镜像

    横向字节的走向选反了。Adafruit GFX drawBitmap() 要顺向,XBM 和 U8g2 drawXBM() 要逆向。

    ✗ 错误
    U8g2 drawXBM() 用了顺向(高位在前)的字模
    ✓ 正确
    drawXBM() → XBM 预设(逐行式,逆向)

    每 8 行一组上下颠倒

    纵向字节的走向选反了。SSD1306 一类控制器的 D0 在最上面一行,必须逆向。

    ✗ 错误
    列行式 + 顺向 → SSD1306
    ✓ 正确
    列行式 + 逆向 → SSD1306

    上下两半交错,像乱码

    逐列式和列行式选混了。两者只在字高不超过 8 时字节相同,16 点高时顺序完全不同。

    ✗ 错误
    逐列式 → SSD1306 页写入
    ✓ 正确
    列行式 → SSD1306 页写入

    字沿对角线翻转,或整体反色

    沿对角线翻转(横竖对调)是把横向字节当纵向字节读了,反过来也一样;黑字亮底是阴码阳码选反了。

    ✗ 错误
    逐行式的字模直接按 SSD1306 页写入
    ✓ 正确
    粘进「数组还原预览」,选读得出字的那一张

    什么时候用得上

    0.96 寸 SSD1306 OLED 显示中文
    STM32、51 单片机上显示温度、菜单或状态栏汉字:选 16×16 字库和 SSD1306 预设,把数组粘进例程自带的 oledfont.h 就能用。
    Arduino / ESP32 开机 Logo
    拖入 PNG,设 128×64,选 Adafruit GFX 预设,然后 display.drawBitmap(0, 0, logo, 128, 64, WHITE)。
    LVGL、U8g2 界面里的小图标
    电池、Wi-Fi、℃ 这类单色图标:LVGL 和 Adafruit GFX 用逐行式顺向,U8g2 drawXBM() 用 XBM 预设。
    在 Mac 或 Linux 上取模
    PCtoLCD2002 和字模提取 V2.1 都只能在 Windows 上跑。这个工具在任何现代浏览器里打开就能用,不用安装。
    接手没有文档的老工程
    前任留下一个 Hzk[][32] 数组却没写怎么取的。先粘进「数组还原预览」查出取模方式,再按同样的设置补新字。

    四种取模方式是怎么排字节的

    逐行式(横向字节)
    从上到下一行一行取,每行从左到右每 8 个点组成一个字节,16 点宽的一行就是 2 字节。Adafruit GFX drawBitmap()、U8g2 drawBitmap()、XBM 文件、ST7920 GDRAM、LVGL 单色图都是这种排法。
    列行式(纵向字节)—— SSD1306 的顺序
    先把字按 8 行切成一「页」,每页从左到右逐列取,一个字节装这一列的 8 个点。这正对应 SSD1306、SH1106、ST7565 的显存组织,数据手册写明 D0 写入最上面一行,所以配套的走向是逆向(低位在前)。
    逐列式与行列式
    逐列式是一列从上到下取完所有页再换下一列,对应 SSD1306 的垂直寻址模式;行列式是取左边 8 列宽的一条、从上到下所有行,再取下一条,主流库都不用,只有部分 PCtoLCD2002 老工程在用。它们分别和列行式、逐行式只在字高(或字宽)不超过 8 时字节相同,所以用 8×8 测试时根本发现不了选错。
    取模走向与阴码阳码
    顺向(高位在前)把先取到的点(最左或最上)放在 bit7,逆向(低位在前)放在 bit0。阴码是亮点为 1,OLED、TFT drawBitmap()、LVGL A1 都要阴码;阳码是亮点为 0,只有把 0 定义为点亮的驱动才用。
    宽高不是 8 的倍数时怎么补位
    横向字节每行单独补齐,纵向字节每页单独补齐,补位一律填 0。列行式取 12 点高的字时,第二页有 4 行补位;驱动若整页写屏,会把字下方 4 行原有的内容清掉,工具会在这时给出提示。

    一次取对的几个习惯

    按调用的画图函数选预设,而不是按屏幕型号
    同样是 SSD1306,用 Adafruit_SSD1306 库时走的是 drawBitmap(),要逐行式、顺向,尽管芯片显存是纵向的。看你代码里调的是哪个函数,就选哪个预设。
    12、16 点用点阵字库
    矢量字体在 20px 以下二值化会丢笔画。Fusion Pixel 12 和 Unifont 16 本来就画在像素格上,「2 倍放大」选项能得到干净的 24×24 和 32×32。
    保留第一行注释
    输出第一行写着取模方式、走向和尺寸。半年后再看这个数组,这是唯一能告诉你它怎么来的记录。
    用不对称的字测试
    「中」「田」「H」左右对称,镜像错误根本看不出来。先用「F」「7」「乙」试,显示正确就说明每个选项都对。
    整屏镜像去改驱动初始化
    如果屏上所有内容都镜像或倒置,而不只是字模,改初始化里的段重映射(A0h/A1h)和 COM 扫描方向(C0h/C8h)。改取模选项只会把别处的显示弄坏。

    常见问题

    SSD1306 / SH1106 OLED 取模应该怎么设置?
    如果你的代码把字模字节直接写进显存(大多数 51、STM32 例程都是这样):阴码、列行式、逆向,也就是 SSD1306 预设。如果是通过 Adafruit_SSD1306 或 U8g2 的 drawBitmap() 画,就选 Adafruit GFX 预设,因为这些函数读的是逐行式、顺向的字节,自己再转换成页格式。
    取出来的字显示成镜像、颠倒或乱码,哪里错了?
    每种现象对应一个选项。每 8 个点一组左右镜像:横向字节的走向反了。每 8 行一组上下颠倒:纵向字节的走向反了。上下两半交错:逐列式和列行式选混了。沿对角线翻转:横向和纵向字节混了。黑白反色:阴码阳码反了。如果整个屏幕都镜像,而不只是字,去改驱动初始化,别动取模选项。
    12×12 汉字为什么是 24 字节,不是 18 字节?
    每一行(或每 8 行一页)单独补齐到整字节:12 个点要 2 个字节,12 行 × 2 = 24。显示库都按 (宽 + 7) / 8 字节寻址一行,压成 18 字节的字模反而没有一个库能读对。
    OLED 上显示 12 点的字,下面一行内容被擦掉了,为什么?
    列行式下,12 点高的字占满一页再加下一页的一半,第二页其余 4 位是补位 0。驱动按整页写屏时就把这 4 行清掉了。解决办法是用逐点画的帧缓冲,或者让 12 点的字所在位置下方本来就没有内容。
    能代替 PCtoLCD2002 吗?Mac 上能用吗?
    能。任何现代浏览器都能打开,同样有四种取模方式、顺向逆向、阴码阳码,C51 输出沿用 PCtoLCD2002 的 /*"字",0*/ 注释风格,可以直接粘进 Hzk[][32] 这类老工程。它不生成整套字库文件和索引。字形来自 GNU Unifont 和 Fusion Pixel,不是 Windows 的宋体,所以和 PCtoLCD2002 取出的数组不会逐字节相同;往旧字表里补字时,建议整张表在这里重新生成,别两边混用。本工具与 PCtoLCD2002 及其作者无关,不是它的官方网页版,也不提供它的下载。
    为什么用点阵字库,不用系统字体?
    系统字体是带抗锯齿的矢量轮廓,浏览器关不掉抗锯齿。12、16 点下把灰色边缘二值化会丢细笔画——12px 宋体的「中」,上下两横整条消失。GNU Unifont(16 点)和 Fusion Pixel(12 点)是在像素格上设计的,不会丢。更大的字号仍可以选系统字体:黑体从 24px 左右开始基本可用,宋体在 24px 仍可能丢笔画。
    点阵字库包含哪些字?
    GB2312 全部字符——6763 个简体汉字加全角标点和符号——以及可打印 ASCII、带音标的拉丁字母(é、ß、ł、ş、ő)、希腊字母、俄文字母、日文假名和 ℃、箭头、制表符等常用符号。Fusion Pixel 12 点缺少部分生僻字和符号。韩文和 GB2312 以外的汉字(繁体字、部分日文汉字)会改用系统字体绘制,并在预览下方列出来,方便你逐个检查。
    图片取模怎么做?Logo 怎么转成 C 数组?
    切到「图片」标签,拖入文件,设好屏幕尺寸(0.96 寸 OLED 是 128×64),保留「等比缩放」。图片里深色的点会变成屏上点亮的点;浅色图案深色背景就勾选反色。Logo 和文字不用抖动,照片选 Floyd–Steinberg 或 Atkinson。
    手里的字模数组不知道是怎么取的,怎么反查?
    粘进「数组还原预览」标签页。注释会被忽略,C、Arduino、A51、MicroPython 写法都认。工具按字节数猜字号,把 8 种取模方式和走向的组合全部画出来,读得出字的那张就是原来的设置,点「采用这组设置」即可。
    输入的文字和图片会上传吗?
    不会。取模和编码都在你的浏览器里完成。点阵字库从本站下载一次,你输入的文字和拖入的图片不会发送到任何地方。

    进制转换器 — 二进制、十六进制、十进制、八进制互转

    转换工具

    在线免费进制转换工具,支持二进制、八进制、十进制、十六进制及 2-36 任意进制互转。无需注册,数据不离开浏览器,即时获取结果。

    原码/反码/补码/移码计算器 — 四种码一次算全

    转换工具

    在线原码/反码/补码计算器,一次算出原码、反码、补码与移码四种表示,支持 4/8/16/32/64 位。也可反过来粘贴 11111011 或 0xFB,看它按无符号、原码、反码、补码、移码分别读作多少。-128 在 8 位下没有原码和反码,本工具会明确标出并解释为什么。全程浏览器本地计算。

    chmod 计算器 — Linux 文件权限

    转换工具

    在线 chmod 计算器:Linux 文件权限在八进制(755、644)与 rwx 符号之间双向转换,实时生成可复制的 chmod 命令,并自动提示 777 等高危权限。免费使用,全部在浏览器本地完成,数据不上传。

    颜色转换器 — HEX、RGB、HSL 与 OKLCH

    转换工具

    在浏览器中将 HEX 转 RGB、HSL、OKLCH、OKLAB 与 CMYK,一键复制任意格式。免费、免注册,您的颜色永远不会离开本页。

    经纬度转换与坐标系转换(度分秒 / GCJ-02 / BD-09 / UTM)

    转换工具

    经纬度转换在线免费:十进制、度分秒(含「北纬39度54分33.2秒」写法)粘贴即识别,经度在前的高德/百度格式自动判断;一次给出 GPS/WGS84、高德 GCJ-02、百度 BD-09 及 Web 墨卡托、UTM、CGCS2000 高斯投影。反算迭代到毫米以下,可批量导出 CSV,本地计算不上传。

    HEX 转 CMYK 转换器

    转换工具

    在浏览器中把 HEX 颜色转成 CMYK。基于 sRGB 的朴素近似,适合印前预览。免费、免注册,您的颜色始终保留在本地。