QMK 矩阵图深度解析:Acheron × DriftMechanics Austin 1800 键盘的矩阵坐标、特殊键位与 WKL/ISO 布局
【免费下载链接】qmk_firmwareOpen-source keyboard firmware for Atmel AVR and Arm USB families项目地址: https://gitcode.com/GitHub_Trending/qm/qmk_firmware
Acheron 与 DriftMechanics 联合推出的 Austin(代号 1800CP-SM-S-STM32-MX-TH-WI)是一款 1800 配列客制化键盘,其 PCB 遵循 Acheron Open-Hardware 规范。本文以仓库中 matrix_diagram.md 的矩阵图为骨架,结合 keyboard.json 中真实的矩阵引脚定义、布局描述与 keymap.c 键位映射,逐区讲解如何阅读这张"键盘矩阵地图",理解 2u Backspace、ISO Enter、2.25u LShift、2u 数字键盘 0 以及 WKL 底排等特殊键位的矩阵坐标来源,并最终落地到固件编译。读完本文,你将掌握"矩阵图 → 布局 JSON → keymap.c → 可烧录固件"的完整链路。
一、什么是矩阵图:键盘固件的第一张"地图"
机械键盘的每一个按键并不会独占一个 MCU 引脚,而是通过"行 × 列"交叉扫描的方式来读取——按下某个键,等效于把对应的行与列短路。因此,固件里任何一个按键都必须用[row, col]两个坐标来定位。Austin 的矩阵图正是把 1800 配列的每一个物理键位与矩阵坐标一一对应的权威文档,也是编写LAYOUT_*布局与keymap.c的坐标依据。
从 keyboard.json 可以确认 Austin 的物理矩阵规模:
cols:19 列,引脚依次为B10, B11, B12, B13, B14, B15, A8, A9, A10, A5, A15, B3, B4, B5, B8, A3, C15, C14, F1;rows:6 行,引脚为C13, A4, A7, B0, B1, B2;diode_direction:COL2ROW(二极管方向为列到行)。
这正是矩阵图中所有坐标值落在6 行(0~5)× 19 列(0~18)范围内的原因。19 列用十进制会超过一位数,因此矩阵图沿用了十六进制风格的标记:第 15、16、17、18 列分别写作F、G、H、I。
矩阵图原文如下(完整保留):
┌───┐┌───┬───┬───┬───┐┌───┬───┬───┬───┐┌───┬───┬───┬───┐┌───┐┌───┐┌───┬───┬───┬───┐ │00 ││01 │02 │03 │04 ││05 │06 │07 │08 ││09 │0A │0B │0C ││0D ││0E ││0F │0G │0H │0I │ └───┘└───┴───┴───┴───┘└───┴───┴───┴───┘└───┴───┴───┴───┘└───┘└───┘└───┴───┴───┴───┘ ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐┌───┐┌───┬───┬───┬───┐ ┌───────┐ │10 │11 │12 │13 │14 │15 │16 │17 │18 │19 │1A │1B │1C │1D │1E ││1F ││1G │1H │1I │5I │ │1E │ 2u Backspace ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┤├───┤├───┼───┼───┼───┤ └─┬─────┤ │20 │21 │22 │23 │24 │25 │26 │27 │28 │29 │2A │2B │2C │2D ││2E ││2F │2G │2H │ │ │ │ ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┤├───┤├───┼───┼───┤3I │ ┌──┴┐2D │ ISO Enter │30 │31 │32 │33 │34 │35 │36 │37 │38 │39 │3A │3B │3C ││3E ││3F │3G │3H │ │ │3C │ │ ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────┬───┘└───┘├───┼───┼───┼───┤ └───┴────┘ │40 │41 │42 │43 │44 │45 │46 │47 │48 │49 │4A │4B │4C │┌───┐ │4F │4G │4H │ │ ├────┼───┴┬──┴─┬─┴───┴───┴───┴───┴───┴───┴──┬┴───┴┬──┴──┬───┘│4D │ ├───┼───┼───┤4I │ │50 │51 │52 │55 │59 │5A │┌───┼───┼───┐│5F │5G │5H │ │ └────┴────┴────┴────────────────────────┴─────┴─────┘│5B │5C │5E │└───┴───┴───┴───┘ └───┴───┴───┘ ┌────────┐ ┌────────┐ │40 │ 2.25u LShift │5F │ 2u Numpad Zero └────────┘ └────────┘ ┌─────┬─────┬───────────────────────────┬─────┬─────┐ │50 │51 │55 │59 │5A │ WKL └─────┴─────┴───────────────────────────┴─────┴─────┘坐标格式为行列:第一个字符是行号(0~5),第二个字符是列号(0~9 与 A~I)。例如1E表示第 1 行、第 14 列;5I表示第 5 行、第 18 列(数字键盘的-)。图中的单元格宽度对应键帽的物理宽度,所以1.5u、2u、2.25u、6.25u等宽度信息可以直接从格子的大小读出来。
二、逐区解读:从功能行到数字键盘
2.1 功能行(第 0 行):00~0I
第 0 行共 19 键,与 19 列一一对应,是矩阵图中最简单规整的一行:
00:Esc;01~04:F1~F4;05~08:F5~F8;09~0C:F9~F12;0D:Print Screen;0E:Scroll Lock;0F:Pause;0G:Home;0H:End;0I:Delete。
该行在 keyboard.json 的LAYOUT_all中被逐一声明,例如{"label": "Esc", "matrix": [0, 0], ...}与{"label": "Delete", "matrix": [0, 18], ...},坐标与矩阵图完全一致。
2.2 数字行(第 1 行):2u Backspace 与数字键盘顶行
第 1 行是全键盘信息密度最高的一行:
10~1C:`、1~0、-、=;1D与1E:两个 Backspace 位置,右侧注释明确标注1E 2u Backspace。当使用 2u 大 Backspace 时,只占用1E一个矩阵位置(见LAYOUT_ansi中{"label": "Backspace", "matrix": [1, 14], "w": 2});当使用分体 Backspace 时,1D与1E各放一个 1u Backspace(见LAYOUT_all与LAYOUT_ansi_split_bs);1F:Insert;1G:Num Lock;1H:/(数字键盘);1I:*(数字键盘);5I:数字键盘-。这是一个跨行坐标——它虽然与数字键盘顶行同一水平线,但矩阵位置在第 5 行、第 18 列。这与 keyboard.json 中{"label": "-", "matrix": [5, 18], "x": 19.5, "y": 1.25}完全吻合,也解释了为什么-键的 y 坐标(1.25)与*键相同却使用第 5 行。
2.3 Tab 行(第 2 行):ISO Enter 的两格形态
20:Tab(1.5u);21~2C:Q、W、E、R、T、Y、U、I、O、P、[、];2D:\(1.5u,ANSI 配列);2E:Page Up;2F、2G、2H:数字键盘 7、8、9。
右侧注释ISO Enter对应图中┌──┴┐2D ... │3C │的标注:在 ISO 配列下,回车键跨越第 2 行与第 3 行,其矩阵位置为[2, 13](即 2D),而3C([3, 12])位置放置的是 ISO 独有的#键。这与 keyboard.json 中LAYOUT_iso的定义一致:{"label": "#", "matrix": [3, 12], ...}加上{"label": "Enter", "matrix": [2, 13], "w": 1.25, "h": 2}。可见矩阵图中的格子宽度只反映键帽宽度,ISO 回车这种"竖跨两行"的键需要结合行号与高度(h: 2)才能完整表达。
2.4 Caps Lock 行(第 3 行):2.25u 回车与+键
30:Caps Lock(1.75u);31~3B:A、S、D、F、G、H、J、K、L、;、';3C:ANSI 配列下为 Enter(2.25u);ISO 配列下为#(见上文);3E:Page Down;3F、3G、3H:数字键盘 4、5、6;3I:数字键盘+,其矩阵位置为[3, 18],并在 keyboard.json 中声明为"h": 2,即数字键盘+是一个纵向占两格的键。
2.5 Shift 行(第 4 行):2.25u LShift 与方向键
40:左 Shift,注释明确标注为 2.25u LShift(见矩阵图下方┌────────┐ │40 │ 2.25u LShift └────────┘)。在LAYOUT_ansi中对应{"label": "Shift", "matrix": [4, 0], "w": 2.25};而在LAYOUT_all/LAYOUT_iso中,[4, 0]变为 1.25u 的 Shift,并额外启用41([4, 1])作为 ISO\键;42~4C:Z、X、C、V、B、N、M、,、.、/、右 Shift;4D:上方向键([4, 13]);4E:图中为空位(┌───┐围起的空槽),对应 ANSI 配列下 Shift 行 2.25u 左 Shift 挤占后空出的物理位置;4F、4G、4H:数字键盘 1、2、3;4I:数字键盘 Enter,矩阵位置[4, 18],在 keyboard.json 中声明为"h": 2,与数字键盘+类似纵向占两格。
2.6 底排(第 5 行):标准排与 WKL 排
第 5 行是配列差异最大的区域,矩阵图用两种形式给出了同一行的不同键帽方案:
标准(非 WKL)底排:
50:Ctrl(1.25u);51:GUI / Win(1.25u);52:Alt(1.25u);55:Space(6.25u);59:右 Alt(1.5u);5A:右 Ctrl(1.5u);5B、5C、5E:←、↓、→ 三个方向键(注意5D不存在,方向键之间的空隙不占用矩阵位置);5F、5G:数字键盘 0,二者合并构成2u Numpad Zero(矩阵图底部注释│5F │ 2u Numpad Zero即指5F+5G两格合并为 2u 键帽);5H:数字键盘.(小数点)。
WKL 底排(矩阵图底部┌─────┬─────┬─────...┐ │50 │51 │55 ... │59 │5A │ WKL):
50、51变为各 1.5u 的 Ctrl 与 Alt,同时删除 GUI / Win 键;55变为 7u Space;59、5A保持 1.5u 的 Alt 与 Ctrl。
这与 keyboard.json 中LAYOUT_ansi_wkl的定义一一对应:Ctrl [5,0] w:1.5、Alt [5,1] w:1.5、Space [5,5] w:7。也就是说,同一套物理矩阵、同一批引脚,仅仅改变布局 JSON 中的宽度与占位,就能在"标准底排"与"WKL 底排"之间切换,这正是数据驱动配置(data-driven config)的价值所在。
三、从矩阵图到固件:布局 JSON 与 keymap.c 的对应关系
矩阵图并不直接参与编译,它需要经过两层"翻译"才能变成固件:
第一层:布局描述(LAYOUT_*)。keyboard.json 中定义了 8 个布局宏:LAYOUT_all、LAYOUT_ansi、LAYOUT_ansi_split_bs、LAYOUT_ansi_wkl、LAYOUT_ansi_wkl_split_bs、LAYOUT_iso、LAYOUT_iso_split_bs、LAYOUT_iso_wkl。每个布局条目都携带matrix: [row, col]坐标、x/y视觉坐标以及可选的w/h键帽尺寸,矩阵坐标全部来自矩阵图。例如矩阵图中的1E(2u Backspace)在LAYOUT_ansi中就是{"label": "Backspace", "matrix": [1, 14], "w": 2}。
第二层:键值映射(keymap.c)。以 default/keymap.c 为例,它通过LAYOUT_all(...)宏按行依次给出每个矩阵位置的键值:
[0] = LAYOUT_all( KC_ESC , KC_F1 , KC_F2 , KC_F3 , KC_F4 , /* ... */ KC_HOME, KC_END , KC_DEL , KC_GRV , KC_1 , /* ... */ KC_BSPC, KC_BSPC, KC_INS , KC_NUM, KC_PSLS, KC_PAST, KC_PMNS, /* ... */ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC , KC_RALT, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT, KC_P0 , KC_P0 , KC_PDOT )可以看到LAYOUT_all中两个KC_BSPC(对应[1,13]与[1,14]的分体 Backspace)以及末尾两个KC_P0(对应[5,15]与[5,16]合并成的 2u 数字键盘 0)——矩阵图中每一个坐标位置都需要一个键值参数,参数的个数与顺序必须与布局宏严格一致。
仓库为 Austin 提供了 8 套官方键位,分别覆盖 ANSI/ISO × 标准底排/WKL × 整体/分体 Backspace 的全部组合:
- default(
LAYOUT_all全键位) - default_ansi
- default_ansi_split_bs
- default_ansi_wkl
- default_ansi_wkl_split_bs
- default_iso
- default_iso_split_bs
- default_iso_wkl
以 default_iso/keymap.c 为例,ISO 配列在键值层的差异主要体现在:KC_NUHS(对应[3,12]的#)、KC_NUBS(对应[4,1]的 ISO\),以及回车键位置的调整——这些位置正是矩阵图中标注ISO Enter的区域。
四、矩阵图的读图技巧小结
- 先定范围:Austin 为 6 行 × 19 列(
COL2ROW),坐标第一个字符永远是 0~5,第二个字符是 0~9 或 A~I。 - 跨行键看高度:ISO 回车(
[2,13],h:2)、数字键盘+([3,18],h:2)、数字键盘 Enter([4,18],h:2)在矩阵图中以"竖跨两行"的格子绘制,实际只占用一个[row, col]坐标,靠h属性表达。 - 合并键看宽度:2u Backspace(
1E)、2.25u LShift(40)、2u 数字键盘 0(5F+5G)在布局 JSON 中通过w宽度与"同一键值填两个坐标"两种方式实现;矩阵图底部专门用注释标出这三个特殊键。 - 同列可跨行:数字键盘
-位于5I(第 5 行、第 18 列),与同排的*、/并不同行,读图与写 keymap 时务必以坐标为准,不要以视觉位置臆断。 - 矩阵图不唯一:矩阵图描述的是 PCB 上的物理矩阵,
LAYOUT_all是全键位超集;其他 7 个LAYOUT_*是它的子集,用于在不同键帽方案下复用同一块 PCB。
五、验证与编译:让矩阵图"跑"起来
矩阵图给出的坐标与 keyboard.json 的matrix字段一一对应,可通过 QMK 的调试手段验证扫描结果是否符合预期:开启console特性(Austin 的 keyboard.json 已启用)后,按下任一按键可在调试输出中看到其矩阵坐标,与矩阵图对照即可确认读图正确。
编译任一官方键位只需在 QMK 环境就绪后执行:
make acheron/austin:default # LAYOUT_all 全键位 make acheron/austin:default_ansi # ANSI 底排 make acheron/austin:default_iso # ISO 配列 make acheron/austin:default_ansi_wkl # ANSI + WKL 底排固件烧写依赖 STM32F072 的stm32-dfu引导加载器(见 keyboard.json),编译产出为 DFU 格式镜像,可配合 QMK 官方烧录流程写入。若需自定义键位,最稳妥的做法是以上述任一官方 keymap 为模板,对照 matrix_diagram.md 与对应LAYOUT_*宏的行列顺序逐参数改写,即可保证每个键值落到正确的物理按键上。
六、总结
Austin 的矩阵图虽然只有一张 ASCII 图,却是连接"PCB 物理矩阵"与"固件键位逻辑"的核心文档。通过将 6×19 矩阵坐标、2u Backspace、ISO Enter、2.25u LShift、2u 数字键盘 0、WKL 底排这些特殊键位逐一映射到 keyboard.json 的布局定义,再落到 keymaps 下 8 套官方键位的keymap.c,你可以清楚地看到一块 1800 配列 PCB 如何在 ANSI/ISO、WKL/标准底排、整体/分体 Backspace 之间灵活复用同一套矩阵资源。掌握矩阵图的读法,是后续自定义 Austin 键位、甚至移植其他 1800 配列键盘时最扎实的一步。
【免费下载链接】qmk_firmwareOpen-source keyboard firmware for Atmel AVR and Arm USB families项目地址: https://gitcode.com/GitHub_Trending/qm/qmk_firmware
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考