QMK BIOI G60 矩阵图解指南解读 5×14 矩阵寻址、键位编号与多套布局映射【免费下载链接】qmk_firmwareOpen-source keyboard firmware for Atmel AVR and Arm USB families项目地址: https://gitcode.com/GitHub_Trending/qm/qmk_firmware本文以 QMK 固件仓库中 keyboards/bioi/g60/matrix_diagram.md 这份矩阵图解文档为主体完整讲解 BIOI G6060% 键盘的键位矩阵如何解读图中十六进制位置编号、每个编号对应哪一行哪一列的 GPIO 引脚、不同 ANSI/ISO/Tsangan 布局变体分别占用了哪些矩阵位置以及如何据此正确编写和校验自定义 keymap。读完本文你可以把任意十六进制编号翻译成行×列坐标与物理按键并理解LAYOUT_all等宏展开时参数的真实顺序。1. 文档背景BIOI G60 在 QMK 中的位置BIOI G60 是一款受 Cherry G80 系列设计启发的 60% USB/蓝牙双模定制键盘见 keyboards/bioi/g60/readme.md由 Basic I/O InstrumentsScott Wei维护。它在 QMK 仓库中的关键硬件与构建信息如下全部可在 keyboards/bioi/g60/keyboard.json 中直接查证处理器atmega32u4bootloader 为qmk-dfukeyboard.json#L65-L66USB 描述符VID0x8101PID0x6080keyboard.json#L6-L10特性开关bootmagic、extrakey、command、backlight、rgblight、bluetooth均启用keyboard.json#L11-L19keyboards/bioi/g60/rules.mk 将主频设为F_CPU 80000008 MHz并编译 keyboards/bioi/bluetooth_custom.c 作为蓝牙发送实现。矩阵图解文档matrix_diagram.md的作用是把物理键盘的每个可用键位标注上它在 QMK 键位矩阵matrix中的编号。对使用者而言这张图是编写 keymap、移植布局、排查“按 A 出 S”这类行列错位问题的第一手参照物。更通用的矩阵原理可参阅仓库文档 docs/how_a_matrix_works.md 与 docs/custom_matrix.md。值得说明的是同目录的蓝牙版本 keyboards/bioi/g60ble/matrix_diagram.md 内容与 G60 完全一致同为 5×14 矩阵说明两款键盘共用同一套键位排布与矩阵拓扑。2. 完整矩阵图解原文档内容以下代码块完整继承自 keyboards/bioi/g60/matrix_diagram.md图中每个格子内的十六进制数即该键位的矩阵编号图右侧与图下方的标注解释了宽键与底部行在不同布局下的形态┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐ ┌───────┐ │00 │01 │02 │03 │04 │05 │06 │07 │08 │09 │0A │0B │0C │0D │49 │ │0D │ 2u Backspace ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┤ └─┬─────┤ │10 │11 │12 │13 │14 │15 │16 │17 │18 │19 │1A │1B │1C │1D │ │ │ ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┤ ┌──┴┐2D │ ISO Enter │20 │21 │22 │23 │24 │25 │26 │27 │28 │29 │2A │2B │2D │ │2C │ │ ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────┬───┤ ┌─────┴┬──┴┬───┤ │30 │31 │32 │33 │34 │35 │36 │37 │38 │39 │3A │3B │3D │3C │ │3D │47 │3C │ 1.75u/1u/1u RShift ├────┼───┴┬──┴─┬─┴───┴───┴───┴───┴───┴───┴───┬┴──┬┴──┬┴──┬───┼───┤ └──────┴───┴───┘ │40 │41 │42 │45 │4A │4B │48 │4C │4D │ └────┴────┴────┴────────────────────────┴───┴───┴───┴───┴───┘ ┌────────┐ ┌─────────────┐ │30 │ 2.25u LShift │3D │ 2.75u RShift └────────┘ └─────────────┘ ┌────┬────┬────┬────────────────────────┬────┬────┬────┬────┐ │40 │41 │42 │45 │4A │4B │4C │4D │ Standard └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘ ┌─────┬───┬─────┬───────────────────────────┬─────┬───┬─────┐ │40 │41 │42 │45 │4B │4C │4D │ Tsangan/WKL/HHKB └─────┴───┴─────┴───────────────────────────┴─────┴───┴─────┘图中信息可以拆解为三类主体网格5 行 14 列的主矩阵编号从00到4D右侧挂接的“特殊键”0D2u Backspace、2DISO Enter 下半部分、3CFn、3D1.75u 右 Shift 主体、47上方向键、49右端 键等它们的物理位置不在“行尾”而是被绘制在对应行列附近以便阅读图下方三种底部行形态标注302.25u 左 Shift与3D2.75u 右 Shift的尺寸并给出底部行在 Standard 布局40 41 42 45 4A 4B 4C 4D与 Tsangan/WKL/HHKB 布局40 41 42 45 4B 4C 4D下的键位序列差异。3. 十六进制编号的解码规则编号 行×16 列读懂这张图的核心是编号规则。BIOI G60 的矩阵是5 行ROWS 0–4× 14 列COLS 0–13十六进制0D每个位置编号就是“行号高 4 位×16 列号低 4 位”与 QMK 中MATRIX_ROWS/MATRIX_COLS的寻址方式一致编号区间行物理含义以主矩阵为基准00–0D0数字行0D为 Backspace 主体10–1D1字母 Q–P、[、]、\ 行20–2D2字母 A–L 行2C/2D参与 ISO Enter30–3D3字母 Z–M 行30为 LShift、3D为 RShift、3C为 Fn40–4D4底部行45为空格键图中出现的“越界”编号47、48、49同样是4×167/8/9即第 4 行底部行的列 7/8/9只是它们在物理上被排布到别处这是 60% 布局压缩底部行时的典型做法49画在数字行最右侧物理位置是右上角的 反引号键47画在3C与3D上方物理位置是右 Shift 左侧的上方向键48底部行中4B与4C之间物理位置是左方向键。矩阵的行列方向与 GPIO 分配可在 keyboards/bioi/g60/keyboard.json#L29-L33 中核对diode_direction为COL2ROW列驱动、行读取14 根列引脚依次为F6, F7, B3, C7, C6, B6, B5, D5, B4, D7, D6, D4, D1, D0即列 0–13 的物理引脚顺序5 根行引脚依次为E6, B0, F1, F5, F4即行 0–4。这意味着如果你用万用表或调试工具测到“列引脚 C7 被拉低后行引脚 F1 出现电平”对应的就是编号12第 1 行第 2 列即 W 键。这个推理链是矩阵图解之外的第二层保障。4. 各布局变体与矩阵位置的占用关系keyboards/bioi/g60/keyboard.json#L70-L572 定义了 7 个布局宏每个键都带matrix: [行, 列]坐标。把它们与图解编号对照可以得到“哪些编号被哪个布局使用”的完整答案布局宏键数使用的特殊编号未使用的编号相对 LAYOUT_allLAYOUT_all6649、2C#、2DEnter、31NUBS、3CFn、3DRShift、47↑、48←、4A–4D无LAYOUT_60_ansi_split_bs_rshift622D2.25u Enter、3CFn、3D1.75u RShift、4A–4D2C、31、47、48、49LAYOUT_60_ansi_arrow6449、3D1.75u RShift、47↑、48←、4C↓、4D→ |2C、31LAYOUT_60_ansi_tsangan_split_bs_rshift61457u 空格、4B/4C/4D2C、31、47、48、49、4ALAYOUT_60_iso_split_bs_rshift642C2DISO Enterh: 2跨行、31NUBS、4A–4D47、48、49LAYOUT_60_iso_arrow65同上 47↑、48←49LAYOUT_60_iso_tsangan_split_bs_rshift63同上ISO 版47、48、49、4A几点关键结论均可在 JSON 的matrix字段逐一验证**49键只在带右上角键的布局中出现**LAYOUT_all与两套 arrow 布局ISO 布局因右上角被 ISO Enter 占用而不使用该位置ISO 变体中2D的 Enter 定义带h: 2从数字行右侧向下跨两行31NUBS 位置在 ANSI 的 split-backspace 布局中空闲——这些布局里左 Shift 加宽到 2.25uw: 2.25直接覆盖了第 3 行第 1 列的按键位置而在LAYOUT_all与 ISO 布局中它是独立的 1u 键底部行的 Tsangan/WKL/HHKB 变体放弃4A右 Alt 位置仅保留40 41 42 45 4B 4C 4D共 7 键与图解最下方一行的标注完全一致45恒为 6.25uarrow/all/标准布局或 7uTsangan 布局的空格键其两侧矩阵位置43/44/46在任何布局中都不作键位使用——这就是图解底部行里42与45之间大片留白的原因。5. 实战验证默认 keymap 中 LAYOUT_all 的参数顺序理解图解的最终目的是写出正确的 keymap。以默认 keymap keyboards/bioi/g60/keymaps/default/keymap.c#L22-L27 的 Base Layer 为例LAYOUT_all( 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_BSPC, KC_GRV, 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_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NUHS, KC_ENT, KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, MO(1), KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, KC_LEFT, KC_APP, KC_RCTL),对照LAYOUT_all在 keyboard.json#L71-L145 中的matrix坐标可以确认LAYOUT_all的参数展开顺序并不是严格的列号递增而是遵循如下顺序这也是自定义 keymap 时最容易出错的地方第 0 行00→0D15 个键行末追加49 键矩阵 [4,9]第 1 行10→1D14 个键第 2 行20→2B12 个键再2CNUHS矩阵 [2,12]最后2DEnter矩阵 [2,13]第 3 行30LShift、31NUBS、32→3BZ 到 /然后顺序是3DRShift[3,13]、47↑[4,7]、3CFn[3,12]——注意 Fn 排在第 3 行参数的最末位而不是紧随 / 键之后第 4 行40、41、42、45空格、4A右 Alt、4B右 GUI、48←[4,8]、4CApp[4,12]、4D右 Ctrl。用默认 keymap 逐键验证KC_RSFT, KC_UP, MO(1)三个连续参数分别落在3D、47、3C而下一行的KC_LEFT, KC_APP, KC_RCTL则分别落在48、4C、4Dkeymap.c#L26-L27。如果你修改 keymap 时把MO(1)写到了/键之后即3B之后实际效果会变成 Fn 键触发分层而 / 键失去功能——这正是图解存在的意义。此外LAYOUT_all每层共 66 个参数位151414149Function Layer 中未使用的键位统一以_______填充keymap.c#L37-L49第 1 层用到的UG_TOGG/BL_TOGG/BL_STEP等键码则依赖keyboard.json中开启的 backlight 与 rgblight 特性。6. 矩阵之外的配套硬件配置矩阵图解只覆盖键位扫描部分G60 的完整硬件定义还包括以下与矩阵协同工作的配置均在 keyboards/bioi/g60/keyboard.json 中背光PWM 背光引脚B7共 12 档levels: 12默认 keymap 中BL_TOGG/BL_STEP即操作此特性RGBWS2812 单线 LED 链数据引脚B1led_count为 8支持 breathing、snake、knight、christmas 等 11 种动画默认 keymap 中UG_TOGG切换模式Caps Lock 指示灯引脚F0on_state: 0表示低电平点亮键盘锁keyboards/bioi/g60/config.h#L20-L22 定义了KEYBOARD_LOCK_ENABLE与MAGIC_KEY_LOCK L配合keyboard.json中locking: { enabled: true, resync: true }生效布局别名LAYOUT_60_tsangan_hhkb: LAYOUT_60_ansi_tsangan_split_bs_rshiftkeyboard.json#L67-L69在 keymap 中两个名字等价。编译时使用 keyboards/bioi/g60/readme.md 给出的命令make bioi/g60:default生成的固件使用qmk-dfubootloader 烧录烧录流程可参考仓库文档 docs/flashing.md。蓝牙版本的构建命令为make bioi/g60ble:default其矩阵图解与本文所讲完全相同因此第 3、4、5 节的解码方法同样适用。7. 小结使用矩阵图解的核对清单任意编号按行 高 4 位、列 低 4 位拆解49、47、48等“看似跳行”的编号都是第 4 行的合法位置物理位置以图解右侧/上方挂接图为准行列方向为COL2ROW列引脚与行引脚的顺序见keyboard.json的matrix_pins可用于硬件级排错选择布局宏前先对照第 4 节表格确认该布局是否包含目标编号例如需要键就必须选LAYOUT_all 或 arrow 系列需要 ISO Enter 必须选 ISO 系列编写LAYOUT_all时严格按第 5 节的参数顺序落键尤其注意第 3 行末尾3D → 47 → 3C与第 4 行4B → 48 → 4C → 4D的非顺序排列空格键45两侧与 Tsangan 布局中的4A等位置在多数布局中不存在不可引用。以上所有结论均可在 keyboards/bioi/g60/ 目录下的matrix_diagram.md、keyboard.json、keymaps/default/keymap.c、config.h、rules.mk中逐一复核。【免费下载链接】qmk_firmwareOpen-source keyboard firmware for Atmel AVR and Arm USB families项目地址: https://gitcode.com/GitHub_Trending/qm/qmk_firmware创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考