]> git.donarmstrong.com Git - qmk_firmware.git/blob - docs/zh-cn/custom_quantum_functions.md
[Keyboard] Snagpad Configurator bugfix and readme refactor (#6381)
[qmk_firmware.git] / docs / zh-cn / custom_quantum_functions.md
1 # ÈçºÎ¶¨ÖÆÄã¼üÅ̵ŦÄÜ
2
3 ¶ÔÓںܶàÈËÀ´Ëµ¿ÍÖÆ»¯¼üÅ̿ɲ»Ö»ÊÇÏòÄãµÄµçÄÔ·¢ËÍÄã°´ÁËÄǸö¼þÕâô¼òµ¥¡£Äã¿Ï¶¨ÏëʵÏֱȼòµ¥°´¼üºÍºê¸ü¸´ÔӵŦÄÜ¡£QMKÓÐÄÜÈÃÄã×¢Èë´úÂëµÄ¹³×Ó, ¸²¸Ç¹¦ÄÜ, ÁíÍ⣬»¹¿ÉÒÔ×Ô¶¨Òå¼üÅÌÔÚ²»Í¬Çé¿öϵÄÐÐΪ¡£
4
5 ±¾Ò³²»¼Ù¶¨ÈκÎÌØÊâµÄQMK֪ʶ£¬µ«ÔĶÁ[Àí½âQMK](understanding_qmk.md)½«»áÔÚ¸ü»ù´¡µÄ²ãÃæ°ïÄãÀí½â·¢ÉúÁËʲô¡£
6
7 ## A Word on Core vs ¼üÅÌ vs ²¼¾Ö
8
9 ÎÒÃÇ°Ñqmk×éÖ¯³ÉÒ»¸ö²ã´Î½á¹¹£º
10
11 * Core (`_quantum`)
12   * Keyboard/Revision (`_kb`)
13     * Keymap (`_user`)
14
15 ÏÂÃæÃèÊöµÄÿһ¸öº¯Êý¶¼¿ÉÒÔÔÚ¶¨ÒåÉϼÓÒ»¸ö`_kb()`»ò `_user()` ºó׺¡£ ½¨ÒéÔÚ¼üÅÌ/ÐÞ¶©²ãʹÓÃ`_kb()`ºó׺£¬ÔÚ²¼¾Ö²ãʹÓÃ`_user()`ºó׺¡£
16
17 ÔÚ¼üÅÌ/ÐÞ¶©²ã¶¨Ò庯Êýʱ£¬`_kb()`ÔÚÖ´ÐÐÈκδúÂëÇ°Ïȵ÷ÓÃ`_user()`ÊDZØÒªµÄ£¬²»È»²¼¾Ö²ãº¯Êý¾Í²»Òª±»µ÷Óá£
18 <!-- ·­ÒëÎÊÌ⣺ÉÏÃæÄǾ䷭ÒëµÄ²»Ì«ºÃ-->
19 # ×Ô¶¨Òå¼üÂë
20
21 µ½Ä¿Ç°ÎªÖ¹£¬×î³£¼ûµÄÈÎÎñÊǸü¸ÄÏÖÓмüÂëµÄÐÐΪ»ò´´½¨ÐµļüÂë¡£´Ó´úÂë½Ç¶ÈÀ´¿´ÕâЩ²Ù×÷¶¼ºÜÏàËÆ¡£
22
23 ## ¶¨ÒåÒ»¸öмüÂë
24
25 ´´½¨¼üÂëµÚÒ»²½£¬ÏÈö¾Ù³öËüÈ«²¿£¬Ò²¾ÍÊǸø¼üÂëÆð¸öÃû×Ö²¢·ÖÅäΨһÊýÖµ¡£QMKûÓÐÖ±½ÓÏÞÖÆ×î´ó¼üÂëÖµ´óС£¬¶øÊÇÌṩÁËÒ»¸ö`SAFE_RANGE`ºê¡£Äã¿ÉÒÔÔÚö¾ÙʱÓÃ`SAFE_RANGE`À´±£Ö¤ÄãÈ¡µÃÁËΨһµÄ¼üÂëÖµ¡£
26
27
28 ÕâÓÐö¾ÙÁ½¸ö¼üÂëµÄÀý×Ó¡£°ÑÕâ¿é¼Óµ½`keymap.c`µÄ»°Äã¾ÍÔÚ²¼¾ÖÖÐÄÜÓÃ`FOO`ºÍ`BAR`ÁË¡£
29
30 ```c
31 enum my_keycodes {
32   FOO = SAFE_RANGE,
33   BAR
34 };
35 ```
36
37 ## Îª¼üÂëµÄÐÐΪ±à³Ì
38
39 µ±Ä㸲¸ÇÒ»¸öÒÑ´æÔÚ°´¼üµÄÐÐΪʱ£¬»ò½«Õâ¸öÐÐΪ¸³¸øмüʱ£¬ÄãÒªÓÃ`process_record_kb()`ºÍ`process_record_user()`º¯Êý¡£ÕâÁ©º¯ÊýÔÚ¼ü´¦ÀíÖÐÕæʵ¼üʼþ±»´¦ÀíÇ°±»QMKµ÷Óá£Èç¹ûÕâÁ©º¯Êý·µ»Ø`true`£¬QMK½«»áÓÃÕý³£µÄ·½Ê½´¦Àí¼üÂë¡£ÕâÑù¿ÉÒԺܷ½±ãµÄÀ©Õ¹¼üÂëµÄ¹¦Äܶø²»ÊÇÌæ»»Ëü¡£Èç¹ûº¯Êý·µ»Ø`false` QMK»áÌø¹ýÕý³£¼ü´¦Àí£¬È»ºó·¢Ëͼü×Ó̧Æð»¹ÊÇ°´ÏÂʼþ¾ÍÓÉÄã¾ö¶¨ÁË¡£
40
41 µ±Ä³¸ö¼ü°´Ï»òÊÍ·ÅʱÕâÁ©º¯Êý»á±»µ÷Óá£
42
43 ### process_record_user()`º¯ÊýʾÀýʵÏÖ
44
45 Õâ¸öÀý×Ó×öÁËÁ½¸öÊ¡£×Ô¶¨ÒåÁËÒ»¸ö½Ð×ö`FOO`µÄ¼üÂëµÄÐÐΪ£¬²¢²¹³äÁËÔÚ°´Ï»سµÊ±²¥·ÅÒô·û¡£
46
47 ```c
48 bool process_record_user(uint16_t keycode, keyrecord_t *record) {
49   switch (keycode) {
50     case FOO:
51       if (record->event.pressed) {
52         // °´ÏÂʱ×öЩʲô
53       } else {
54         // ÊÍ·Åʱ×öЩʲô
55       }
56       return false; // Ìø¹ý´Ë¼üµÄËùÓнøÒ»²½´¦Àí
57     case KC_ENTER:
58       // µ±°´Ï»سµÊ±²¥·ÅÒô·û
59       if (record->event.pressed) {
60         PLAY_NOTE_ARRAY(tone_qwerty);
61       }
62       return true; // ÈÃQMK´¥·¢»Ø³µ°´ÏÂ/ÊÍ·Åʼþ
63     default:
64       return true; // Õý³£´¦ÀíÆäËû¼üÂë
65   }
66 }
67 ```
68
69 ### `process_record_*` º¯ÊýÎĵµ
70
71 * ¼üÅÌ/ÐÞ¶©: `bool process_record_kb(uint16_t keycode, keyrecord_t *record)`
72 * ²¼¾Ö: `bool process_record_user(uint16_t keycode, keyrecord_t *record)`
73
74 `keycode(¼üÂë)`²ÎÊýÊÇÔÚ²¼¾ÖÉ϶¨ÒåµÄ£¬±ÈÈç`MO(1)`, `KC_L`, µÈµÈ¡£ ÄãÒªÓà`switch...case` ¿éÀ´´¦ÀíÕâЩʼþ¡£
75
76 `record`²ÎÊýº¬ÓÐʵ¼Ê°´¼üµÄÐÅÏ¢£º
77
78 ```c
79 keyrecord_t record {
80   keyevent_t event {
81     keypos_t key {
82       uint8_t col
83       uint8_t row
84     }
85     bool     pressed
86     uint16_t time
87   }
88 }
89 ```
90
91 # LED¿ØÖÆ
92
93 qmkÌṩÁ˶ÁÈ¡HID¹æ·¶°üº¬µÄ5¸öLEDµÄ·½·¨¡£:
94
95 * `USB_LED_NUM_LOCK`
96 * `USB_LED_CAPS_LOCK`
97 * `USB_LED_SCROLL_LOCK`
98 * `USB_LED_COMPOSE`
99 * `USB_LED_KANA`
100
101 ÕâÎå¸ö³£Á¿¶ÔÓ¦ÓÚÖ÷»úLED״̬µÄλÖÃλ¡£
102 ÓÐÁ½ÖÖ·½·¨¿ÉÒÔ»ñµÃÖ÷»úLED״̬£º
103
104 * Í¨¹ýÖ´ÐР`led_set_user()`
105 * Í¨¹ýµ÷Óà`host_keyboard_leds()`
106
107 ## `led_set_user()`
108
109 µ±5¸öLEDÖÐÈκÎÒ»¸öµÄ״̬ÐèÒª¸Ä±äʱ£¬´Ëº¯Êý½«±»µ÷Óᣴ˺¯Êýͨ¹ý²ÎÊýÊäÈëLED²ÎÊý¡£
110 ʹÓÃ`IS_LED_ON(usb_led, led_name)`ºÍ`IS_LED_OFF(usb_led, led_name)`ÕâÁ½¸öºêÀ´¼ì²éLED״̬¡£
111
112 !> `host_keyboard_leds()`¿ÉÄÜ»áÔÚ`led_set_user()`±»µ÷ÓÃÇ°·µ»ØÐÂÖµ¡£
113
114 ### `led_set_user()`º¯ÊýʾÀýʵÏÖ
115
116 ```c
117 void led_set_user(uint8_t usb_led) {
118     if (IS_LED_ON(usb_led, USB_LED_NUM_LOCK)) {
119         writePinLow(B0);
120     } else {
121         writePinHigh(B0);
122     }
123     if (IS_LED_ON(usb_led, USB_LED_CAPS_LOCK)) {
124         writePinLow(B1);
125     } else {
126         writePinHigh(B1);
127     }
128     if (IS_LED_ON(usb_led, USB_LED_SCROLL_LOCK)) {
129         writePinLow(B2);
130     } else {
131         writePinHigh(B2);
132     }
133     if (IS_LED_ON(usb_led, USB_LED_COMPOSE)) {
134         writePinLow(B3);
135     } else {
136         writePinHigh(B3);
137     }
138     if (IS_LED_ON(usb_led, USB_LED_KANA)) {
139         writePinLow(B4);
140     } else {
141         writePinHigh(B4);
142     }
143 }
144 ```
145
146 ### `led_set_*`º¯ÊýÎĵµ
147
148 * ¼üÅÌ/ÐÞ¶©: `void led_set_kb(uint8_t usb_led)`
149 * ²¼¾Ö: `void led_set_user(uint8_t usb_led)`
150
151 ## `host_keyboard_leds()`
152
153 µ÷ÓÃÕâ¸öº¯Êý»á·µ»Ø×îºóÊÕµ½µÄLED״̬¡£Õâ¸öº¯ÊýÔÚ`led_set_*`Ö®Íâ¶ÁÈ¡LED״̬ʱºÜÓÐÓ㬱ÈÈçÔÚ[`matrix_scan_user()`](#¾ØÕóɨÃè´úÂë).
154 ΪÁ˱ã½Ý£¬Äã¿ÉÒÔÓÃ`IS_HOST_LED_ON(led_name)`ºÍ`IS_HOST_LED_OFF(led_name)` ºê£¬¶ø²»Ö±½Óµ÷Óúͼì²é`host_keyboard_leds()`¡£
155
156 ## ÉèÖÃÎïÀíLED״̬
157
158 һЩ¼üÅÌʵÏÖÁËΪÉèÖÃÎïÀíLEDµÄ״̬ÌṩÁË·½±ãµÄ·½·¨¡£
159
160 ### Ergodox Boards
161
162 ErgodoxʵÏÖÁËÌṩ`ergodox_right_led_1`/`2`/`3_on`/`off()`À´ÈÃÿ¸öLED¿ª»ò¹Ø, Ò²¿ÉÒÔÓà`ergodox_right_led_on`/`off(uint8_t led)` °´Ë÷Òý´ò¿ª»ò¹Ø±ÕËûÃÇ¡£
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)`¡£
165
166 Ergodox boards Í¬Ê±¶¨ÒåÁË×îµÍÁÁ¶È¼¶±ð`LED_BRIGHTNESS_LO`ºÍ×î¸ßÁÁ¶È¼¶±ð`LED_BRIGHTNESS_HI`(ĬÈÏ×î¸ß).
167
168 # ¼üÅ̳õʼ»¯´úÂë
169
170 ¼üÅ̳õʼ»¯¹ý³ÌÓм¸¸ö²½Öè¡£ÄãÊÇÓÃÄǸöº¯ÊýÈ¡¾öÓÚÄãÏëÒª×öʲô¡£
171
172 ÓÐÈý¸öÖ÷Òª³õʼ»¯º¯Êý£¬°´µ÷ÓÃ˳ÐòÁгö¡£
173
174 * `keyboard_pre_init_*` - »áÔÚ´ó¶àÊýÆäËû¶«Î÷ÔËÐÐÇ°ÔËÐС£ÊÊÓÃÓÚÄÄЩÐèÒªÌáÇ°ÔËÐеÄÓ²¼þ³õʼ»¯¡£
175 * `matrix_init_*` - Ôڹ̼þÆô¶¯¹ý³ÌÖм䱻µ÷ÓᣴËʱӲ¼þÒѳõʼ»¯£¬¹¦ÄÜÉÐδ³õʼ»¯¡£
176 * `keyboard_post_init_*` - Ôڹ̼þÆô¶¯¹ý³Ì×îºó±»µ÷Óᣴó¶àÊýÇé¿öÏ£¬ÄãµÄ¡°¿ÍÖÆ»¯¡±´úÂ붼¿ÉÒÔ·ÅÔÚÕâÀï¡£
177
178 !> ¶ÔÓÚ´ó¶àÊýÈËÀ´Ëµ`keyboard_post_init_user`ÊÇÄãÏëÒªµ÷Óõĺ¯Êý¡£ÀýÈç, ´ËʱÄã¿ÉÒÔÉèÖÃRGBµÆ·¢¹â¡£
179
180 ## ¼üÅÌÔ¤³õʼ»¯´úÂë
181
182 Õâ´úÂ뼫ÔçÔËÐУ¬ÉõÖÁ¶¼ÔÚUSB³õʼ»¯Ç°ÔËÐС£
183
184 ÔÚÕâÖ®ºó²»¾Ã¾ØÕó¾Í±»³õʼ»¯ÁË¡£
185
186 ¶ÔÓÚ´ó¶àÊýÓû§À´Ëµ,ÕâÓò»µ½£¬ÒòΪËüÖ÷ÒªÊÇÓÃÓÚÃæÏòÓ²¼þµÄ³õʼ»¯¡£
187
188 µ«Èç¹ûÄãÓÐÓ²¼þ³õʼ»¯µÄ»°·ÅÔÚÕâÀïÔٺò»¹ýÁË(±ÈÈç³õʼ»¯LEDÒý½ÅÒ»ÀàµÄ).
189
190 ### `keyboard_pre_init_user()`º¯ÊýʾÀýʵÏÖ
191
192 ±¾ÀýÖÐÔÚ¼üÅ̼¶±ð£¬É趨 B0, B1, B2, B3, ºÍ B4 ÊÇLEDÒý½Å¡£
193
194 ```c
195 void keyboard_pre_init_user(void) {
196   // µ÷ÓüüÅÌÔ¤³õʼ»¯´úÂë
197
198   // ÉèÖÃLEDÒý½ÅΪÊä³öģʽ
199   setPinOutput(B0);
200   setPinOutput(B1);
201   setPinOutput(B2);
202   setPinOutput(B3);
203   setPinOutput(B4);
204 }
205 ```
206
207 ### `keyboard_pre_init_*` º¯ÊýÎĵµ
208
209 * ¼üÅÌ/ÐÞ¶©: `void keyboard_pre_init_kb(void)`
210 * ²¼¾Ö: `void keyboard_pre_init_user(void)`
211
212 ## ¾ØÕó³õʼ»¯´úÂë
213
214 Õ⽫»áÔÚ¾ØÕó³õʼ»¯Ê±±»µ÷Óã¬ÔÚijЩӲ¼þÉèÖúú󣬵«ÔÚһЩ¹¦Äܱ»³õʼ»¯Ç°¡£ 
215
216 ÕâÔÚÄãÉèÖÃÆäËûµØ·½»áÓõ½µÄ¶«Î÷µÄʱºò»áºÜÓÐÓ㬵«ÓëÓ²¼þÎ޹أ¬Ò²²»ÒÀÀµÓÚËüµÄÆô¶¯Î»Öá£
217
218
219 ### `matrix_init_*`º¯ÊýÎĵµ
220
221 * ¼üÅÌ/ÐÞ¶©: `void matrix_init_kb(void)`
222 * ²¼¾Ö: `void matrix_init_user(void)`
223
224
225 ## ¼üÅ̺ó³õʼ»¯´úÂë
226
227 ÕâÊǼüÅ̳õʼ»¯¹ý³ÌÖеÄ×îºóÒ»¸öÈÎÎñ¡£Èç¹ûÄúÏë¸ü¸ÄijЩÌØÐÔ£¬Õâ»áºÜÓÐÓã¬ÒòΪ´ËʱӦ¸Ã¶ÔËüÃǽøÐгõʼ»¯¡£
228
229
230 ### `keyboard_post_init_user()`ʾÀýʵÏÖ
231
232 ±¾Ê¾ÀýÔÚËùÓгõʼ»¯Íê³ÉºóÔËÐУ¬ÅäÖÃRGBµÆ¡£
233
234 ```c
235 void keyboard_post_init_user(void) {
236   // µ÷Óúó³õʼ»¯´úÂë
237   rgblight_enable_noeeprom(); // Ê¹ÄÜRgb£¬²»±£´æÉèÖÃ
238   rgblight_sethsv_noeeprom(180, 255, 255); // ½«ÑÕÉ«ÉèÖõ½À¶ÂÌÉ«(ÇàÉ«)²»±£´æ
239   rgblight_mode_noeeprom(RGBLIGHT_MODE_BREATHING + 3); // ÉèÖÿìËÙºôÎüģʽ²»±£´æ
240 }
241 ```
242
243 ### `keyboard_post_init_*` º¯ÊýÎĵµ
244
245 * ¼üÅÌ/ÐÞ¶©: `void keyboard_post_init_kb(void)`
246 * ²¼¾Ö: `void keyboard_post_init_user(void)`
247
248 # ¾ØÕóɨÃè´úÂë
249
250 ¿ÉÄܵĻ°ÄãÒªÓÃ`process_record_*()`×Ô¶¨Òå¼üÅÌ£¬ÒÔÕâÖÖ·½Ê½Á¬½Óµ½Ê¼þÖУ¬ÒÔÈ·±£´úÂë²»»á¶Ô¼üÅ̲úÉú¸ºÃæµÄÐÔÄÜÓ°Ï졣Ȼ¶ø£¬ÔÚ¼«ÉÙÊýÇé¿öÏ£¬ÓбØÒª½øÐоØÕóɨÃè¡£ÔÚÕâЩº¯ÊýÖÐÒªÌرð×¢Òâ´úÂëµÄÐÔÄÜ£¬ÒòΪËüÿÃëÖÁÉÙ±»µ÷ÓÃ10´Î¡£
251
252 ### `matrix_scan_*`ʾÀýʵÏÖ
253
254 Õâ¸öÀý×Ó±»¹ÊÒâÊ¡ÂÔÁË¡£ÔÚhookÕâÑùÒ»¸ö¶ÔÐÔÄܼ°ÆäÃô¸ÐµÄÇøÓò֮ǰ£¬ÄúÓ¦¸Ã×ã¹»Á˽âqmkµÄÄÚ²¿½á¹¹£¬ÒÔ±ãÔÚûÓÐʾÀýµÄÇé¿öϱàд¡£Èç¹ûÄãÐèÒª°ïÖú£¬Çë[½¨Á¢Ò»¸öissue](https://github.com/qmk/qmk_firmware/issues/new)»ò[ÔÚDiscordÉÏÓëÎÒÃǽ»Á÷](https://discord.gg/Uq7gcHh).
255
256 ### `matrix_scan_*` º¯ÊýÎĵµ
257
258 * ¼üÅÌ/ÐÞ¶©: `void matrix_scan_kb(void)`
259 * ²¼¾Ö: `void matrix_scan_user(void)`
260
261 ¸Ãº¯ÊýÔÚÿ´Î¾ØÕóɨÃèʱ±»µ÷Óã¬Õâ»ù±¾ÓëMCU´¦ÀíÄÜÁ¦ÉÏÏÞÏàͬ¡£ÔÚÕâÀïд´úÂëÒª½÷É÷£¬ÒòΪËü»áÔËÐкܶà´Î¡£
262
263 Äã»áÔÚ×Ô¶¨Òå¾ØÕóɨÃè´úÂëʱÓõ½Õâ¸öº¯Êý¡£ÕâÒ²¿ÉÒÔÓÃ×÷×Ô¶¨Òå״̬Êä³ö(±ÈÈçLEDµÆ»òÕßÆÁÄ»)»òÕßÆäËû¼´±ãÓû§²»ÊäÈëÄãÒ²Ï붨ÆÚÔËÐеŦÄÜ¡£
264
265
266 # ¼üÅÌ ¿ÕÏÐ/»½ÐÑ ´úÂë
267
268 Èç¹û¼üÅÌÖ§³Ö¾Í¿ÉÒÔͨ¹ýÍ£Ö¹Ò»´óƱ¹¦ÄÜÀ´´ïµ½"¿ÕÏÐ"¡£RGBµÆºÍ±³¹â¾ÍÊǺܺõÄÀý×Ó¡£Õâ¿ÉÒÔ½ÚÔ¼Äܺģ¬Ò²¿ÉÄÜÈÃÄã¼üÅÌ·çζ¸ü¼Ñ¡£
269
270 ÓÃÁ½¸öº¯Êý¿ØÖÆ: `suspend_power_down_*`ºÍ`suspend_wakeup_init_*`, ·Ö±ðÔÚϵͳ°å¿ÕÏкͻ½ÐÑʱµ÷Óá£
271
272
273 ### suspend_power_down_user()ºÍsuspend_wakeup_init_user()ʾÀýʵÏÖ
274
275
276 ```c
277 void suspend_power_down_user(void) {
278     rgb_matrix_set_suspend_state(true);
279 }
280
281 void suspend_wakeup_init_user(void) {
282     rgb_matrix_set_suspend_state(false);
283 }
284 ```
285
286 ### ¼üÅÌ ¹ÒÆð/»½ÐÑ º¯ÊýÎĵµ
287
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)`
290
291 # ²ã¸Ä±ä´úÂë
292
293 ÿµ±²ã¸Ä±äÕâ¸ö¾ÍÔËÐдúÂë¡£Õâ¶ÔÓÚ²ãָʾ»ò×Ô¶¨Òå²ã´¦ÀíºÜÓÐÓá£
294
295 ### `layer_state_set_*` Ê¾ÀýʵÏÖ
296
297 ±¾ÀýʹÓÃÁËPlanck¼üÅÌʾ·¶ÁËÈçºÎÉèÖà[RGB±³¹âµÆ](feature_rgblight.md)ʹ֮Óë²ã¶ÔÓ¦
298
299 ```c
300 uint32_t layer_state_set_user(uint32_t state) {
301     switch (biton32(state)) {
302     case _RAISE:
303         rgblight_setrgb (0x00,  0x00, 0xFF);
304         break;
305     case _LOWER:
306         rgblight_setrgb (0xFF,  0x00, 0x00);
307         break;
308     case _PLOVER:
309         rgblight_setrgb (0x00,  0xFF, 0x00);
310         break;
311     case _ADJUST:
312         rgblight_setrgb (0x7A,  0x00, 0xFF);
313         break;
314     default: //  for any other layers, or the default layer
315         rgblight_setrgb (0x00,  0xFF, 0xFF);
316         break;
317     }
318   return state;
319 }
320 ```
321 ### `layer_state_set_*` º¯ÊýÎĵµ
322
323 * ¼üÅÌ/ÐÞ¶©: `uint32_t layer_state_set_kb(uint32_t state)`
324 * ²¼¾Ö: `uint32_t layer_state_set_user(uint32_t state)`
325
326
327 ¸Ã`״̬`Êǻ²ãµÄbitmask, Ïê¼û[²¼¾Ö¸ÅÊö](keymap.md#²¼¾ÖµÄ²ã״̬)
328
329
330 # µôµç±£´æÅäÖà(EEPROM)
331
332 Õâ»áÈÃÄãµÄÅäÖó¤Æڵı£´æÔÚ¼üÅÌÖС£ÕâЩÅäÖñ£´æÔÚÄãÖ÷¿ØµÄEEPROMÀµôµç²»»áÏûʧ¡£ ÉèÖÿÉÒÔÓÃ`eeconfig_read_kb`ºÍ`eeconfig_read_user`¶ÁÈ¡£¬¿ÉÒÔÓÃ`eeconfig_update_kb`ºÍ`eeconfig_update_user`дÈë¡£Õâ¶ÔÓÚÄúÏ£ÍûÄܹ»Çл»µÄ¹¦ÄܺÜÓÐÓÃ(±ÈÈçÇл»RGB²ãָʾ¡£´ËÍ⣬Äã¿ÉÒÔÓÃ`eeconfig_init_kb`ºÍ`eeconfig_init_user`À´ÉèÖÃEEPROMĬÈÏÖµ¡£ 
333
334 ×ÔӵIJ¿·Ö¿ÉÄÜÊÇ£¬Óкܶ෽·¨¿ÉÒÔͨ¹ýEEPROM´æ´¢ºÍ·ÃÎÊÊý¾Ý£¬²¢ÇÒ²¢Ã»ÓÐÓÃÄÄÖÖ·½·¨ÊÇ¡°ÕþÖÎÕýÈ·¡±µÄ¡£Äãÿ¸ö¹¦ÄÜÖ»ÓÐÒ»¸öË«×Ö(ËÄ×Ö½Ú)¿Õ¼ä¡£
335
336 ¼ÇסEEPROMÊÇÓÐдÈëÊÙÃüµÄ¡£¾¡¹ÜдÈëÊÙÃüºÜ¸ß£¬µ«ÊDz¢²»ÊÇÖ»ÓÐÉèÖÃдµÀEEPROMÖС£Èç¹ûÄãдÈëƵ·±£¬ÄãµÄMCUÊÙÃü½«»á±ä¶Ì¡£
337
338 * Èç¹ûÄú²»Àí½âÕâ¸öÀý×Ó£¬ÄÇôÄú¿ÉÄÜÏ£Íû±ÜÃâʹÓÃÕâ¸öÌØÐÔ£¬ÒòΪËüÏ൱¸´ÔÓ¡£
339
340 ### Ê¾ÀýʵÏÖ
341
342 ±¾Àý½²½âÁËÈçºÎÌí¼ÓÉèÖ㬲¢ÇÒ¶Áд¡£±¾ÀïʹÓÃÁËÓû§²¼¾Ö¡£ÕâÊÇÒ»¸ö¸´Ôӵĺ¯Êý£¬ÓкܶàÊÂÇéÒª×ö¡£Êµ¼ÊÉÏ£¬ËüʹÓÃÁ˺ܶàÉÏÊöº¯ÊýÀ´¹¤×÷£¡
343
344
345 ÔÚÄãµÄkeymap.cÎļþÖУ¬½«ÒÔÏ´úÂëÌí¼ÓÖÁ¶¥²¿:
346 ```c
347 typedef union {
348   uint32_t raw;
349   struct {
350     bool     rgb_layer_change :1;
351   };
352 } user_config_t;
353
354 user_config_t user_config;
355 ```
356
357 ÒÔÉÏ´úÂ뽨Á¢ÁËÒ»¸ö½á¹¹Ì壬¸Ã½á¹¹Ìå¿ÉÒÔ´æ´¢ÉèÖò¢¿ÉÓÃÓÚдÈëEEPROM¡£Èç´ËÕâ°ã½«ÎÞÐ趨Òå±äÁ¿£¬ÒòΪÔڽṹÌåÖÐÒÑÈ»¶¨Òå¡£Òª¼Çס`bool` (²¼¶û)ֵʹÓÃ1λ, `uint8_t`ʹÓÃ8λ, `uint16_t`ʹÓÃ16λ¡£Äã¿ÉÒÔ»ìºÏ´îÅäʹÓ㬵«ÊÇ˳Ðò¼Ç´í¿ÉÄÜ»áÕÐÖÂÂé·³£¬ÒòΪÄÇ»á¸Ä±äдÈëд³öµÄÖµ¡£ 
358
359  `layer_state_set_*`º¯ÊýÖÐʹÓÃÁË`rgb_layer_change`£¬Ê¹ÓÃÁË`keyboard_post_init_user`ºÍ`process_record_user`À´ÅäÖÃÒ»ÇС£
360
361 Ê×ÏÈҪʹÓÃ`keyboard_post_init_user£¬ÄãÒª¼ÓÈë`eeconfig_read_user()`À´Ìî³äÄã¸Õ¸Õ´´½¨µÄ½á¹¹Ì塣ȻºóÄú¿ÉÒÔÁ¢¼´Ê¹ÓÃÕâ¸ö½á¹¹À´¿ØÖÆÄúµÄ²¼¾ÖÖеŦÄÜ¡£¾ÍÏñÕâÑù£º 
362 ```c
363 void keyboard_post_init_user(void) {
364   // µ÷Óò¼¾Ö¼¶±ðµÄ¾ØÕó³õʼ»¯
365
366   // ´ÓEEPROM¶ÁÓû§ÅäÖÃ
367   user_config.raw = eeconfig_read_user();
368
369   // ÈçʹÄÜ£¬ÉèÖÃĬÈϲã
370   if (user_config.rgb_layer_change) {
371     rgblight_enable_noeeprom();
372     rgblight_sethsv_noeeprom_cyan(); 
373     rgblight_mode_noeeprom(1);
374   }
375 }
376 ```
377 ÒÔÉϺ¯Êý»áÔÚ¶ÁEEPROMÅäÖúóÁ¢¼´Ê¹ÓøÃÉèÖÃÀ´ÉèÖÃĬÈϲãRGBÑÕÉ«¡£"raw"µÄÖµÊÇ´ÓÄãÉÏÃæ»ùÓÚ"union"´´½¨µÄ½á¹¹ÌåÖÐת»»À´µÄ¡£ 
378
379 ```c
380 uint32_t layer_state_set_user(uint32_t state) {
381     switch (biton32(state)) {
382     case _RAISE:
383         if (user_config.rgb_layer_change) { rgblight_sethsv_noeeprom_magenta(); rgblight_mode_noeeprom(1); }
384         break;
385     case _LOWER:
386         if (user_config.rgb_layer_change) { rgblight_sethsv_noeeprom_red(); rgblight_mode_noeeprom(1); }
387         break;
388     case _PLOVER:
389         if (user_config.rgb_layer_change) { rgblight_sethsv_noeeprom_green(); rgblight_mode_noeeprom(1); }
390         break;
391     case _ADJUST:
392         if (user_config.rgb_layer_change) { rgblight_sethsv_noeeprom_white(); rgblight_mode_noeeprom(1); }
393         break;
394     default: //  Õë¶ÔÆäËû²ã»òĬÈϲã
395         if (user_config.rgb_layer_change) { rgblight_sethsv_noeeprom_cyan(); rgblight_mode_noeeprom(1); }
396         break;
397     }
398   return state;
399 }
400 ```
401 ÕâÑù½öÔÚֵʹÄÜʱ»á¸Ä±äRGB±³¹âµÆ¡£ÏÖÔÚÅäÖÃÕâ¸öÖµ, Îª`process_record_user`´´½¨Ò»¸öмüÂë½Ð×ö`RGB_LYR`¡£ÎÒÃÇҪȷ±££¬Èç¹ûʹÓÃÕý³£µÄRGB´úÂ룬ʹÓÃÉÏÃæµÄʾÀý½«Æä¹Ø±Õ£¬Ç뽫ÆäÉèÖÃΪ£º
402 ```c
403
404 bool process_record_user(uint16_t keycode, keyrecord_t *record) {
405   switch (keycode) {
406     case FOO:
407       if (record->event.pressed) {
408         // °´ÏÂʱ×öµãʲô
409       } else {
410         // ÊÍ·Åʱ×öµãʲô
411       }
412       return false; // Ìø¹ý´Ë¼üµÄ½øÒ»²½´¦Àí
413     case KC_ENTER:
414         // ÔÚ°´Ï»سµÊ±²¥·ÅÒô·û
415         if (record->event.pressed) {
416             PLAY_NOTE_ARRAY(tone_qwerty);
417         }
418         return true; // ÈÃQMK²úÉú»Ø³µ°´ÏÂ/ÊÍ·Åʼþ
419     case RGB_LYR:  // ±¾¾äÈÃunderglow×÷Ϊ²ãָʾ£¬»òÕý³£Ê¹Óá£
420         if (record->event.pressed) { 
421             user_config.rgb_layer_change ^= 1; // Çл»×´Ì¬
422             eeconfig_update_user(user_config.raw); // ÏòEEPROMдÈëÐÂ״̬
423             if (user_config.rgb_layer_change) { // Èç¹û²ã״̬±»Ê¹ÄÜ
424                 layer_state_set(layer_state);   // ÄÇôÁ¢¿Ì¸üвãÑÕÉ«
425             }
426         }
427         return false; break;
428     case RGB_MODE_FORWARD ... RGB_MODE_GRADIENT: // ¶ÔÓÚËùÓеÄRGB´úÂë (see quantum_keycodes.h, L400 ¿ÉÒԲο¼)
429         if (record->event.pressed) { //±¾¾äʧÄܲãָʾ£¬¼ÙÉèÄã¸Ä±äÁËÕâ¸ö¡­ÄãÒª°ÑËü½ûÓÃ
430             if (user_config.rgb_layer_change) {        // ½öµ±Ê¹ÄÜʱ
431                 user_config.rgb_layer_change = false;  // Ê§ÄÜ£¬È»ºó 
432                 eeconfig_update_user(user_config.raw); // ÏòEEPROMдÈëÉèÖÃ
433             }
434         }
435         return true; break;
436     default:
437       return true; // °´ÆäËû¼üÕý³£
438   }
439 }
440 ```
441 ×îºóÄãÒª¼ÓÈë`eeconfig_init_user`º¯Êý£¬ËùÒÔµ±EEPROMÖØÖÃʱ£¬¿ÉÒÔÖ¸¶¨Ä¬ÈÏÖµ, ÉõÖÁ×Ô¶¨Òå²Ù×÷¡£ÏëÇ¿ÖÆÖØÖÃEEPROM£¬ÇëÓÃ`EEP_RST`¼üÂë»ò[Bootmagic](feature_bootmagic.md)º¯Êý¡£±ÈÈ磬Èç¹ûÒªÔÚĬÈÏÇé¿öÏÂÉèÖÃRGB²ãָʾ£¬²¢±£´æĬÈÏÖµ
442
443 ```c
444 void eeconfig_init_user(void) {  // EEPROMÕý±»ÖØÖÃ
445   user_config.raw = 0;
446   user_config.rgb_layer_change = true; // ÎÒÃÇÏëҪĬÈÏʹÄÜ
447   eeconfig_update_user(user_config.raw); // ÏòEEPROMдÈëĬÈÏÖµ
448
449   // use the non noeeprom versions, »¹ÒªÏòEEPROMдÈëÕâЩֵ
450   rgblight_enable(); // Ä¬ÈÏʹÄÜRGB
451   rgblight_sethsv_cyan();  // Ä¬ÈÏÉèÖÃÇàÉ«
452   rgblight_mode(1); // Ä¬ÈÏÉèÖó¤ÁÁ
453 }
454 ```
455
456 È»ºó¾ÍÍêÊÂÁË¡£RGB²ãָʾ»áÔÚÄãÏëÈÃËü¹¤×÷ʱ¹¤×÷¡£Õâ¸öÉèÖûáÒ»Ö±±£´æ£¬¼´±ãÄã°ÎϼüÅÌ¡£Èç¹ûÄãʹÓÃÆäËûRGB´úÂ룬²ãָʾ½«Ê§ÄÜ£¬ÏÖÔÚËü¿ÉÒÔ×öÄãËùÏëÁË¡£ 
457
458 ### 'EECONFIG' º¯ÊýÎĵµ
459
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)`
462
463 `val` ÊÇÄãÏëдÈëEEPROMµÄÖµ£¬`eeconfig_read_*`º¯Êý»á´ÓEEPROM·µ»ØÒ»¸ö32λ(Ë«×Ö)µÄÖµ¡£
464
465 # ×Ô¶¨Òå»÷¼ü-³¤°´ÁÙ½çÖµ(TAPPING_TERM)
466 ĬÈÏÇé¿öÏÂ,»÷¼ü-³¤°´ÁÙ½çÖµÊÇÈ«ÇòͳһµÄ£¬²¢ÇÒ²»ÄÜͨ¹ý¼ü½øÐÐÅäÖ᣶ÔÓÚ´ó¶àÊýÓû§À´ËµÕâºÜºÃ¡£µ«ÊÇÔÚÓÐЩÇé¿öÏ£¬¶ÔÓÚ`LT`¼üÀ´Ëµ°´¼üÑÓʱ¶ÔË«¹¦ÄܼüµÄÌáÉý¸ü´ó£¬¿ÉÄÜÊÇÒòΪÓÐЩ¼ü±ÈÆäËûµÄ¼ü¸üÈÝÒ×°´×¡¡£ÎªÁ˲»¸øÿ¸ö¶¼×Ô¶¨Òå¼üÂ룬±¾¹¦ÄÜ¿ÉÒÔΪÿ¸ö¼ü¶¨Òå`TAPPING_TERM`¡£
467
468 ÏëʹÄÜÕâ¸ö¹¦ÄܵĻ°, ÒªÏÈÔÚ`config.h`¼ÓÉÏ`#define TAPPING_TERM_PER_KEY`¡£
469
470
471 ## `get_tapping_term`ʾÀýʵÏÖ
472
473 ÏëÒªÐ޸ĻùÓÚ¼üÂëµÄ`TAPPING TERM`,ÄãÒªÏò`keymap.c`ÎļþÌí¼ÓÈçÏ´úÂë: 
474
475 ```c
476 uint16_t get_tapping_term(uint16_t keycode) {
477   switch (keycode) {
478     case SFT_T(KC_SPC):
479       return TAPPING_TERM + 1250;
480     case LT(1, KC_GRV):
481       return 130;
482     default:
483       return TAPPING_TERM;
484   }
485 }
486 ```
487
488 ### `get_tapping_term` º¯ÊýÎĵµ
489
490 ²»ÏñÕâƪµÄÆäËû¹¦ÄÜ,Õâ¸ö²»ÐèÒªquantum»òÕß¼üÅ̼¶±ðµÄº¯Êý£¬Ö»ÒªÓû§¼¶º¯Êý¼´¿É¡£