Skip to content

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 ​

SpecValue
Keys87 keys, TKL layout (no numpad)
ConnectionUSB wired + Bluetooth 5.0 dual-mode
MCUnRF52840 (nice!nano v2 compatible)
BLE profiles3 switchable host slots
BLE nameczm_dz_87_ble_1 / czm_dz_87_ble_2 / czm_dz_87_ble_3
USB nameczm_dz_87
PortType-C (C2C cable supported)
BatteryBuilt-in Li-ion, Type-C charging
Indicators6 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)
FirmwareZMK (open source)
Remap toolZMK Studio live editing (CZM Driver Center recommended)
Source codegithub.com/micahyy/zmk-config

2. LED indicators ​

2.1 Channel & status LEDs ​

LEDColorMeaning
CapsLockWhiteFollows the host Caps Lock state: solid on when active, off otherwise
ScrollLockWhiteFollows the host Scroll Lock state: solid on when active, off otherwise
BLE 1WhiteBluetooth profile 1
BLE 2WhiteBluetooth profile 2
BLE 3WhiteBluetooth profile 3
USBWhiteUSB 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

ActionLED feedback
Switch to BLE channel 1Yes: blinks when unconnected, solid for 3s once connected
Switch to BLE channel 2 / 3None (no LED at that position)
Plug in the USB cableNone (no LED at that position)
CapsLock / ScrollLockNormal, 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) ​

ComboFunction
FN + 1Switch to BLE profile 1 (hold 1s to enter pairing mode)
FN + 2Switch to BLE profile 2 (hold 1s to pair)
FN + 3Switch to BLE profile 3 (hold 1s to pair)
FN + 4Manually select USB wired output (usually automatic when the cable is plugged in)
FN + PLaunch the system media player
FN + CLaunch the system calculator
FN + SpacePlay / pause
FN + ↑Volume up
FN + ↓Volume down
FN + ←Previous track
FN + →Next track
FN + Right AltEnter 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) ​

ComboFunction
FN + Right Alt + ` (the `~ key right of ESC)Unlock ZMK Studio (live remap)
FN + Right Alt + ESCClear all Bluetooth pairings
FN + Right Alt + Left CtrlEnter bootloader (UF2 flashing mode)

4. Bluetooth pairing ​

  1. Hold FN and press 1 / 2 / 3 to select a BLE profile.
  2. The channel LED blinks for ~30 seconds while advertising (hold FN + the number for 1s to restart it). Find czm_dz_87_ble_x in 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.
  3. 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).
  4. Each profile pairs with one device (up to 3). Use FN + 1/2/3 to switch.
  5. If pairing fails or you change host, use FN + Right Alt + ESC to clear pairings, then pair again.
  6. Plugging in the cable always forces USB output: FN + 1/2/3 only selects a BLE profile and never takes the output away from the cable; FN + 4 selects 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:

  1. Open the CZM Driver Center (official build: zmk.studio).

  2. Connect the keyboard via USB (Studio is not available over Bluetooth).

  3. Once the keyboard is detected, hold FN, tap Right Alt to enter the maintenance layer, then press ` to unlock; drag-and-drop keys live.

  4. 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.

  5. 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 ​

  1. Hold FN, tap Right Alt to enter the maintenance layer, then press Left Ctrl to enter the bootloader (or double-tap the RESET button on the module).
  2. A USB mass-storage drive named NICENANO will appear.
  3. Drag the .uf2 firmware 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).

StateAverage currentNotes
Standby (no input)~23 µABluetooth stays connected, keyboard in ultra-low-power sleep
Intermittent typing~350–500 µAAverage at a normal typing pace
Continuous fast typing~800 µAAverage under sustained heavy input
First 17 seconds after power-on~144 µAInit, advertising and connection setup
Peak current~6–9 mAMomentary 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:

UsageDaily drainEstimated 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/dayTheoretically 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 ​

SourceVoltageConnectionSupported
Li-ion (single cell)3.0–4.2VVDDH (via SS14)✅ Yes
USB 5V5VVDDH (via SS14)✅ Yes
Dry cells (2 in series)3.0VVDDH❌ No (below the 3.3V VDDH minimum)
Dry cells (2 in series)3.0VVDD (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 4 makes every key stop responding; unplugging the cable and using Bluetooth does not restore typing either.
  • Cause: the factory firmware bound FN + 4 to "toggle the output endpoint" (ZMK's OUT_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 + 4 to "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 + 4 again 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 fileVersionRelease dateSize
czm_dz87_tri_260924.uf2Fixes no input after pressing FN + 4 with the USB cable plugged in (see Firmware changelog above)2026-09-24428 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.

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

Released under the MIT License.