aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorfauxpark <fauxpark@gmail.com>2019-12-27 14:31:48 +1100
committerJoel Challis <git@zvecr.com>2019-12-27 03:31:48 +0000
commitb359830ea2f92010a8c5459cbb610857fe5d6675 (patch)
tree709e10bae661077c184fab53033d779dea610137
parentc32d0857104eb07ee99258387f118fc63385343c (diff)
downloadqmk_firmware-b359830ea2f92010a8c5459cbb610857fe5d6675.tar.gz
qmk_firmware-b359830ea2f92010a8c5459cbb610857fe5d6675.zip
Fix file encoding for zh-cn/custom_quantum_functions.md (#7665)
-rw-r--r--docs/zh-cn/custom_quantum_functions.md324
1 files changed, 162 insertions, 162 deletions
diff --git a/docs/zh-cn/custom_quantum_functions.md b/docs/zh-cn/custom_quantum_functions.md
index 42ceba9ca..f2c6098dc 100644
--- a/docs/zh-cn/custom_quantum_functions.md
+++ b/docs/zh-cn/custom_quantum_functions.md
@@ -1,31 +1,31 @@
1# 如何定制你键盘的 1# 備綍瀹氬埗浣犻敭鐩樼殑鍔熻兘
2 2
3对于很多人来说客制化键盘可不只是向你的电脑发送你按了那个件这么简单。你肯定想实现比简单按键和宏更复杂的功能。QMK有能让你注入代码的钩子, 覆盖功能, 另外,还可以自定义键盘在不同情况下的行为。 3瀵逛簬寰堝浜烘潵璇村鍒跺寲閿洏鍙笉鍙槸鍚戜綘鐨勭數鑴戝彂閫佷綘鎸変簡閭d釜浠惰繖涔堢畝鍗曘備綘鑲畾鎯冲疄鐜版瘮绠鍗曟寜閿拰瀹忔洿澶嶆潅鐨勫姛鑳姐俀MK鏈夎兘璁╀綘娉ㄥ叆浠g爜鐨勯挬瀛, 瑕嗙洊鍔熻兘, 鍙﹀锛岃繕鍙互鑷畾涔夐敭鐩樺湪涓嶅悓鎯呭喌涓嬬殑琛屼负銆
4 4
5本页不假定任何特殊的QMK知识,但阅读[理解QMK](understanding_qmk.md)将会在更基础的层面帮你理解发生了什么。 5鏈〉涓嶅亣瀹氫换浣曠壒娈婄殑QMK鐭ヨ瘑锛屼絾闃呰[鐞嗚ВQMK](understanding_qmk.md)灏嗕細鍦ㄦ洿鍩虹鐨勫眰闈㈠府浣犵悊瑙e彂鐢熶簡浠涔堛
6 6
7## A Word on Core vs 键盘 vs 布局 7## A Word on Core vs 閿洏 vs 甯冨眬
8 8
9我们把qmk组织成霾愦谓峁梗 9鎴戜滑鎶qmk勭粐鎴愪涓眰娆$粨鏋勶細
10 10
11* Core (`_quantum`) 11* Core (`_quantum`)
12 * Keyboard/Revision (`_kb`) 12 * Keyboard/Revision (`_kb`)
13 * Keymap (`_user`) 13 * Keymap (`_user`)
14 14
15下面描述的每一个函数都可以在定义上加一个`_kb()`或 `_user()` 后缀。 建议在键盘/修订层使用`_kb()`后缀,在布局层使用`_user()`后缀。 15涓嬮潰鎻忚堪鐨勬瘡涓涓嚱鏁伴兘鍙互鍦ㄥ畾涔変笂鍔犱竴涓猔_kb()`鎴 `_user()` 鍚庣紑銆 寤鸿鍦ㄩ敭鐩/淇灞備娇鐢╜_kb()`鍚庣紑锛屽湪甯冨眬灞備娇鐢╜_user()`鍚庣紑銆
16 16
17在键盘/修订层定义函数时,`_kb()`在执行任何代码前先调用`_user()`是必要的,不然布局层函数就不要被调用。 17鍦ㄩ敭鐩/淇灞傚畾涔夊嚱鏁版椂锛宍_kb()`鍦ㄦ墽琛屼换浣曚唬鐮佸墠鍏堣皟鐢╜_user()`鏄繀瑕佺殑锛屼笉鐒跺竷灞灞傚嚱鏁板氨涓嶈琚皟鐢ㄣ
18<!-- 翻译问题:上面那翻译的太好--> 18<!-- 缈昏瘧闂锛笂闈㈤偅鍙ョ璇戠殑涓嶅お濂-->
19# 自定键码 19# 畾涔夐敭鐮
20 20
21到目前为止,最常见的任务是更改现有键码的行为或创建新的键码。从代码角度来看这些操作都很相似。 21鍒扮洰鍓嶄负姝紝鏈甯歌鐨勪换鍔℃槸鏇存敼鐜版湁閿爜鐨勮涓烘垨鍒涘缓鏂扮殑閿爜銆備粠浠g爜瑙掑害鏉ョ湅杩欎簺鎿嶄綔閮藉緢鐩镐技銆
22 22
23## 鲂录 23## 畾涔変涓柊閿爜
24 24
25创建键码第一步,先枚举出它全部,也就是给键码起个名字并分配唯一数值。QMK没有直接限制最大键码值大小,而是提供了一个`SAFE_RANGE`宏。你可以在枚举时用`SAFE_RANGE`来保证你取得了唯一的键码值。 25鍒涘缓閿爜绗竴姝ワ紝鍏堟灇涓惧嚭瀹冨叏閮紝涔熷氨鏄粰閿爜璧蜂釜鍚嶅瓧骞跺垎閰嶅敮涓鏁板笺俀MK娌℃湁鐩存帴闄愬埗鏈澶ч敭鐮佸煎ぇ灏忥紝鑰屾槸鎻愪緵浜嗕竴涓猔SAFE_RANGE`瀹忋備綘鍙互鍦ㄦ灇涓炬椂鐢╜SAFE_RANGE`鏉ヤ繚璇佷綘鍙栧緱浜嗗敮涓鐨勯敭鐮佸笺
26 26
27 27
28这有枚黾氲睦印0颜饪加到`keymap.c`你就在布局中能用`FOO``BAR`了。 28杩欐湁鏋氫や釜敭鐮佺殑渚嬪瓙銆傛妸杩欏潡鍔犲埌`keymap.c`鐨勮瘽浣犲卞湪甯冨眬涓兘鐢`FOO``BAR`浜嗐
29 29
30```c 30```c
31enum my_keycodes { 31enum my_keycodes {
@@ -34,46 +34,46 @@ enum my_keycodes {
34}; 34};
35``` 35```
36 36
37## 氲男形喑 37## 涓洪敭鐮佺殑琛屼负栫▼
38 38
39当你覆盖一个已存在按键的行为时,或将这个行为赋给新键时,你要用`process_record_kb()`和`process_record_user()`函数。这俩函数在键处理中真实键事件被处理前被QMK调用。如果这俩函数返回`true`,QMK将会用正常的方式处理键码。这样可以很方便的扩展键码的功能而不是替换它。如果函数返回`false` QMK会跳过正常键处理,然后发送键子抬起还是按下事件就由你决定了。 39褰撲綘瑕嗙洊涓涓凡瀛樺湪鎸夐敭鐨勮涓烘椂锛屾垨灏嗚繖涓涓鸿祴缁欐柊閿椂锛屼綘瑕佺敤`process_record_kb()`鍜宍process_record_user()`鍑芥暟銆傝繖淇╁嚱鏁板湪閿鐞嗕腑鐪熷疄閿簨浠惰澶勭悊鍓嶈QMK璋冪敤銆傚鏋滆繖淇╁嚱鏁拌繑鍥瀈true`锛孮MK灏嗕細鐢ㄦ甯哥殑鏂瑰紡澶勭悊閿爜銆傝繖鏍峰彲浠ュ緢鏂逛究鐨勬墿灞曢敭鐮佺殑鍔熻兘鑰屼笉鏄浛鎹㈠畠銆傚鏋滃嚱鏁拌繑鍥瀈false` QMK浼氳烦杩囨甯搁敭澶勭悊锛岀劧鍚庡彂閫侀敭瀛愭姮璧疯繕鏄寜涓嬩簨浠跺氨鐢变綘鍐冲畾浜嗐
40 40
41当某聪禄蚴头攀闭饬┖岜坏饔谩 41褰撴煇敭鎸変笅鎴栭噴鏀炬椂杩欎咯鍑芥暟氳冪敤銆
42 42
43### process_record_user()`例实现 43### process_record_user()`鍑芥暟绀嬪疄鐜
44 44
45隼幼隽肆鍪隆W远ㄒ了一鼋凶`FOO`氲男形⒉了在按下回凳辈シ乓舴 45杩欎緥瀛愬仛浜嗕や釜浜嬨傝嚜畾涔変簡涓彨鍋`FOO`鐨勯敭鐮佺殑琛屼负惰ˉ鍏簡鍦ㄦ寜涓嬪洖杞︽椂鎾斁闊绗︺
46 46
47```c 47```c
48bool process_record_user(uint16_t keycode, keyrecord_t *record) { 48bool process_record_user(uint16_t keycode, keyrecord_t *record) {
49 switch (keycode) { 49 switch (keycode) {
50 case FOO: 50 case FOO:
51 if (record->event.pressed) { 51 if (record->event.pressed) {
52 // 按下时做些什么 52 // 鎸変笅鏃跺仛浜涗粈涔
53 } else { 53 } else {
54 // 释放时做些什么 54 // 閲婃斁鏃跺仛浜涗粈涔
55 } 55 }
56 return false; // 跳过此键的所有进一步处理 56 return false; // 璺宠繃姝ら敭鐨勬墍鏈夎繘涓姝ュ鐞
57 case KC_ENTER: 57 case KC_ENTER:
58 // 当按下回凳辈シ乓舴 58 // 褰撴寜涓嬪洖杞︽椂鎾斁闊
59 if (record->event.pressed) { 59 if (record->event.pressed) {
60 PLAY_NOTE_ARRAY(tone_qwerty); 60 PLAY_NOTE_ARRAY(tone_qwerty);
61 } 61 }
62 return true; // QMK触发回车按下/释放事件 62 return true; // QMK瑙﹀彂鍥炶溅鎸変笅/閲婃斁浜嬩欢
63 default: 63 default:
64 return true; // 处理他键码 64 return true; // 甯稿鐞嗗叾粬閿爜
65 } 65 }
66} 66}
67``` 67```
68 68
69### `process_record_*` 函数文档 69### `process_record_*` 鍑芥暟鏂囨。
70 70
71* 键盘/修订: `bool process_record_kb(uint16_t keycode, keyrecord_t *record)` 71* 閿洏/淇: `bool process_record_kb(uint16_t keycode, keyrecord_t *record)`
72* 布局: `bool process_record_user(uint16_t keycode, keyrecord_t *record)` 72* 甯冨眬: `bool process_record_user(uint16_t keycode, keyrecord_t *record)`
73 73
74`keycode(键码)`参数是在布局上定义的,比如`MO(1)`, `KC_L`, 等等。 你要用 `switch...case` 块来处理这些事件。 74`keycode(閿爜)`鍙傛暟鏄湪甯冨眬涓婂畾涔夌殑锛屾瘮濡俙MO(1)`, `KC_L`, 绛夌瓑銆 浣犺鐢 `switch...case` 鍧楁潵澶勭悊杩欎簺浜嬩欢銆
75 75
76`record`参数含有实际男畔ⅲ 76`record`鍙傛鍚湁瀹為檯鎸夐敭鐨勪俊鎭
77 77
78```c 78```c
79keyrecord_t record { 79keyrecord_t record {
@@ -88,9 +88,9 @@ keyrecord_t record {
88} 88}
89``` 89```
90 90
91# LED控制 91# LED鎺у埗
92 92
93qmk提供了读取HID规范包含的5LED的方法。: 93qmk鎻愪緵浜嗚鍙HID瑙勮寖鍖呭惈鐨5LED鐨勬柟娉曘:
94 94
95* `USB_LED_NUM_LOCK` 95* `USB_LED_NUM_LOCK`
96* `USB_LED_CAPS_LOCK` 96* `USB_LED_CAPS_LOCK`
@@ -98,20 +98,20 @@ qmk提供了读取HID规范包含的5个LED的方法。:
98* `USB_LED_COMPOSE` 98* `USB_LED_COMPOSE`
99* `USB_LED_KANA` 99* `USB_LED_KANA`
100 100
101龀A慷杂τ谥LED状态的位置位。 101杩欎簲涓搁噺瀵瑰簲浜庝LED鐘舵佺殑浣嶇疆浣嶃
102有两种方法可以竦弥LED状态: 102鏈変袱绉嶆柟娉曞彲ヨ幏寰椾LED鐘舵侊細
103 103
104* 通过执行 `led_set_user()` 104* 閫氳繃鎵ц `led_set_user()`
105* 过调用 `host_keyboard_leds()` 105* 閫氳繃璋冪 `host_keyboard_leds()`
106 106
107## `led_set_user()` 107## `led_set_user()`
108 108
1095LED中任何一龅淖刺枰时,此函数被调用。此函数过参数输入LED参数。 1095LED换浣曚釜鐨勭姸鎬侀渶瑕佹敼鍙樻椂锛屾鍑鏁板皢琚璋冪銆傛鍑芥暟閫氳繃鍙傛暟杈撳叆LED鍙傛暟銆
110使用`IS_LED_ON(usb_led, led_name)``IS_LED_OFF(usb_led, led_name)`这两龊昀醇觳LED状态。 110浣跨敤`IS_LED_ON(usb_led, led_name)``IS_LED_OFF(usb_led, led_name)`杩欎や釜瀹忔潵妫鏌LED鐘舵併
111 111
112!> `host_keyboard_leds()`可能会在`led_set_user()`被调用返回新值。 112!> `host_keyboard_leds()`鍙兘浼氬湪`led_set_user()`琚冪敤鍓嶈繑鍥炴柊鍊笺
113 113
114### `led_set_user()`例实现 114### `led_set_user()`鍑芥暟绀嬪疄鐜
115 115
116```c 116```c
117void led_set_user(uint8_t usb_led) { 117void led_set_user(uint8_t usb_led) {
@@ -143,59 +143,59 @@ void led_set_user(uint8_t usb_led) {
143} 143}
144``` 144```
145 145
146### `led_set_*`函数文档 146### `led_set_*`鍑芥暟鏂囨。
147 147
148* 键盘/修订: `void led_set_kb(uint8_t usb_led)` 148* 閿洏/淇: `void led_set_kb(uint8_t usb_led)`
149* 布局: `void led_set_user(uint8_t usb_led)` 149* 甯冨眬: `void led_set_user(uint8_t usb_led)`
150 150
151## `host_keyboard_leds()` 151## `host_keyboard_leds()`
152 152
153调用这个函数会返回最后收到的LED状态。这个函数在`led_set_*`之外读取LED状态时很有用,比如在[`matrix_scan_user()`](#矩阵扫描代码). 153璋冪敤杩欎釜鍑芥暟浼氳繑鍥炴渶鍚庢敹鍒扮殑LED鐘舵併傝繖涓嚱鏁板湪`led_set_*`涔嬪璇诲彇LED鐘舵佹椂寰堟湁鐢紝姣斿鍦╗`matrix_scan_user()`](#鐭╅樀鎵弿浠g爜).
154为了便捷,你可以用`IS_HOST_LED_ON(led_name)`和`IS_HOST_LED_OFF(led_name)` 宏,而不直接调用和检查`host_keyboard_leds()`。 154涓轰簡渚挎嵎锛屼綘鍙互鐢╜IS_HOST_LED_ON(led_name)`鍜宍IS_HOST_LED_OFF(led_name)` 瀹忥紝鑰屼笉鐩存帴璋冪敤鍜屾鏌host_keyboard_leds()`銆
155 155
156## 置物理LED状态 156## 缃墿鐞LED鐘舵
157 157
158一些键盘实现了为置物理LED的状态提┝朔奖的方法。 158涓浜涢敭鐩樺疄鐜颁簡涓缃墿鐞LED鐨勭姸鎬佹彁渚涗簡鏂渚跨殑鏂规硶
159 159
160### Ergodox Boards 160### Ergodox Boards
161 161
162Ergodox实现了提供`ergodox_right_led_1`/`2`/`3_on`/`off()`来让每个LED开或关, 也可以用 `ergodox_right_led_on`/`off(uint8_t led)` 按索引打开或关闭他们。 162Ergodox瀹炵幇浜嗘彁渚沗ergodox_right_led_1`/`2`/`3_on`/`off()`鏉ヨ姣忎釜LED寮鎴栧叧, 涔熷彲浠ョ敤 `ergodox_right_led_on`/`off(uint8_t led)` 鎸夌储寮曟墦寮鎴栧叧闂粬浠
163 163
164此外,还可以使用`ergodox_led_all_set(uint8_t n)`指定所有LED的亮度级别;针对每个LED用`ergodox_right_led_1`/`2`/`3_set(uint8_t n)`;使用索引的话用`ergodox_right_led_set(uint8_t led, uint8_t n)`。 164姝ゅ锛岃繕鍙互浣跨敤`ergodox_led_all_set(uint8_t n)`鎸囧畾鎵鏈塋ED鐨勪寒搴︾骇鍒紱閽堝姣忎釜LED鐢╜ergodox_right_led_1`/`2`/`3_set(uint8_t n)`锛涗娇鐢ㄧ储寮曠殑璇濈敤`ergodox_right_led_set(uint8_t led, uint8_t n)`銆
165 165
166Ergodox boards 同时定了最低亮燃侗`LED_BRIGHTNESS_LO`妥罡吡炼燃侗`LED_BRIGHTNESS_HI`(默认最高). 166Ergodox boards 悓鏃瀹氫箟浜嗘渶浣庝寒搴︾骇鍒`LED_BRIGHTNESS_LO`鍜屾渶楂樹害绾у埆`LED_BRIGHTNESS_HI`(榛樿鏈楂).
167 167
168# 键盘初始 168# 閿洏鍒濆鍖栦g爜
169 169
170键盘初始化过程有你是用那【鲇谀想要做什么。 170閿洏鍒濆鍖栬繃绋嬫湁鍑犱楠ゃ備犳槸鐢ㄩ嚱鏁板彇鍐充庝綘鎯宠鍋氫粈涔
171 171
172有三鲋饕初始吹饔盟承蛄谐 172鏈変瑕佸垵濮嬪寲鍑芥锛屾寜璋冪敤哄簭鍒楀嚭銆
173 173
174* `keyboard_pre_init_*` - 会在大多数他东西运行运行J视糜谀男┬提前运行的硬件初始化 174* `keyboard_pre_init_*` - 細鍦ㄥぇ澶氭鍏朵粬涓滆タ杩愯屽墠繍琛屻傞傜敤浜庡浜涢渶瑕佹彁鍓嶈繍岀殑纭欢鍒濆鍖栥
175* `matrix_init_*` - 在固件启过程中被调用。耸庇布殉跏蓟功能尚未初始 175* `matrix_init_*` - 鍦ㄥ浐浠鍔ㄨ繃绋腑闂琚皟鐢ㄣ傛鏃剁跺凡鍒濆鍖栵紝鍔熻兘灏氭湭鍒濆鍖栥
176* `keyboard_post_init_*` - 在固件启动过程最后被调用。大多数情况下,你的“客制化”代码都可以放在这里。 176* `keyboard_post_init_*` - 鍦ㄥ浐浠跺惎鍔ㄨ繃绋嬫渶鍚庤璋冪敤銆傚ぇ澶氭暟鎯呭喌涓嬶紝浣犵殑鈥滃鍒跺寲鈥濅唬鐮侀兘鍙互鏀惧湪杩欓噷銆
177 177
178!> 对于蠖嗍死此`keyboard_post_init_user`是你想要调用的数。例, 此时你可以RGB灯发光。 178!> 瀵逛簬澶у鏁颁汉鏉ヨ碻keyboard_post_init_user`浣犳兂瑕佽皟敤鐨勫嚱鏁般備緥濡, 姝ゆ椂浣犲彲浠缃RGB鐏彂鍏夈
179 179
180## 键盘预初始 180## 閿洏棰勫垵濮嬪寲g爜
181 181
182这代码极早运行踔炼USB初始化前运行 182杩欎鐮佹瀬鏃╄繍琛岋岀敋鑷抽兘鍦USB鍒濆鍖栧墠杩愯
183 183
184在这之后不久矩阵就怀跏蓟恕 184鍦ㄨ繖涔嬪悗涓嶄箙鐭╅樀灏琚垵濮嬪寲浜嗐
185 185
186对于大多数用,这用不到,因为它主要是用于面向硬某跏 186瀵逛簬澶澶氭暟鐢ㄦ埛鏉ヨ,杩欑敤涓嶅埌屽洜涓哄畠涓瑕佹鐢ㄤ簬闈㈠悜欢鐨勫垵濮嬪寲銆
187 187
188果你有硬件初始的话放在这里再貌还(比如初始疞ED引脚类的). 188浣嗗鏋滀綘鏈跺垵濮嬪寲鐨勮濇斁鍦ㄨ繖閲屽啀濂戒笉杩囦(斿鍒濆鍖LED寮曡剼涓绫).
189 189
190### `keyboard_pre_init_user()`例实现 190### `keyboard_pre_init_user()`鍑芥暟绀嬪疄鐜
191 191
192例中在碳侗穑 B0, B1, B2, B3, B4 LED引脚。 192鏈嬩腑鍦ㄩ敭鐩樼骇鍒瀹 B0, B1, B2, B3, B4 LED寮曡剼銆
193 193
194```c 194```c
195void keyboard_pre_init_user(void) { 195void keyboard_pre_init_user(void) {
196 // 调用键盘预初始 196 // 璋冪敤閿洏棰勫垵濮嬪寲g爜
197 197
198 // LED引脚为出模式 198 // 缃LED寮曡剼负杈撳嚭妯″紡
199 setPinOutput(B0); 199 setPinOutput(B0);
200 setPinOutput(B1); 200 setPinOutput(B1);
201 setPinOutput(B2); 201 setPinOutput(B2);
@@ -204,73 +204,73 @@ void keyboard_pre_init_user(void) {
204} 204}
205``` 205```
206 206
207### `keyboard_pre_init_*` 函数文档 207### `keyboard_pre_init_*` 鍑芥暟鏂囨。
208 208
209* 键盘/修订: `void keyboard_pre_init_kb(void)` 209* 閿洏/淇: `void keyboard_pre_init_kb(void)`
210* 布局: `void keyboard_pre_init_user(void)` 210* 甯冨眬: `void keyboard_pre_init_user(void)`
211 211
212## 矩阵初始 212## 鐭╅樀鍒濆鍖栦g爜
213 213
214这将会在矩阵初化时被调用,在某硬件煤螅但在些功能被初化前。 214杩欏皢氬湪鐭闃靛垵濮嬪寲鏃璋冪敤锛屽湪鏌愪惰缃ソ鍚庯屼絾鍦ㄤ竴浜涘姛鑳借鍒濆鍖栧墠銆
215 215
216这在你他地会用鞯氖焙岷苡杏茫胗布依赖于它的启位置。 216繖鍦犺栧湴鏂浼氱敤鍒扮殑涓滆タ鐨勬椂鍊欎細寰堟湁鐢紝浣嗕笌纭鏃犲叧锛屼篃涓嶄緷璧栦簬瀹冪殑鍚鍔ㄤ綅缃
217 217
218 218
219### `matrix_init_*`函数文档 219### `matrix_init_*`鍑芥暟鏂囨。
220 220
221* 键盘/修订: `void matrix_init_kb(void)` 221* 閿洏/淇: `void matrix_init_kb(void)`
222* 布局: `void matrix_init_user(void)` 222* 甯冨眬: `void matrix_init_user(void)`
223 223
224 224
225## 键盘后初始 225## 閿洏鍚庡垵濮嬪寲g爜
226 226
227这是键盘初始化过程中的最后一个任务。如果您想更改某些特性,这会很有用,因为此时应该对它们进行初始化。 227杩欐槸閿洏鍒濆鍖栬繃绋嬩腑鐨勬渶鍚庝竴涓换鍔°傚鏋滄偍鎯虫洿鏀规煇浜涚壒鎬э紝杩欎細寰堟湁鐢紝鍥犱负姝ゆ椂搴旇瀵瑰畠浠繘琛屽垵濮嬪寲銆
228 228
229 229
230### `keyboard_post_init_user()`例实现 230### `keyboard_post_init_user()`绀轰嬪疄鐜
231 231
232本示例在所有初始化完成后运行RGB灯。 232緥鍦ㄦ墍鏈夊垵濮嬪寲瀹屾垚鍚庤繍琛岋紝閰嶇疆RGB鐏
233 233
234```c 234```c
235void keyboard_post_init_user(void) { 235void keyboard_post_init_user(void) {
236 // 调用后初始 236 // 璋冪敤鍚庡垵濮嬪寲g爜
237 rgblight_enable_noeeprom(); // 使能Rgb,不保存 237 rgblight_enable_noeeprom(); // 浣胯兘Rgb锛屼笉淇濆瓨缃
238 rgblight_sethsv_noeeprom(180, 255, 255); // 将颜色蓝绿色(青色)槐4 238 rgblight_sethsv_noeeprom(180, 255, 255); // 灏嗛壊璁剧埌钃濈豢鑹(闈掕)涓嶄繚瀛
239 rgblight_mode_noeeprom(RGBLIGHT_MODE_BREATHING + 3); // 置快速呼吸模不保 239 rgblight_mode_noeeprom(RGBLIGHT_MODE_BREATHING + 3); // 揩閫熷懠鍚ā寮忎笉淇濆瓨
240} 240}
241``` 241```
242 242
243### `keyboard_post_init_*` 函数文档 243### `keyboard_post_init_*` 鍑芥暟鏂囨。
244 244
245* 键盘/修订: `void keyboard_post_init_kb(void)` 245* 閿洏/淇: `void keyboard_post_init_kb(void)`
246* 布局: `void keyboard_post_init_user(void)` 246* 甯冨眬: `void keyboard_post_init_user(void)`
247 247
248# 矩阵扫描代码 248# 鐭╅樀鎵弿浠g爜
249 249
250可能的话你要用`process_record_*()`自定义键盘,以这种方式连接到事件中,以确保代码不会对键盘产生负面的性能影响。然而,在极少数情况下,有必要进行矩阵扫描。在这些函数中要特别注意代码的性能,因为它每秒至少被调用10次。 250鍙兘鐨勮瘽浣犺鐢╜process_record_*()`鑷畾涔夐敭鐩橈紝浠ヨ繖绉嶆柟寮忚繛鎺ュ埌浜嬩欢涓紝浠ョ‘淇濅唬鐮佷笉浼氬閿洏浜х敓璐熼潰鐨勬ц兘褰卞搷銆傜劧鑰岋紝鍦ㄦ瀬灏戞暟鎯呭喌涓嬶紝鏈夊繀瑕佽繘琛岀煩闃垫壂鎻忋傚湪杩欎簺鍑芥暟涓鐗瑰埆娉ㄦ剰浠g爜鐨勬ц兘锛屽洜涓哄畠姣忕鑷冲皯琚皟鐢10娆°
251 251
252### `matrix_scan_*`例实现 252### `matrix_scan_*`绀轰嬪疄鐜
253 253
254这个例子被故意省略了。在hook这样一个对性能及其敏感的区域之前,您应该足够了解qmk的内部结构,以便在没有示例的情况下编写。如果你需要帮助,请[建立一个issue](https://github.com/qmk/qmk_firmware/issues/new)或[在Discord上与我们交流](https://discord.gg/Uq7gcHh). 254杩欎釜渚嬪瓙琚晠鎰忕渷鐣ヤ簡銆傚湪hook杩欐牱涓涓鎬ц兘鍙婂叾鏁忔劅鐨勫尯鍩熶箣鍓嶏紝鎮ㄥ簲璇ヨ冻澶熶簡瑙mk鐨勫唴閮ㄧ粨鏋勶紝浠ヤ究鍦ㄦ病鏈夌ず渚嬬殑鎯呭喌涓嬬紪鍐欍傚鏋滀綘闇瑕佸府鍔╋紝璇穂寤虹珛涓涓猧ssue](https://github.com/qmk/qmk_firmware/issues/new)鎴朳鍦―iscord涓婁笌鎴戜滑浜ゆ祦](https://discord.gg/Uq7gcHh).
255 255
256### `matrix_scan_*` 函数文档 256### `matrix_scan_*` 鍑芥暟鏂囨。
257 257
258* 键盘/修订: `void matrix_scan_kb(void)` 258* 閿洏/淇: `void matrix_scan_kb(void)`
259* 布局: `void matrix_scan_user(void)` 259* 甯冨眬: `void matrix_scan_user(void)`
260 260
261该函数在每次矩阵扫描时被调用,这基本与MCU处理能力上限相同。在这里写代码要谨慎,因为它会运行很多次。 261璇ュ嚱鏁板湪姣忔鐭╅樀鎵弿鏃惰璋冪敤锛岃繖鍩烘湰涓嶮CU澶勭悊鑳藉姏涓婇檺鐩稿悓銆傚湪杩欓噷鍐欎唬鐮佽璋ㄦ厧锛屽洜涓哄畠浼氳繍琛屽緢澶氭銆
262 262
263你会在自定义矩阵扫描代码时用到这个函数。这也可以用作自定义状态输出(比如LED灯或者屏幕)或者其他即便用户不输入你也想定期运行的功能。 263浣犱細鍦ㄨ嚜瀹氫箟鐭╅樀鎵弿浠g爜鏃剁敤鍒拌繖涓嚱鏁般傝繖涔熷彲浠ョ敤浣滆嚜瀹氫箟鐘舵佽緭鍑(姣斿LED鐏垨鑰呭睆骞)鎴栬呭叾浠栧嵆渚跨敤鎴蜂笉杈撳叆浣犱篃鎯冲畾鏈熻繍琛岀殑鍔熻兘銆
264 264
265 265
266# 键盘 空闲/唤醒 代码 266# 閿洏 绌洪棽/鍞ら啋 浠g爜
267 267
268如果键盘支持就可以通过停止一大票功能来达到"空闲"。RGB灯和背光就是很好的例子。这可以节约能耗,也可能让你键盘风味更佳。 268濡傛灉閿洏鏀寔灏卞彲浠ラ氳繃鍋滄涓澶хエ鍔熻兘鏉ヨ揪鍒"绌洪棽"銆俁GB鐏拰鑳屽厜灏辨槸寰堝ソ鐨勪緥瀛愩傝繖鍙互鑺傜害鑳借楋紝涔熷彲鑳借浣犻敭鐩橀鍛虫洿浣炽
269 269
270用两龊刂: `suspend_power_down_*``suspend_wakeup_init_*`, 分别在系统突叫咽钡饔谩 270鐢ㄤや釜鍑芥暟鎺у埗: `suspend_power_down_*``suspend_wakeup_init_*`, 垎鍒湪绯荤粺鏉闂插拰鍞ら啋鏃惰皟鐢ㄣ
271 271
272 272
273### suspend_power_down_user()suspend_wakeup_init_user()例实现 273### suspend_power_down_user()suspend_wakeup_init_user()绀轰嬪疄鐜
274 274
275 275
276```c 276```c
@@ -283,18 +283,18 @@ void suspend_wakeup_init_user(void) {
283} 283}
284``` 284```
285 285
286### 键盘 挂起/唤醒 函数文档 286### 閿洏 鎸傝捣/鍞ら啋 鍑芥暟鏂囨。
287 287
288* 键盘/修订: `void suspend_power_down_kb(void)` `void suspend_wakeup_init_user(void)` 288* 閿洏/淇: `void suspend_power_down_kb(void)` `void suspend_wakeup_init_user(void)`
289* 布局: `void suspend_power_down_kb(void)` `void suspend_wakeup_init_user(void)` 289* 甯冨眬: `void suspend_power_down_kb(void)` `void suspend_wakeup_init_user(void)`
290 290
291# 层改代码 291# 傛敼鍙唬鐮
292 292
293层改鼍驮诵写这对于或自处理很有用。 293姣忓綋傛敼鍙樿繖氨杩愯傝繖瀵逛簬灞傛寚绀烘垨鑷畾涔夊眰澶勭悊堟湁鐢
294 294
295### `layer_state_set_*` 例实现 295### `layer_state_set_*` 绀轰嬪疄鐜
296 296
297例使用了Planck键盘示范了 [RGB背光灯](feature_rgblight.md)之与层对应 297鏈嬩娇鐢ㄤ簡Planck洏绀鸿寖浜嗗浣曡缃 [RGB鑳屽厜鐏](feature_rgblight.md)浣夸嬩笌灞傚搴
298 298
299```c 299```c
300uint32_t layer_state_set_user(uint32_t state) { 300uint32_t layer_state_set_user(uint32_t state) {
@@ -318,31 +318,31 @@ uint32_t layer_state_set_user(uint32_t state) {
318 return state; 318 return state;
319} 319}
320``` 320```
321### `layer_state_set_*` 函数文档 321### `layer_state_set_*` 鍑芥暟鏂囨。
322 322
323* 键盘/修订: `uint32_t layer_state_set_kb(uint32_t state)` 323* 閿洏/淇: `uint32_t layer_state_set_kb(uint32_t state)`
324* 布局: `uint32_t layer_state_set_user(uint32_t state)` 324* 甯冨眬: `uint32_t layer_state_set_user(uint32_t state)`
325 325
326 326
327`状态`是活层的bitmask, 详见[布局](keymap.md#布局的层状态) 327`鎬乣鏄娲诲姩灞傜殑bitmask, 璇﹁[冨眬姒傝堪](keymap.md#甯冨眬鐨勫眰鐘舵)
328 328
329 329
330# 掉电保 (EEPROM) 330# 帀鐢繚瀛橀厤缃 (EEPROM)
331 331
332这会让你的配置长期的保存在键盘中。这些配置保存在你主控的EEPROM里,掉电不会消失。 设置可以用`eeconfig_read_kb`和`eeconfig_read_user`读取,可以用`eeconfig_update_kb`和`eeconfig_update_user`写入。这对于您希望能够切换的功能很有用(比如切换RGB层指示。此外,你可以用`eeconfig_init_kb`和`eeconfig_init_user`来设置EEPROM默认值。 332杩欎細璁╀綘鐨勯厤缃暱鏈熺殑淇濆瓨鍦ㄩ敭鐩樹腑銆傝繖浜涢厤缃繚瀛樺湪浣犱富鎺х殑EEPROM閲岋紝鎺夌數涓嶄細娑堝け銆 璁剧疆鍙互鐢╜eeconfig_read_kb`鍜宍eeconfig_read_user`璇诲彇锛屽彲浠ョ敤`eeconfig_update_kb`鍜宍eeconfig_update_user`鍐欏叆銆傝繖瀵逛簬鎮ㄥ笇鏈涜兘澶熷垏鎹㈢殑鍔熻兘寰堟湁鐢(姣斿鍒囨崲RGB灞傛寚绀恒傛澶栵紝浣犲彲浠ョ敤`eeconfig_init_kb`鍜宍eeconfig_init_user`鏉ヨ缃瓻EPROM榛樿鍊笺
333 333
334最复杂的部分可能是,有很多方法可以通过EEPROM存储和访问数据,并且并没有用哪种方法是“政治正确”的。你每个功能只有一个双字(四字节)空间。 334鏈澶嶆潅鐨勯儴鍒嗗彲鑳芥槸锛屾湁寰堝鏂规硶鍙互閫氳繃EEPROM瀛樺偍鍜岃闂暟鎹紝骞朵笖骞舵病鏈夌敤鍝鏂规硶鏄滄斂娌绘纭濈殑銆備綘姣忎釜鍔熻兘鍙湁涓涓弻瀛(鍥涘瓧鑺)绌洪棿銆
335 335
336记住EEPROM是有写入寿命的。尽管写入寿命很高,但是并不是只有设置写道EEPROM中。如果你写入频繁,你的MCU寿命将会变短。 336璁颁綇EEPROM鏄湁鍐欏叆瀵垮懡鐨勩傚敖绠″啓鍏ュ鍛藉緢楂橈紝浣嗘槸骞朵笉鏄彧鏈夎缃啓閬揈EPROM涓傚鏋滀綘鍐欏叆棰戠箒锛屼綘鐨凪CU瀵垮懡灏嗕細鍙樼煭銆
337 337
338* 如果您不理解这隼敲茨赡芟望避免用这鎏匦裕蛭它相当丛印 338* 濡傛灉鎮ㄤ嶇悊瑙欎釜渚嬪瓙锛岄堟偍鍙兘屾湜閬垮厤浣跨敤杩欎鐗规э紝鍥犱哄畠鐩稿綋澶嶆潅銆
339 339
340### 例实现 340### 绀轰嬪疄鐜
341 341
342本例讲解了如何添加设置,并且读写。本里使用了用户布局。这是一个复杂的函数,有很多事情要做。实际上,它使用了很多上述函数来工作! 342鏈緥璁茶В浜嗗浣曟坊鍔犺缃紝骞朵笖璇诲啓銆傛湰閲屼娇鐢ㄤ簡鐢ㄦ埛甯冨眬銆傝繖鏄竴涓鏉傜殑鍑芥暟锛屾湁寰堝浜嬫儏瑕佸仛銆傚疄闄呬笂锛屽畠浣跨敤浜嗗緢澶氫笂杩板嚱鏁版潵宸ヤ綔锛
343 343
344 344
345在你的keymap.c韵麓胩砑又: 345鍦ㄤ綘鐨keymap.c鏂囦欢涓屽皢浠ヤ笅浠鐮佹坊鍔犺嚦椤:
346```c 346```c
347typedef union { 347typedef union {
348 uint32_t raw; 348 uint32_t raw;
@@ -354,19 +354,19 @@ typedef union {
354user_config_t user_config; 354user_config_t user_config;
355``` 355```
356 356
357以上代码建立了一个结构体,该结构体可以存储设置并可用于写入EEPROM。如此这般将无需定义变量,因为在结构体中已然定义。要记住`bool` (布尔)值使用1位, `uint8_t`使用8位, `uint16_t`使用16位。你可以混合搭配使用,但是顺序记错可能会招致麻烦,因为那会改变写入写出的值。 357浠ヤ笂浠g爜寤虹珛浜嗕竴涓粨鏋勪綋锛岃缁撴瀯浣撳彲浠ュ瓨鍌ㄨ缃苟鍙敤浜庡啓鍏EPROM銆傚姝よ繖鑸皢鏃犻渶瀹氫箟鍙橀噺锛屽洜涓哄湪缁撴瀯浣撲腑宸茬劧瀹氫箟銆傝璁颁綇`bool` (甯冨皵)鍊间娇鐢1浣, `uint8_t`浣跨敤8浣, `uint16_t`浣跨敤16浣嶃備綘鍙互娣峰悎鎼厤浣跨敤锛屼絾鏄『搴忚閿欏彲鑳戒細鎷涜嚧楹荤儲锛屽洜涓洪偅浼氭敼鍙樺啓鍏ュ啓鍑虹殑鍊笺
358 358
359 `layer_state_set_*`函数中使用了`rgb_layer_change`,使用了`keyboard_post_init_user`和`process_record_user`来配置一切。 359 `layer_state_set_*`鍑芥暟涓娇鐢ㄤ簡`rgb_layer_change`锛屼娇鐢ㄤ簡`keyboard_post_init_user`鍜宍process_record_user`鏉ラ厤缃竴鍒囥
360 360
361首先要使用`keyboard_post_init_user,你要加入`eeconfig_read_user()`来填充你刚刚创建的结构体。然后您可以立即使用这个结构来控制您的布局中的功能。就像这样: 361棣栧厛瑕佷娇鐢╜keyboard_post_init_user锛屼綘瑕佸姞鍏eeconfig_read_user()`鏉ュ~鍏呬綘鍒氬垰鍒涘缓鐨勭粨鏋勪綋銆傜劧鍚庢偍鍙互绔嬪嵆浣跨敤杩欎釜缁撴瀯鏉ユ帶鍒舵偍鐨勫竷灞涓殑鍔熻兘銆傚氨鍍忚繖鏍凤細
362```c 362```c
363void keyboard_post_init_user(void) { 363void keyboard_post_init_user(void) {
364 // 调用布局级木卣蟪跏蓟 364 // 璋冪敤甯冨绾у埆鐨勭煩闃鍒濆鍖
365 365
366 // EEPROM读用渲 366 // EEPROM鐢ㄦ埛閰嶇疆
367 user_config.raw = eeconfig_read_user(); 367 user_config.raw = eeconfig_read_user();
368 368
369 // 使能,置默认层 369 // 濡備娇鑳斤紝璁疆榛灞
370 if (user_config.rgb_layer_change) { 370 if (user_config.rgb_layer_change) {
371 rgblight_enable_noeeprom(); 371 rgblight_enable_noeeprom();
372 rgblight_sethsv_noeeprom_cyan(); 372 rgblight_sethsv_noeeprom_cyan();
@@ -374,7 +374,7 @@ void keyboard_post_init_user(void) {
374 } 374 }
375} 375}
376``` 376```
377以上函数会在读EEPROM配置后立即使用该设置来设置默认层RGB颜色。"raw"的值是从你上面基于"union"创建的结构体中转换来的。 377浠ヤ笂鍑芥暟浼氬湪璇籈EPROM閰嶇疆鍚庣珛鍗充娇鐢ㄨ璁剧疆鏉ヨ缃粯璁ゅ眰RGB棰滆壊銆"raw"鐨勫兼槸浠庝綘涓婇潰鍩轰簬"union"鍒涘缓鐨勭粨鏋勪綋涓浆鎹㈡潵鐨勩
378 378
379```c 379```c
380uint32_t layer_state_set_user(uint32_t state) { 380uint32_t layer_state_set_user(uint32_t state) {
@@ -391,86 +391,86 @@ uint32_t layer_state_set_user(uint32_t state) {
391 case _ADJUST: 391 case _ADJUST:
392 if (user_config.rgb_layer_change) { rgblight_sethsv_noeeprom_white(); rgblight_mode_noeeprom(1); } 392 if (user_config.rgb_layer_change) { rgblight_sethsv_noeeprom_white(); rgblight_mode_noeeprom(1); }
393 break; 393 break;
394 default: // 他层蚰喜 394 default: // 閽堝鍏栧眰鎴栭粯璁ゅ眰
395 if (user_config.rgb_layer_change) { rgblight_sethsv_noeeprom_cyan(); rgblight_mode_noeeprom(1); } 395 if (user_config.rgb_layer_change) { rgblight_sethsv_noeeprom_cyan(); rgblight_mode_noeeprom(1); }
396 break; 396 break;
397 } 397 }
398 return state; 398 return state;
399} 399}
400``` 400```
401这样仅在值使能时会改变RGB背光灯。现在配置这个值, 为`process_record_user`创建一个新键码叫做`RGB_LYR`。我们要确保,如果使用正常的RGB代码,使用上面的示例将其关闭,请将其设置为: 401杩欐牱浠呭湪鍊间娇鑳芥椂浼氭敼鍙楻GB鑳屽厜鐏傜幇鍦ㄩ厤缃繖涓, 涓篳process_record_user`鍒涘缓涓涓柊閿爜鍙仛`RGB_LYR`銆傛垜浠纭繚锛屽鏋滀娇鐢ㄦ甯哥殑RGB浠g爜锛屼娇鐢ㄤ笂闈㈢殑绀轰緥灏嗗叾鍏抽棴锛岃灏嗗叾璁剧疆涓猴細
402```c 402```c
403 403
404bool process_record_user(uint16_t keycode, keyrecord_t *record) { 404bool process_record_user(uint16_t keycode, keyrecord_t *record) {
405 switch (keycode) { 405 switch (keycode) {
406 case FOO: 406 case FOO:
407 if (record->event.pressed) { 407 if (record->event.pressed) {
408 // 按下时做点什么 408 // 鎸変笅鏃跺仛鐐逛粈涔
409 } else { 409 } else {
410 // 释放时做点什么 410 // 閲婃斁鏃跺仛鐐逛粈涔
411 } 411 }
412 return false; // 跳过此键的进一步处理 412 return false; // 璺宠繃姝ら敭鐨勮繘涓姝ュ鐞
413 case KC_ENTER: 413 case KC_ENTER:
414 // 在按下回凳辈シ乓舴 414 // 鍦ㄦ寜涓嬪洖杞︽椂鎾斁闊
415 if (record->event.pressed) { 415 if (record->event.pressed) {
416 PLAY_NOTE_ARRAY(tone_qwerty); 416 PLAY_NOTE_ARRAY(tone_qwerty);
417 } 417 }
418 return true; // QMK产生回车按下/释放事件 418 return true; // QMK浜х敓鍥炶溅鎸変笅/閲婃斁浜嬩欢
419 case RGB_LYR: // 本句让underglow作为层蛘J褂谩 419 case RGB_LYR: // 鏈彞璁underglow浣滀哄眰鎸囩ず锛屾垨姝甯镐娇鐢ㄣ
420 if (record->event.pressed) { 420 if (record->event.pressed) {
421 user_config.rgb_layer_change ^= 1; // 切换状态 421 user_config.rgb_layer_change ^= 1; // 鍒囨崲鐘舵
422 eeconfig_update_user(user_config.raw); // EEPROM写入新状态 422 eeconfig_update_user(user_config.raw); // EEPROM鍐欏叆鏂扮姸鎬
423 if (user_config.rgb_layer_change) { // 如果层状态皇鼓 423 if (user_config.rgb_layer_change) { // 濡傛灉傜姸鎬佽浣胯兘
424 layer_state_set(layer_state); // 刻更新阊丈 424 layer_state_set(layer_state); // 閭d箞绔嬪埢鏇鏂板眰
425 } 425 }
426 } 426 }
427 return false; break; 427 return false; break;
428 case RGB_MODE_FORWARD ... RGB_MODE_GRADIENT: // 对于所有的RGB代码 (see quantum_keycodes.h, L400 可以参考) 428 case RGB_MODE_FORWARD ... RGB_MODE_GRADIENT: // 瀵逛簬鎵鏈夌殑RGB浠g爜 (see quantum_keycodes.h, L400 鍙互鍙傝)
429 if (record->event.pressed) { //本失能层指示,假你改了这觥阋把它 429 if (record->event.pressed) { //鏈彞澶鑳藉眰鎸囩ず锛屽亣璁綘鏀瑰彉浜鈥︿犺鎶婂畠绂佺敤
430 if (user_config.rgb_layer_change) { // 龅笔鼓苁 430 if (user_config.rgb_layer_change) { // 浠呭撲娇鑳芥椂
431 user_config.rgb_layer_change = false; // 失能,然后 431 user_config.rgb_layer_change = false; // 澶辫兘锛岀劧鍚
432 eeconfig_update_user(user_config.raw); // EEPROM写入 432 eeconfig_update_user(user_config.raw); // EEPROM鍐欏叆缃
433 } 433 }
434 } 434 }
435 return true; break; 435 return true; break;
436 default: 436 default:
437 return true; // 他键正 437 return true; // 鎸夊叾粬閿
438 } 438 }
439} 439}
440``` 440```
441最后你要加入`eeconfig_init_user`函数,所以当EEPROM重置时,可以指定默认值, 甚至自定义操作。想强制重置EEPROM,请用`EEP_RST`键码或[Bootmagic](feature_bootmagic.md)函数。比如,如果要在默认情况下设置RGB层指示,并保存默认值 441鏈鍚庝綘瑕佸姞鍏eeconfig_init_user`鍑芥暟锛屾墍浠ュ綋EEPROM閲嶇疆鏃讹紝鍙互鎸囧畾榛樿鍊, 鐢氳嚦鑷畾涔夋搷浣溿傛兂寮哄埗閲嶇疆EEPROM锛岃鐢╜EEP_RST`閿爜鎴朳Bootmagic](feature_bootmagic.md)鍑芥暟銆傛瘮濡傦紝濡傛灉瑕佸湪榛樿鎯呭喌涓嬭缃甊GB灞傛寚绀猴紝骞朵繚瀛橀粯璁ゅ
442 442
443```c 443```c
444void eeconfig_init_user(void) { // EEPROM正被重置 444void eeconfig_init_user(void) { // EEPROM姝h閲嶇疆
445 user_config.raw = 0; 445 user_config.raw = 0;
446 user_config.rgb_layer_change = true; // 我们想要认使能 446 user_config.rgb_layer_change = true; // 鎴戜鎯宠榛樿浣胯兘
447 eeconfig_update_user(user_config.raw); // EEPROM写入默认值 447 eeconfig_update_user(user_config.raw); // EEPROM鍐欏叆榛樿鍊
448 448
449 // use the non noeeprom versions, 还要向EEPROM写入这些值 449 // use the non noeeprom versions, 杩樿鍚EEPROM鍐欏叆杩欎簺鍊
450 rgblight_enable(); // 默认使能RGB 450 rgblight_enable(); // 榛樿浣胯兘RGB
451 rgblight_sethsv_cyan(); // 默认置青色 451 rgblight_sethsv_cyan(); // 璁剧疆闈掕壊
452 rgblight_mode(1); // 默认 452 rgblight_mode(1); // 璁剧疆闀夸寒
453} 453}
454``` 454```
455 455
456然后就完事了。RGB层指示会在你想让它工作时工作。这个设置会一直保存,即便你拔下键盘。如果你使用其他RGB代码,层指示将失能,现在它可以做你所想了。 456鐒跺悗灏卞畬浜嬩簡銆俁GB灞傛寚绀轰細鍦ㄤ綘鎯宠瀹冨伐浣滄椂宸ヤ綔銆傝繖涓缃細涓鐩翠繚瀛橈紝鍗充究浣犳嫈涓嬮敭鐩樸傚鏋滀綘浣跨敤鍏朵粬RGB浠g爜锛屽眰鎸囩ず灏嗗け鑳斤紝鐜板湪瀹冨彲浠ュ仛浣犳墍鎯充簡銆
457 457
458### 'EECONFIG' 函数文档 458### 'EECONFIG' 鍑芥暟鏂囨。
459 459
460* 键盘/修订: `void eeconfig_init_kb(void)`, `uint32_t eeconfig_read_kb(void)``void eeconfig_update_kb(uint32_t val)` 460* 閿洏/淇: `void eeconfig_init_kb(void)`, `uint32_t eeconfig_read_kb(void)``void eeconfig_update_kb(uint32_t val)`
461* 布局: `void eeconfig_init_user(void)`, `uint32_t eeconfig_read_user(void)``void eeconfig_update_user(uint32_t val)` 461* 甯冨眬: `void eeconfig_init_user(void)`, `uint32_t eeconfig_read_user(void)``void eeconfig_update_user(uint32_t val)`
462 462
463`val` 是你想写入EEPROM的值,`eeconfig_read_*`函数EEPROM返回一32(双字)的值。 463`val` 鏄綘鎯冲啓鍏EEPROM鐨勫硷紝`eeconfig_read_*`鍑芥暟浼氫EEPROM杩斿洖32(鍙屽瓧)鐨勫笺
464 464
465# 自定-(TAPPING_TERM) 465# 畾涔夊-闀挎寜涓晫鍊(TAPPING_TERM)
466默认情况下,击键-长按临界值是全球统一的,并且不能通过键进行配置。对于大多数用户来说这很好。但是在有些情况下,对于`LT`键来说按键延时对双功能键的提升更大,可能是因为有些键比其他的键更容易按住。为了不给每个都自定义键码,本功能可以为每个键定义`TAPPING_TERM`。 466榛樿鎯呭喌涓,鍑婚敭-闀挎寜涓寸晫鍊兼槸鍏ㄧ悆缁熶竴鐨勶紝骞朵笖涓嶈兘閫氳繃閿繘琛岄厤缃傚浜庡ぇ澶氭暟鐢ㄦ埛鏉ヨ杩欏緢濂姐備絾鏄湪鏈変簺鎯呭喌涓嬶紝瀵逛簬`LT`閿潵璇存寜閿欢鏃跺鍙屽姛鑳介敭鐨勬彁鍗囨洿澶э紝鍙兘鏄洜涓烘湁浜涢敭姣斿叾浠栫殑閿洿瀹规槗鎸変綇銆備负浜嗕笉缁欐瘡涓兘鑷畾涔夐敭鐮侊紝鏈姛鑳藉彲浠ヤ负姣忎釜閿畾涔塦TAPPING_TERM`銆
467 467
468想使能这龉δ艿幕, 要先在`config.h`加上`#define TAPPING_TERM_PER_KEY` 468鎯充娇鑳借繖姛鑳界殑璇, 瑕佸厛鍦`config.h`鍔犱笂`#define TAPPING_TERM_PER_KEY`
469 469
470 470
471## `get_tapping_term`例实现 471## `get_tapping_term`绀轰嬪疄鐜
472 472
473想要修改基于键码的`TAPPING TERM`,你要向`keymap.c`文件添加下代码: 473鎯宠淇敼鍩轰簬閿爜鐨`TAPPING TERM`,浣犺鍚`keymap.c`鏂囦欢娣诲姞濡備笅浠:
474 474
475```c 475```c
476uint16_t get_tapping_term(uint16_t keycode) { 476uint16_t get_tapping_term(uint16_t keycode) {
@@ -485,6 +485,6 @@ uint16_t get_tapping_term(uint16_t keycode) {
485} 485}
486``` 486```
487 487
488### `get_tapping_term` 函数文档 488### `get_tapping_term` 鍑芥暟鏂囨。
489 489
490不像这篇的他功能,这猶uantum或者键盘级别的灰没Ъ数即可。 490嶅儚杩欑瘒鐨勫叾栧姛兘,杩欎涓嶉渶瑕quantum鎴栬呴敭鐩樼鍒殑鍑芥暟屽彧瑕佺敤鎴风у嚱鏁板嵆鍙