QMK 键盘矩阵图深度解析:以 CMM.Studio Fuji65 的 matrix_diagram.md 为例 📅 发布时间:2026/9/19 16:10:12 👁 浏览次数: QMK 键盘矩阵图深度解析以 CMM.Studio Fuji65 的 matrix_diagram.md 为例【免费下载链接】qmk_firmwareOpen-source keyboard firmware for Atmel AVR and Arm USB families项目地址: https://gitcode.com/GitHub_Trending/qm/qmk_firmware本篇文章以 QMK Firmware 仓库中 keyboards/cmm_studio/fuji65/matrix_diagram.md 的官方矩阵图为骨架逐格解读 CMM.Studio Fuji65 这块 65% 客制化键盘的矩阵编号规则、特殊键位布局2u Backspace、2.25u Left Shift、Blocker/Tsangan 空格区并对照同目录下的 keyboard.json 与 默认键位说明如何用矩阵坐标排查按键故障、自定义配列以及理解 QMK 的矩阵扫描原理。读完本文你将具备独立读懂任意一块 QMK 键盘矩阵图并在其基础上修改布局或定位硬件问题的能力。一、为什么矩阵图是移植与调试的第一手资料在 QMK 中键盘物理开关并非每个按键单独接一根线到主控而是排布成行Row× 列Column的矩阵电路。固件会逐列输出高电平、同时读取各行电平一旦某行检测到来自某列的信号就说明该行列交叉处的按键被按下这一过程即矩阵扫描。完整的原理可参见仓库文档 docs/how_a_matrix_works.md。因此每个按键在固件里都对应一个唯一的(row, column)坐标。matrix_diagram.md正是用 ASCII 图形把 PCB 上真实的矩阵走线编号直观画出来它直接决定了keyboard.json中layouts里每条matrix: [row, col]的取值keymap.c中LAYOUT_xxx(...)宏参数的排列顺序调试时col/row打印值与物理按键的一一对应关系。可以说矩阵图就是PCB 物理走线 → 固件逻辑坐标之间的翻译对照表。二、Fuji65 矩阵图全景5 行 × 15 列以下是 matrix_diagram.md 中的完整官方矩阵图原文保留含三块局部特写┌───────┐ 2u Backspace │0D │ └───────┘ ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐ │00 │01 │02 │03 │04 │05 │06 │07 │08 │09 │0A │0B │0C │0D │0E │ ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┼───┐ ┌─────┐ │10 │11 │12 │13 │14 │15 │16 │17 │18 │19 │1A │1B │1C │1D │1E │ │ │ ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┼───┤ ┌──┴┐2C │ ISO Enter │20 │21 │22 │23 │24 │25 │26 │27 │28 │29 │2A │2B │2C │2E │ │1D │ │ ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────┬───┼───┤ └───┴────┘ │30 │31 │32 │33 │34 │35 │36 │37 │38 │39 │3A │3B │3C │3D │3E │ ├────┼───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬─┬───┼───┼───┤ │40 │41 │42 │46 │49 │4A │ │4B │4C │4D │ └────┴────┴────┴────────────────────────┴────┴────┘ └───┴───┴───┘ ┌────────┐ │30 │ 2.25u LShift └────────┘ ┌─────┬───┬─────┬───────────────────────────┬─────┐ │40 │41 │42 │46 │4A │ Blocker Tsangan └─────┴───┴─────┴───────────────────────────┴─────┘图中每个编号都是两位十六进制数首位是行号row、次位是列号col。例如0D表示第 0 行、第 D13列。整块 PCB 一共 5 行 15 列覆盖 65% 布局的全部按键。2.1 主矩阵区004D行矩阵编号键位功能区域Row 0000E15 键数字行 最右侧退格区其中0D在标准 ANSI 配列下为 2u BackspaceRow 1101E15 键Tab 起始1D为 1.5u 宽位于 ISO Enter 下方时参与组成 ISO EnterRow 2202E14 键Caps Lock 起始2C为 2.25u 宽即 Enter 键帽位置Row 3303E14 键Left Shift 起始30为 2.25u 宽3D为 1.75u 宽右 ShiftRow 4404D9 键底部修饰键行Ctrl/GUI/Alt、空格、Fn、右侧方向键Row 2 与 Row 3 的按键总数少于 15是因为 65% 布局在右侧让位给了方向键区与 Fn 键2D、31等位置在标准配列下没有被物理按键占用只作为矩阵中的空位存在。2.2 特写一2u Backspace0D图中右上角单独放大标注了0D这个位置在标准 ANSI 配列LAYOUT_ansi_blocker中0D是一颗2u 宽的 Backspace横跨0D与0E两个物理键位。在 keyboard.json 中对应为{matrix: [0, 13], x: 13, y: 0, w: 2}w: 2即 2u 宽度。而LAYOUT_ansi_blocker_split_bs配列则把该位置拆成0D1u与0E1u两颗独立按键这也是默认键位采用的分割退格方案。2.3 特写二2.25u Left Shift30图中第二块特写把 Row 3 起点的30单独放大标注为2.25u Left Shift。对应 keyboard.json{matrix: [3, 0], x: 0, y: 3, w: 2.25}30之后的31位置在标准配列下空置非 ISO 配列下无按键因此在 ISO 配列中31会被启用为独立按键配合左 Shift 后方的布局差异详见第四节 ISO Enter 部分。2.4 特写三Blocker / Tsangan 空格区404A第三块特写展示了底部修饰键的两种排布┌─────┬───┬─────┬───────────────────────────┬─────┐ │40 │41 │42 │46 │4A │ Blocker Tsangan └─────┴───┴─────┴───────────────────────────┴─────┘Blocker 配列主图所示401.25u Ctrl、411.25u GUI、421.25u Alt、466.25u Spacebar、491.25u Alt、4A1.25u Fn最右侧4B/4C/4D为左/下/右方向键Tsangan 配列空格区改为401.5u、411u、421.5u、467u Spacebar、4A1.5u即经典的 7u 空格 1.5u/1u/1.5u 修饰键方案用于兼容不同客制化键帽套件。两种配列在 keyboard.json 中分别以LAYOUT_ansi_blocker_tsangan、LAYOUT_iso_blocker_tsangan等后缀区分。三、矩阵图与 keyboard.json 的严格对应matrix_diagram.md中每个编号都能在 keyboard.json 的物理定义中找到一一对应的证据。3.1 引脚分配matrix_pinsmatrix_pins: { cols: [F7, F6, F5, F4, F1, F0, B0, B1, B2, B3, D5, D3, D2, D1, D0], rows: [B5, B4, D7, D6, B6] }15 个列引脚F7、F6、F5、F4、F1、F0、B0、B1、B2、B3、D5、D3、D2、D1、D0对应矩阵图中每一列5 个行引脚B5、B4、D7、D6、B6对应矩阵图中的 Row 0Row 4。diode_direction设为COL2ROW即二极管方向为列→行二极管黑色标记一端朝向行线这是绝大多数采用该布线习惯的 PCB 的标准配置。关于该字段的取值范围说明可参考 docs/reference_info_json.md。3.2 布局族layoutsFuji65 的 keyboard.json 定义了 8 种配列全部源自同一张矩阵图差异只在于键帽宽度与按键取舍配列名称特点LAYOUT_ansi_blockerANSI 2u Backspace Blocker 空格区LAYOUT_ansi_blocker_split_bsANSI 分割 Backspace0D/0E均为 1u默认配列LAYOUT_ansi_blocker_tsanganANSI 2u Backspace Tsangan 空格区LAYOUT_ansi_blocker_tsangan_split_bsANSI 分割 Backspace Tsangan 空格区LAYOUT_iso_blockerISO Enter Blocker 空格区LAYOUT_iso_blocker_split_bsISO Enter 分割 BackspaceLAYOUT_iso_blocker_tsanganISO Enter Tsangan 空格区LAYOUT_iso_blocker_tsangan_split_bsISO Enter 分割 Backspace Tsangan 空格区同时通过layout_aliases将通用名LAYOUT指向默认的LAYOUT_ansi_blocker_split_bslayout_aliases: { LAYOUT: LAYOUT_ansi_blocker_split_bs }3.3 ISO Enter 的矩阵构成矩阵图右上角用虚线框标注了 ISO Enter 区域提示在 ISO 配列下 Enter 由两段矩阵坐标组合而成。在 keyboard.json 的LAYOUT_iso_blocker中可以看到对应实现{matrix: [1, 13], x: 12.75, y: 2}, {matrix: [2, 12], x: 13.75, y: 1, w: 1.25, h: 2}即 ISO Enter 由第二行的1D[1,13]横移回 y2 位置与第三行的2C[2,12]1.25u 宽、2u 高两颗物理键共同拼成——这正是矩阵图中 ISO Enter 特写里同时出现1D与2C两个编号的原因。同时ISO 配列会启用31作为独立按键弥补 2.25u 左 Shift 后方的空位。四、从矩阵图到默认键位默认键位 使用LAYOUT_ansi_blocker_split_bs其参数顺序与矩阵图严格一致[0] LAYOUT_ansi_blocker_split_bs( KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_GRV, KC_BSLS, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_TRNS, KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_TRNS, KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_LSFT, KC_UP, KC_TRNS, KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(1), KC_LEFT, KC_DOWN, KC_RGHT ),对照矩阵图可以轻松验证第 0 行000E共 15 个参数Esc 起始0D/0E为分割 Backspace 的KC_GRV与KC_BSLS第 1 行101E共 15 个参数1D为 1.5u 宽的KC_BSLS第 2 行202E共 14 个参数2C为 2.25u Enter2D空位不参与第 3 行303E共 14 个参数30为 2.25u 左 Shift31空位不参与3D为 1.75u 右 Shift3E为KC_TRNS占位第 4 行404D共 9 个参数KC_LCTL(40)、KC_LGUI(41)、KC_LALT(42)、KC_SPC(46)、KC_RALT(49)、MO(1)(4A)、KC_LEFT(4B)、KC_DOWN(4C)、KC_RGHT(4D)。第二层[1]全部为KC_TRNS配合4A处的MO(1)作为临时功能层使用。可见只要拿着矩阵图对照keymap.c的参数顺序就能精确定位每一颗键的固件坐标。五、用矩阵图排查按键故障调试实战矩阵图最大的实战价值在于调试。当某颗按键失灵、串键或需要确认扫描是否正确时可以按以下步骤利用 QMK 的调试能力相关方法详见 docs/faq_debug.md5.1 打开矩阵调试输出Fuji65 的 keyboard.json 中已开启console特性console: true满足调试输出的前提。然后在键位中启用矩阵调试void keyboard_post_init_user(void) { debug_enable true; debug_matrix true; }也可直接在键位中放置DB_TOGG键码或在固件运行时通过 Command 功能 触发MAGIC_KEY_DEBUG_MATRIX默认X来切换矩阵调试。5.2 查看调试输出编译烧录后使用终端查看输出qmk console或使用 QMK Toolbox 的 Console 标签页。当按下某一颗键时会看到类似matrix row/col: 0/13row/col数值可直接与矩阵图编号对照例如打印0/13对应图中0D分割 Backspace 的左侧键若打印值与实际按下位置不符说明矩阵走线或扫描配置有误。5.3 打印键位级矩阵坐标如果希望看到更详细的按键事件keycode、行列、按下时间等可在键位中加入bool process_record_user(uint16_t keycode, keyrecord_t *record) { #ifdef CONSOLE_ENABLE uprintf(KL: kc: 0x%04X, col: %2u, row: %2u, pressed: %u, time: %5u\n, keycode, record-event.key.col, record-event.key.row, record-event.pressed, record-event.time); #endif return true; }示例输出KL: kc: 169, col: 0, row: 0, pressed: 1, time: 15505其中col/row同样与矩阵图坐标一一对应。5.4 检查扫描频率若怀疑矩阵扫描性能异常可在config.h中定义DEBUG_MATRIX_SCAN_RATE输出每次扫描频率单位 Hz用于评估固件循环是否被阻塞。5.5 结合 bootmagic 快速复位Fuji65 开启了bootmagic特性长按左上角按键矩阵图00位置再插入 USB 即可进入 Bootmagic 模式便于在不重刷固件的情况下调整键位配置。六、构建与烧录在完成矩阵图理解与键位调整后按 readme.md 的说明编译默认键位make cmm_studio/fuji65:defaultFuji65 使用atmega32u4主控与atmel-dfu引导程序见 keyboard.json 的processor/bootloader字段。需要进入刷写模式时按下 PCB 背面的物理复位按钮即可让主控进入 DFU 引导模式随后使用make cmm_studio/fuji65:default:flash烧录。七、小结matrix_diagram.md用一张 ASCII 图完整刻画了 Fuji65 的矩阵拓扑主矩阵5 行 × 15 列编号规则为行号十六进制首字符 列号十六进制次字符三个特殊键位特写0D2u Backspace、302.25u Left Shift、404ABlocker/Tsangan 空格区分别对应 keyboard.json 中不同配列的w宽度与矩阵坐标矩阵图与 keyboard.json 的matrix_pins、layouts以及 默认键位 中的LAYOUT_ansi_blocker_split_bs(...)参数顺序严格一致借助debug_matrix、qmk console、process_record_user打印等手段矩阵图可直接用于按键故障定位与自定义配列开发。理解这张图就等于拿到了 Fuji65 这块 PCB 的固件侧接线图——无论是自定义键位、移植新配列还是排查硬件故障都能以它为锚点快速定位。【免费下载链接】qmk_firmwareOpen-source keyboard firmware for Atmel AVR and Arm USB families项目地址: https://gitcode.com/GitHub_Trending/qm/qmk_firmware创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考