SSD1306 OLED 取模选什么?
阴码 · 列行式 · 逆向 阴码、列行式、逆向(低位在前)——字节直接写入显存时。
免费在线取模软件,PCtoLCD2002 的网页替代,Mac/Linux 免安装:汉字取模、图片取模生成 OLED/LCD 的 C 数组,12×12、16×16 点阵字库不糊;显示乱码?粘贴字模数组反查取模方式。SSD1306、Adafruit GFX、U8g2 一键预设。
系统字体是带抗锯齿的矢量轮廓,20 像素以下笔画容易断开或粘连。12、16 点请用上面的点阵字库。
拖入图片,或点击选择文件
PNG、JPG、GIF、BMP、WebP 或 SVG——Logo、图标、截图都可以
图片里深色的点会成为屏幕上点亮的点。透明区域按背景处理。
从老工程或教程里拿到一段字模,不知道是怎么取的?粘贴到这里:所有取模方式和走向的解读会并排画出来,读得出字的那一张就告诉你原来的设置。
对应 SSD1306 / SSD1309 / SH1106 / ST7565 的页显存和 MicroPython framebuf.MONO_VLSB——字节可直接写入屏幕。
阴码,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 授权。 许可证全文
由 Go Tools 工程团队开发并验证。
阴码 · 列行式 · 逆向 阴码、列行式、逆向(低位在前)——字节直接写入显存时。
阴码 · 逐行式 · 顺向 阴码、逐行式、顺向(高位在前),每行补齐到整字节。
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 网页取模工具大多用浏览器的矢量字体再二值化,12px 宋体下「中」字的上下两横会整条消失。这里内置真正的点阵字库:16×16 覆盖 GB2312 全部 6763 个汉字,12×12 缺 143 个生僻字,会自动改用系统字体并标出来。
逐行式、逐列式、列行式、行列式,顺向(高位在前)、逆向(低位在前),阴码、阳码。叫法沿用 PCtoLCD2002,含义按 SSD1306 数据手册和常见 OLED 例程的设置核对过,老工程用的是哪组设置,这里照着选即可。
选 SSD1306、Adafruit GFX 或 XBM,选项自动设好。手动改了任何一项,下方会提示这组字节能被哪些屏幕和库直接读取——或者明确告诉你没有主流库用这种排法。
拿到一段不知道怎么取的字模?粘进来,8 种取模方式 × 走向的解读并排画出来,读得出字的那一张就是答案,点一下就把设置应用到生成器。
Logo、图标、照片按屏幕尺寸缩放后二值化,可选固定阈值、Floyd–Steinberg 或 Atkinson 抖动。透明区域按背景处理,阈值在所有模式下都生效。
C51 风格二维数组带 /*"中",0*/ 注释、Arduino PROGMEM 带偏移量、MicroPython 字典、A51 的 DB 行或纯十六进制。生成的 C 代码用 -Wall -Wextra -pedantic 编译无警告。
中
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 八位全亮,正是贯穿上下的那一竖。
中
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 页写进去只会得到乱码——同一个字,排法不同。
A
00 00 00 00 18 24 24 42 42 7E 42 42 42 42 00 00
英文、数字是半宽:8×16 共 16 字节,逐行式下每行一个字节。如果驱动要求每个字都是 16×16,勾选「半角字符也按全角宽度输出」。
中(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 字节反而谁都读不对。
文字取模用的是真正的点阵字体:12×12(Fusion Pixel)或 16×16(GNU Unifont),英文和数字自动按半宽。Logo、图标走「图片取模」,设好目标尺寸,比如 128×64。
SSD1306 / SH1106 / ST7565 直接写显存要列行式、逆向;Adafruit GFX、TFT_eSPI、U8g2 drawBitmap、LVGL 要逐行式、顺向;XBM / U8g2 drawXBM 是逐行式、逆向。选预设就自动设好,不用记。
预览里画的就是要编码的那组点阵。点任意一个像素可以翻转它,字偏了用「右移」「下移」微调。
输出格式可选 C51(PCtoLCD2002 风格)、Arduino PROGMEM、MicroPython bytearray、A51 汇编或纯十六进制。输出第一行注释写明了取模方式、走向和字号,数组自带说明。
横向字节的走向选反了。Adafruit GFX drawBitmap() 要顺向,XBM 和 U8g2 drawXBM() 要逆向。
U8g2 drawXBM() 用了顺向(高位在前)的字模
drawXBM() → XBM 预设(逐行式,逆向)
纵向字节的走向选反了。SSD1306 一类控制器的 D0 在最上面一行,必须逆向。
列行式 + 顺向 → SSD1306
列行式 + 逆向 → SSD1306
逐列式和列行式选混了。两者只在字高不超过 8 时字节相同,16 点高时顺序完全不同。
逐列式 → SSD1306 页写入
列行式 → SSD1306 页写入
沿对角线翻转(横竖对调)是把横向字节当纵向字节读了,反过来也一样;黑字亮底是阴码阳码选反了。
逐行式的字模直接按 SSD1306 页写入
粘进「数组还原预览」,选读得出字的那一张
转换工具
在线免费进制转换工具,支持二进制、八进制、十进制、十六进制及 2-36 任意进制互转。无需注册,数据不离开浏览器,即时获取结果。
转换工具
在线原码/反码/补码计算器,一次算出原码、反码、补码与移码四种表示,支持 4/8/16/32/64 位。也可反过来粘贴 11111011 或 0xFB,看它按无符号、原码、反码、补码、移码分别读作多少。-128 在 8 位下没有原码和反码,本工具会明确标出并解释为什么。全程浏览器本地计算。
转换工具
在线 chmod 计算器:Linux 文件权限在八进制(755、644)与 rwx 符号之间双向转换,实时生成可复制的 chmod 命令,并自动提示 777 等高危权限。免费使用,全部在浏览器本地完成,数据不上传。
转换工具
在浏览器中将 HEX 转 RGB、HSL、OKLCH、OKLAB 与 CMYK,一键复制任意格式。免费、免注册,您的颜色永远不会离开本页。
转换工具
经纬度转换在线免费:十进制、度分秒(含「北纬39度54分33.2秒」写法)粘贴即识别,经度在前的高德/百度格式自动判断;一次给出 GPS/WGS84、高德 GCJ-02、百度 BD-09 及 Web 墨卡托、UTM、CGCS2000 高斯投影。反算迭代到毫米以下,可批量导出 CSV,本地计算不上传。
转换工具
在浏览器中把 HEX 颜色转成 CMYK。基于 sRGB 的朴素近似,适合印前预览。免费、免注册,您的颜色始终保留在本地。