DZ87
87-key dual-mode mechanical keyboard · USB wired + Bluetooth 5.0 · ZMK firmware
The DZ87 is an 87-key (TKL layout) dual-mode keyboard from CZMao: powered by an nRF52840, it supports both USB wired and Bluetooth 5.0, features 6 monochrome LED positions (CapsLock, ScrollLock and BLE channel 1 are actually usable — see 2.2), runs ZMK firmware and supports live keymap editing via ZMK Studio. The physical layout supports ANSI/ISO variants (split backspace, split space, multiple Shift/Enter widths) — all variant positions are visible in ZMK Studio.
1. Basic specs
| Spec | Value |
|---|---|
| Keys | 87 keys, TKL layout (no numpad) |
| Connection | USB wired + Bluetooth 5.0 dual-mode |
| MCU | nRF52840 (nice!nano v2 compatible) |
| BLE profiles | 3 switchable host slots |
| BLE name | czm_dz_87_ble_1 / czm_dz_87_ble_2 / czm_dz_87_ble_3 |
| USB name | czm_dz_87 |
| Port | Type-C (C2C cable supported) |
| Battery | Built-in Li-ion, Type-C charging |
| Indicators | 6 white monochrome LED positions, 3 actually usable: CapsLock, ScrollLock, BLE channel 1 (channel 2/3 and USB positions have no LED on this batch, see 2.2) |
| Firmware | ZMK (open source) |
| Remap tool | ZMK Studio live editing (CZM Driver Center recommended) |
| Source code | github.com/micahyy/zmk-config |
2. LED indicators
2.1 Channel & status LEDs
| LED | Color | Meaning |
|---|---|---|
| CapsLock | White | Follows the host Caps Lock state: solid on when active, off otherwise |
| ScrollLock | White | Follows the host Scroll Lock state: solid on when active, off otherwise |
| BLE 1 | White | Bluetooth profile 1 |
| BLE 2 | White | Bluetooth profile 2 |
| BLE 3 | White | Bluetooth profile 3 |
| USB | White | USB wired channel |
All six positions are white LEDs. On this PCB batch only CapsLock, ScrollLock and BLE 1 are actually wired — the BLE 2 / BLE 3 / USB positions never light up, see section 2.2.
LED behavior (channel LEDs are confirmation-only and turn off afterwards to save power):
Note: the behaviour below applies to the BLE 1 LED only (the only working channel LED). Switching to BLE channel 2 / 3 or plugging in USB gives no LED feedback, though the functions themselves work — see section 2.2.
- In Bluetooth mode, while the current profile is not connected / advertising → its channel LED blinks (~1 Hz) for 30 seconds, then turns off; switching profile or reconnecting restarts the blink.
- Once connected → the channel LED stays solid for 3 seconds as confirmation, then turns off; it resumes the 30-second blink if the connection is lost.
- When the USB channel is selected, the USB LED stays solid for 3 seconds as confirmation, then turns off; all BLE channel LEDs remain off (Bluetooth and USB are mutually exclusive).
- Plugging in the USB cable always forces the keyboard back to USB mode, regardless of the current state.
- The CapsLock and ScrollLock LEDs are independent and follow the host state.
2.2 Known hardware issue: LED positions
WARNING
This PCB batch has a design error: the channel 2, channel 3 and USB LED positions are not wired to any LED and never light up.
CapsLock, ScrollLock and BLE channel 1 are unaffected and work normally.
Actual behaviour
| Action | LED feedback |
|---|---|
| Switch to BLE channel 1 | Yes: blinks when unconnected, solid for 3s once connected |
| Switch to BLE channel 2 / 3 | None (no LED at that position) |
| Plug in the USB cable | None (no LED at that position) |
| CapsLock / ScrollLock | Normal, follows the host lock state |
Not affected: pairing, profile switching, USB output and keystrokes all work normally — only the LED indication is missing. This is not a malfunction.
How to tell the current channel without LEDs
- See which host is receiving keystrokes — only the selected profile outputs.
- Check the connected device name in the host's Bluetooth settings:
czm_dz_87_ble_1/czm_dz_87_ble_2/czm_dz_87_ble_3. - Plugging in the cable always forces USB output; no LED confirmation needed.
3. Shortcuts
The keyboard has two function layers:
- FN layer: hold the FN key (bottom row, left of Right Ctrl) for Bluetooth profiles, media keys and other everyday functions.
- FN2 layer: hold FN and then press Right Alt (there is no separate FN2 key on the standard layout). Used for Studio unlock, clearing pairings, bootloader and other maintenance functions.
3.1 FN layer (hold FN, then tap)
| Combo | Function |
|---|---|
FN + 1 | Switch to BLE profile 1 (hold 1s to enter pairing mode) |
FN + 2 | Switch to BLE profile 2 (hold 1s to pair) |
FN + 3 | Switch to BLE profile 3 (hold 1s to pair) |
FN + 4 | Manually select USB wired output (usually automatic when the cable is plugged in) |
FN + P | Launch the system media player |
FN + C | Launch the system calculator |
FN + Space | Play / pause |
FN + ↑ | Volume up |
FN + ↓ | Volume down |
FN + ← | Previous track |
FN + → | Next track |
FN + Right Alt | Enter the FN2 maintenance layer |
To use a combo: hold FN down, tap the target key, then release.
3.2 FN2 maintenance layer (hold FN, tap Right Alt, then tap)
| Combo | Function |
|---|---|
FN + Right Alt + ` (the `~ key right of ESC) | Unlock ZMK Studio (live remap) |
FN + Right Alt + ESC | Clear all Bluetooth pairings |
FN + Right Alt + Left Ctrl | Enter bootloader (UF2 flashing mode) |
4. Bluetooth pairing
- Hold FN and press
1/2/3to select a BLE profile. - The channel LED blinks for ~30 seconds while advertising (hold FN + the number for 1s to restart it). Find
czm_dz_87_ble_xin your device's Bluetooth list and pair. Note: only channel 1 has a working LED — channels 2 / 3 do not light up at all (see section 2.2), so just look for the device name in the Bluetooth list. - Once connected, the channel LED stays solid for 3 seconds, then turns off (channel 1 only; channels 2 / 3 have no LED, so just try typing to confirm).
- Each profile pairs with one device (up to 3). Use FN +
1/2/3to switch. - If pairing fails or you change host, use FN + Right Alt +
ESCto clear pairings, then pair again. - Plugging in the cable always forces USB output: FN +
1/2/3only selects a BLE profile and never takes the output away from the cable; FN +4selects USB as well. Unplugging the cable returns to Bluetooth automatically.
Several devices all show "Connected" (documented ZMK behaviour, not a fault) The three BLE profiles share a single Bluetooth MAC address, and switching profiles does not actively disconnect the previous host, so several hosts can report "Connected" at the same time. This is documented ZMK behaviour (upstream wording: "A ZMK device may show as connected on multiple hosts at the same time. This is working as intended, and only the host associated with the active profile will receive keystrokes.") — only the selected profile receives keystrokes. Keep one profile per host and avoid pairing several profiles on the same computer.
5. Remapping
DZ87 runs ZMK. We recommend ZMK Studio for live keymap editing:
Open the CZM Driver Center (official build: zmk.studio).
Connect the keyboard via USB (Studio is not available over Bluetooth).
Once the keyboard is detected, hold FN, tap Right Alt to enter the maintenance layer, then press
`to unlock; drag-and-drop keys live.Three layout views are available in Studio (layout switch menu in the top-right corner):
- ANSI 6.25u space (default): standard ANSI 87-key layout, factory default.
- ANSI 7u space: ANSI layout with a 7u spacebar (no Right Win key).
- All positions (ALL): shows all 94 switch positions on the PCB — ISO enter / NUBS, split backspace, split space and all other variants. Switch to this view if your board has non-standard switches soldered in.
Switching views never loses your keymap: functionally equivalent positions (split space switches, split backspace) are migrated automatically; positions that don't exist on your board are simply left untouched.
The keyboard re-locks automatically when USB is disconnected.
Advanced users can edit the open-source config repo and build firmware themselves: github.com/micahyy/zmk-config (shield name: dz_87)
6. Flashing firmware
- Hold FN, tap Right Alt to enter the maintenance layer, then press
Left Ctrlto enter the bootloader (or double-tap the RESET button on the module). - A USB mass-storage drive named
NICENANOwill appear. - Drag the
.uf2firmware file onto the drive; the keyboard reboots and flashes automatically.
Get the firmware from the Firmware download section at the bottom of this page.
7. Power & sleep
- Built-in rechargeable Li-ion battery, charged via Type-C.
- After ~5 minutes of inactivity the keyboard enters light sleep (Bluetooth stays connected, wakes instantly); after ~15 minutes it enters deep sleep (Bluetooth off, all LEDs off) — press any key to wake and reconnect.
- If a power switch is fitted, turn it off for long-term storage.
7.1 Measured power consumption
Measured on the current hardware (nRF52840 module + ZMK firmware, no RGB, no screen, monochrome indicators only).
| State | Average current | Notes |
|---|---|---|
| Standby (no input) | ~23 µA | Bluetooth stays connected, keyboard in ultra-low-power sleep |
| Intermittent typing | ~350–500 µA | Average at a normal typing pace |
| Continuous fast typing | ~800 µA | Average under sustained heavy input |
| First 17 seconds after power-on | ~144 µA | Init, advertising and connection setup |
| Peak current | ~6–9 mA | Momentary peak while transmitting BLE packets |
Measured with a power analyser at 4.2 V (fully charged Li-ion). Real figures vary slightly with battery voltage and ambient temperature.
7.2 Battery life estimate
Based on a 2500 mAh Li-ion battery:
| Usage | Daily drain | Estimated life |
|---|---|---|
| 10 h typing + 14 h standby per day | ~8.33 mAh/day | ~10 months |
| 2 h typing + 22 h standby per day | ~2.11 mAh/day | ~1.3 years |
| Standby only (no typing) | ~0.56 mAh/day | Theoretically very long; limited by battery self-discharge |
Deep sleep is not used — Bluetooth stays connected so the keyboard is always ready. Real-world life is slightly shorter due to self-discharge, ageing and usage habits.
7.3 Battery health
Power draw is extremely low, so the battery stays in the healthy 30%–70% range, naturally avoiding the two main ageing causes: long-term float charging at 100% and deep discharge.
- Charging is rare (roughly once every 10 months), so cycle life is not a bottleneck.
- Deep sleep is not relied on; Bluetooth stays connected, avoiding the reconnect delay.
- Under normal use the battery will not swell or degrade abnormally for years.
7.4 Power design
- Uses the nRF52840's internal DC/DC converter; the battery goes straight to VDDH with no external LDO — high efficiency, low quiescent current.
- An SS14 Schottky diode in the charging path drops about 0.25–0.35 V between the charger output and the battery, keeping the charge cut-off voltage in the healthy range.
- No RGB, no screen and no other extra load, minimising static leakage at the source.
7.5 Power source compatibility
| Source | Voltage | Connection | Supported |
|---|---|---|---|
| Li-ion (single cell) | 3.0–4.2V | VDDH (via SS14) | ✅ Yes |
| USB 5V | 5V | VDDH (via SS14) | ✅ Yes |
| Dry cells (2 in series) | 3.0V | VDDH | ❌ No (below the 3.3V VDDH minimum) |
| Dry cells (2 in series) | 3.0V | VDD (requires rewiring) | ✅ Yes (Normal Voltage Mode) |
To run on dry cells, connect the battery positive to the VDD net instead of the VDDH path.
8. FAQ
Q: The channel LED keeps blinking and won't connect? Make sure Bluetooth is enabled on the host. If it still fails, press FN + Right Alt + ESC to clear pairings, remove the old entry from the host, then pair again. (Only channel 1 has a working LED; channels 2 / 3 never blink or light — see section 2.2.)
Q: Switching to channel 2 / 3 or plugging in USB gives no LED at all — is it broken? Not a malfunction — a design error on this PCB batch: the channel 2, channel 3 and USB positions have no LED wired. Profile switching, pairing, USB output and keystrokes all work normally; only the light is missing. See section 2.2.
Q: Connected via USB but no input? Plugging in the cable switches to USB automatically (the USB LED position has no LED on this PCB batch, so there is no light indication — this is normal, see section 2.2). If the output ended up on Bluetooth anyway, press FN + 4 — it selects USB output only and never switches to Bluetooth. If there is still no input, unplug and replug the cable.
Q: Several devices all show "Connected" — is something broken? Not broken. The three profiles share one MAC address and switching profiles does not drop the previous host, so several hosts may appear connected at once — but only the selected profile receives keystrokes. This is documented ZMK behaviour, see section 4. Keep one profile per host.
Q: The CapsLock / ScrollLock LED doesn't light up? These LEDs follow the host's lock states — make sure Caps Lock / Scroll Lock is turned on.
Q: Remap site can't detect or unlock the keyboard? ZMK Studio only works over USB. Plug in the cable, refresh the page, then hold FN, tap Right Alt and press ` to unlock.
Q: My switches (ISO enter / split space) don't appear in the Studio layout? Switch the layout view to ALL (layout menu in Studio's top-right corner) — it shows all 94 switch positions. Standard ANSI boards can stay on the default ANSI 6.25u view.
9. Firmware changelog
WARNING
2026-09-24 firmware (czm_dz87_tri_260924): fixes no input after pressing FN + 4 with the USB cable plugged in
- Symptom: while typing normally over USB, holding FN and pressing
4makes every key stop responding; unplugging the cable and using Bluetooth does not restore typing either. - Cause: the factory firmware bound FN +
4to "toggle the output endpoint" (ZMK'sOUT_TOG). Pressing it again switches the output to Bluetooth, but as soon as the keyboard sees USB connected it actively tears the BLE link down — so the output goes to an endpoint that no longer exists: USB isn't listening and Bluetooth isn't connected, leaving no input at all. - Fix: the new firmware binds FN +
4to "select USB output only" (OUT_USB). With the cable plugged in you can press it any number of times and it always stays on USB — it can never land on Bluetooth. For Bluetooth, unplug the cable first, then pick a profile with FN +1/2/3. - Workaround without flashing: unplug and replug the USB cable to restore wired input; do not press FN +
4again before that. - Affected firmware: factory firmware from 2026-09-08 (v9) and earlier. Fixed in firmware published from 2026-09-24; all users should upgrade.
QQ group
677654482
📥 Firmware download
| Firmware file | Version | Release date | Size |
|---|---|---|---|
| czm_dz87_tri_260924.uf2 | Fixes no input after pressing FN + 4 with the USB cable plugged in (see Firmware changelog above) | 2026-09-24 | 428 KB |
Flashing steps: see section 6 above.
For custom keymaps: edit the open-source config repo github.com/micahyy/zmk-config — GitHub Actions builds it automatically.

评论 / 提问 (填个昵称就能留言,无需注册;邮箱选填,填了能收到回复通知)