+# ÈçºÎ¶¨ÖÆÄã¼üÅ̵ŦÄÜ
+
+¶ÔÓںܶàÈËÀ´Ëµ¿ÍÖÆ»¯¼üÅ̿ɲ»Ö»ÊÇÏòÄãµÄµçÄÔ·¢ËÍÄã°´ÁËÄǸö¼þÕâô¼òµ¥¡£Äã¿Ï¶¨ÏëʵÏֱȼòµ¥°´¼üºÍºê¸ü¸´ÔӵŦÄÜ¡£QMKÓÐÄÜÈÃÄã×¢Èë´úÂëµÄ¹³×Ó, ¸²¸Ç¹¦ÄÜ, ÁíÍ⣬»¹¿ÉÒÔ×Ô¶¨Òå¼üÅÌÔÚ²»Í¬Çé¿öϵÄÐÐΪ¡£
+
+±¾Ò³²»¼Ù¶¨ÈκÎÌØÊâµÄQMK֪ʶ£¬µ«ÔĶÁ[Àí½âQMK](understanding_qmk.md)½«»áÔÚ¸ü»ù´¡µÄ²ãÃæ°ïÄãÀí½â·¢ÉúÁËʲô¡£
+
+## A Word on Core vs ¼üÅÌ vs ²¼¾Ö
+
+ÎÒÃÇ°Ñqmk×éÖ¯³ÉÒ»¸ö²ã´Î½á¹¹£º
+
+* Core (`_quantum`)
+ * Keyboard/Revision (`_kb`)
+ * Keymap (`_user`)
+
+ÏÂÃæÃèÊöµÄÿһ¸öº¯Êý¶¼¿ÉÒÔÔÚ¶¨ÒåÉϼÓÒ»¸ö`_kb()`»ò `_user()` ºó׺¡£ ½¨ÒéÔÚ¼üÅÌ/ÐÞ¶©²ãʹÓÃ`_kb()`ºó׺£¬ÔÚ²¼¾Ö²ãʹÓÃ`_user()`ºó׺¡£
+
+ÔÚ¼üÅÌ/ÐÞ¶©²ã¶¨Ò庯Êýʱ£¬`_kb()`ÔÚÖ´ÐÐÈκδúÂëÇ°Ïȵ÷ÓÃ`_user()`ÊDZØÒªµÄ£¬²»È»²¼¾Ö²ãº¯Êý¾Í²»Òª±»µ÷Óá£
+<!-- ·ÒëÎÊÌ⣺ÉÏÃæÄǾä·ÒëµÄ²»Ì«ºÃ-->
+# ×Ô¶¨Òå¼üÂë
+
+µ½Ä¿Ç°ÎªÖ¹£¬×î³£¼ûµÄÈÎÎñÊǸü¸ÄÏÖÓмüÂëµÄÐÐΪ»ò´´½¨ÐµļüÂë¡£´Ó´úÂë½Ç¶ÈÀ´¿´ÕâЩ²Ù×÷¶¼ºÜÏàËÆ¡£
+
+## ¶¨ÒåÒ»¸öмüÂë
+
+´´½¨¼üÂëµÚÒ»²½£¬ÏÈö¾Ù³öËüÈ«²¿£¬Ò²¾ÍÊǸø¼üÂëÆð¸öÃû×Ö²¢·ÖÅäΨһÊýÖµ¡£QMKûÓÐÖ±½ÓÏÞÖÆ×î´ó¼üÂëÖµ´óС£¬¶øÊÇÌṩÁËÒ»¸ö`SAFE_RANGE`ºê¡£Äã¿ÉÒÔÔÚö¾ÙʱÓÃ`SAFE_RANGE`À´±£Ö¤ÄãÈ¡µÃÁËΨһµÄ¼üÂëÖµ¡£
+
+
+ÕâÓÐö¾ÙÁ½¸ö¼üÂëµÄÀý×Ó¡£°ÑÕâ¿é¼Óµ½`keymap.c`µÄ»°Äã¾ÍÔÚ²¼¾ÖÖÐÄÜÓÃ`FOO`ºÍ`BAR`ÁË¡£
+
+```c
+enum my_keycodes {
+ FOO = SAFE_RANGE,
+ BAR
+};
+```
+
+## Ϊ¼üÂëµÄÐÐΪ±à³Ì
+
+µ±Ä㸲¸ÇÒ»¸öÒÑ´æÔÚ°´¼üµÄÐÐΪʱ£¬»ò½«Õâ¸öÐÐΪ¸³¸øмüʱ£¬ÄãÒªÓÃ`process_record_kb()`ºÍ`process_record_user()`º¯Êý¡£ÕâÁ©º¯ÊýÔÚ¼ü´¦ÀíÖÐÕæʵ¼üʼþ±»´¦ÀíÇ°±»QMKµ÷Óá£Èç¹ûÕâÁ©º¯Êý·µ»Ø`true`£¬QMK½«»áÓÃÕý³£µÄ·½Ê½´¦Àí¼üÂë¡£ÕâÑù¿ÉÒԺܷ½±ãµÄÀ©Õ¹¼üÂëµÄ¹¦Äܶø²»ÊÇÌæ»»Ëü¡£Èç¹ûº¯Êý·µ»Ø`false` QMK»áÌø¹ýÕý³£¼ü´¦Àí£¬È»ºó·¢Ëͼü×Ó̧Æð»¹ÊÇ°´ÏÂʼþ¾ÍÓÉÄã¾ö¶¨ÁË¡£
+
+µ±Ä³¸ö¼ü°´Ï»òÊÍ·ÅʱÕâÁ©º¯Êý»á±»µ÷Óá£
+
+### process_record_user()`º¯ÊýʾÀýʵÏÖ
+
+Õâ¸öÀý×Ó×öÁËÁ½¸öÊ¡£×Ô¶¨ÒåÁËÒ»¸ö½Ð×ö`FOO`µÄ¼üÂëµÄÐÐΪ£¬²¢²¹³äÁËÔÚ°´Ï»سµÊ±²¥·ÅÒô·û¡£
+
+```c
+bool process_record_user(uint16_t keycode, keyrecord_t *record) {
+ switch (keycode) {
+ case FOO:
+ if (record->event.pressed) {
+ // °´ÏÂʱ×öЩʲô
+ } else {
+ // ÊÍ·Åʱ×öЩʲô
+ }
+ return false; // Ìø¹ý´Ë¼üµÄËùÓнøÒ»²½´¦Àí
+ case KC_ENTER:
+ // µ±°´Ï»سµÊ±²¥·ÅÒô·û
+ if (record->event.pressed) {
+ PLAY_NOTE_ARRAY(tone_qwerty);
+ }
+ return true; // ÈÃQMK´¥·¢»Ø³µ°´ÏÂ/ÊÍ·Åʼþ
+ default:
+ return true; // Õý³£´¦ÀíÆäËû¼üÂë
+ }
+}
+```
+
+### `process_record_*` º¯ÊýÎĵµ
+
+* ¼üÅÌ/ÐÞ¶©: `bool process_record_kb(uint16_t keycode, keyrecord_t *record)`
+* ²¼¾Ö: `bool process_record_user(uint16_t keycode, keyrecord_t *record)`
+
+`keycode(¼üÂë)`²ÎÊýÊÇÔÚ²¼¾ÖÉ϶¨ÒåµÄ£¬±ÈÈç`MO(1)`, `KC_L`, µÈµÈ¡£ ÄãÒªÓà `switch...case` ¿éÀ´´¦ÀíÕâЩʼþ¡£
+
+`record`²ÎÊýº¬ÓÐʵ¼Ê°´¼üµÄÐÅÏ¢£º
+
+```c
+keyrecord_t record {
+ keyevent_t event {
+ keypos_t key {
+ uint8_t col
+ uint8_t row
+ }
+ bool pressed
+ uint16_t time
+ }
+}
+```
+
+# LED¿ØÖÆ
+
+qmkÌṩÁ˶ÁÈ¡HID¹æ·¶°üº¬µÄ5¸öLEDµÄ·½·¨¡£:
+
+* `USB_LED_NUM_LOCK`
+* `USB_LED_CAPS_LOCK`
+* `USB_LED_SCROLL_LOCK`
+* `USB_LED_COMPOSE`
+* `USB_LED_KANA`
+
+ÕâÎå¸ö³£Á¿¶ÔÓ¦ÓÚÖ÷»úLED״̬µÄλÖÃλ¡£
+ÓÐÁ½ÖÖ·½·¨¿ÉÒÔ»ñµÃÖ÷»úLED״̬£º
+
+* ͨ¹ýÖ´ÐÐ `led_set_user()`
+* ͨ¹ýµ÷Óà `host_keyboard_leds()`
+
+## `led_set_user()`
+
+µ±5¸öLEDÖÐÈκÎÒ»¸öµÄ״̬ÐèÒª¸Ä±äʱ£¬´Ëº¯Êý½«±»µ÷Óᣴ˺¯Êýͨ¹ý²ÎÊýÊäÈëLED²ÎÊý¡£
+ʹÓÃ`IS_LED_ON(usb_led, led_name)`ºÍ`IS_LED_OFF(usb_led, led_name)`ÕâÁ½¸öºêÀ´¼ì²éLED״̬¡£
+
+!> `host_keyboard_leds()`¿ÉÄÜ»áÔÚ`led_set_user()`±»µ÷ÓÃÇ°·µ»ØÐÂÖµ¡£
+
+### `led_set_user()`º¯ÊýʾÀýʵÏÖ
+
+```c
+void led_set_user(uint8_t usb_led) {
+ if (IS_LED_ON(usb_led, USB_LED_NUM_LOCK)) {
+ writePinLow(B0);
+ } else {
+ writePinHigh(B0);
+ }
+ if (IS_LED_ON(usb_led, USB_LED_CAPS_LOCK)) {
+ writePinLow(B1);
+ } else {
+ writePinHigh(B1);
+ }
+ if (IS_LED_ON(usb_led, USB_LED_SCROLL_LOCK)) {
+ writePinLow(B2);
+ } else {
+ writePinHigh(B2);
+ }
+ if (IS_LED_ON(usb_led, USB_LED_COMPOSE)) {
+ writePinLow(B3);
+ } else {
+ writePinHigh(B3);
+ }
+ if (IS_LED_ON(usb_led, USB_LED_KANA)) {
+ writePinLow(B4);
+ } else {
+ writePinHigh(B4);
+ }
+}
+```
+
+### `led_set_*`º¯ÊýÎĵµ
+
+* ¼üÅÌ/ÐÞ¶©: `void led_set_kb(uint8_t usb_led)`
+* ²¼¾Ö: `void led_set_user(uint8_t usb_led)`
+
+## `host_keyboard_leds()`
+
+µ÷ÓÃÕâ¸öº¯Êý»á·µ»Ø×îºóÊÕµ½µÄLED״̬¡£Õâ¸öº¯ÊýÔÚ`led_set_*`Ö®Íâ¶ÁÈ¡LED״̬ʱºÜÓÐÓ㬱ÈÈçÔÚ[`matrix_scan_user()`](#¾ØÕóɨÃè´úÂë).
+ΪÁ˱ã½Ý£¬Äã¿ÉÒÔÓÃ`IS_HOST_LED_ON(led_name)`ºÍ`IS_HOST_LED_OFF(led_name)` ºê£¬¶ø²»Ö±½Óµ÷Óúͼì²é`host_keyboard_leds()`¡£
+
+## ÉèÖÃÎïÀíLED״̬
+
+һЩ¼üÅÌʵÏÖÁËΪÉèÖÃÎïÀíLEDµÄ״̬ÌṩÁË·½±ãµÄ·½·¨¡£
+
+### Ergodox Boards
+
+ErgodoxʵÏÖÁËÌṩ`ergodox_right_led_1`/`2`/`3_on`/`off()`À´ÈÃÿ¸öLED¿ª»ò¹Ø, Ò²¿ÉÒÔÓà `ergodox_right_led_on`/`off(uint8_t led)` °´Ë÷Òý´ò¿ª»ò¹Ø±ÕËûÃÇ¡£
+
+´ËÍ⣬»¹¿ÉÒÔʹÓÃ`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)`¡£
+
+Ergodox boards ͬʱ¶¨ÒåÁË×îµÍÁÁ¶È¼¶±ð`LED_BRIGHTNESS_LO`ºÍ×î¸ßÁÁ¶È¼¶±ð`LED_BRIGHTNESS_HI`(ĬÈÏ×î¸ß).
+
+# ¼üÅ̳õʼ»¯´úÂë
+
+¼üÅ̳õʼ»¯¹ý³ÌÓм¸¸ö²½Öè¡£ÄãÊÇÓÃÄǸöº¯ÊýÈ¡¾öÓÚÄãÏëÒª×öʲô¡£
+
+ÓÐÈý¸öÖ÷Òª³õʼ»¯º¯Êý£¬°´µ÷ÓÃ˳ÐòÁгö¡£
+
+* `keyboard_pre_init_*` - »áÔÚ´ó¶àÊýÆäËû¶«Î÷ÔËÐÐÇ°ÔËÐС£ÊÊÓÃÓÚÄÄЩÐèÒªÌáÇ°ÔËÐеÄÓ²¼þ³õʼ»¯¡£
+* `matrix_init_*` - Ôڹ̼þÆô¶¯¹ý³ÌÖм䱻µ÷ÓᣴËʱӲ¼þÒѳõʼ»¯£¬¹¦ÄÜÉÐδ³õʼ»¯¡£
+* `keyboard_post_init_*` - Ôڹ̼þÆô¶¯¹ý³Ì×îºó±»µ÷Óᣴó¶àÊýÇé¿öÏ£¬ÄãµÄ¡°¿ÍÖÆ»¯¡±´úÂ붼¿ÉÒÔ·ÅÔÚÕâÀï¡£
+
+!> ¶ÔÓÚ´ó¶àÊýÈËÀ´Ëµ`keyboard_post_init_user`ÊÇÄãÏëÒªµ÷Óõĺ¯Êý¡£ÀýÈç, ´ËʱÄã¿ÉÒÔÉèÖÃRGBµÆ·¢¹â¡£
+
+## ¼üÅÌÔ¤³õʼ»¯´úÂë
+
+Õâ´úÂ뼫ÔçÔËÐУ¬ÉõÖÁ¶¼ÔÚUSB³õʼ»¯Ç°ÔËÐС£
+
+ÔÚÕâÖ®ºó²»¾Ã¾ØÕó¾Í±»³õʼ»¯ÁË¡£
+
+¶ÔÓÚ´ó¶àÊýÓû§À´Ëµ,ÕâÓò»µ½£¬ÒòΪËüÖ÷ÒªÊÇÓÃÓÚÃæÏòÓ²¼þµÄ³õʼ»¯¡£
+
+µ«Èç¹ûÄãÓÐÓ²¼þ³õʼ»¯µÄ»°·ÅÔÚÕâÀïÔٺò»¹ýÁË(±ÈÈç³õʼ»¯LEDÒý½ÅÒ»ÀàµÄ).
+
+### `keyboard_pre_init_user()`º¯ÊýʾÀýʵÏÖ
+
+±¾ÀýÖÐÔÚ¼üÅ̼¶±ð£¬É趨 B0, B1, B2, B3, ºÍ B4 ÊÇLEDÒý½Å¡£
+
+```c
+void keyboard_pre_init_user(void) {
+ // µ÷ÓüüÅÌÔ¤³õʼ»¯´úÂë
+
+ // ÉèÖÃLEDÒý½ÅΪÊä³öģʽ
+ setPinOutput(B0);
+ setPinOutput(B1);
+ setPinOutput(B2);
+ setPinOutput(B3);
+ setPinOutput(B4);
+}
+```
+
+### `keyboard_pre_init_*` º¯ÊýÎĵµ
+
+* ¼üÅÌ/ÐÞ¶©: `void keyboard_pre_init_kb(void)`
+* ²¼¾Ö: `void keyboard_pre_init_user(void)`
+
+## ¾ØÕó³õʼ»¯´úÂë
+
+Õ⽫»áÔÚ¾ØÕó³õʼ»¯Ê±±»µ÷Óã¬ÔÚijЩӲ¼þÉèÖúú󣬵«ÔÚһЩ¹¦Äܱ»³õʼ»¯Ç°¡£
+
+ÕâÔÚÄãÉèÖÃÆäËûµØ·½»áÓõ½µÄ¶«Î÷µÄʱºò»áºÜÓÐÓ㬵«ÓëÓ²¼þÎ޹أ¬Ò²²»ÒÀÀµÓÚËüµÄÆô¶¯Î»Öá£
+
+
+### `matrix_init_*`º¯ÊýÎĵµ
+
+* ¼üÅÌ/ÐÞ¶©: `void matrix_init_kb(void)`
+* ²¼¾Ö: `void matrix_init_user(void)`
+
+
+## ¼üÅ̺ó³õʼ»¯´úÂë
+
+ÕâÊǼüÅ̳õʼ»¯¹ý³ÌÖеÄ×îºóÒ»¸öÈÎÎñ¡£Èç¹ûÄúÏë¸ü¸ÄijЩÌØÐÔ£¬Õâ»áºÜÓÐÓã¬ÒòΪ´ËʱӦ¸Ã¶ÔËüÃǽøÐгõʼ»¯¡£
+
+
+### `keyboard_post_init_user()`ʾÀýʵÏÖ
+
+±¾Ê¾ÀýÔÚËùÓгõʼ»¯Íê³ÉºóÔËÐУ¬ÅäÖÃRGBµÆ¡£
+
+```c
+void keyboard_post_init_user(void) {
+ // µ÷Óúó³õʼ»¯´úÂë
+ rgblight_enable_noeeprom(); // ʹÄÜRgb£¬²»±£´æÉèÖÃ
+ rgblight_sethsv_noeeprom(180, 255, 255); // ½«ÑÕÉ«ÉèÖõ½À¶ÂÌÉ«(ÇàÉ«)²»±£´æ
+ rgblight_mode_noeeprom(RGBLIGHT_MODE_BREATHING + 3); // ÉèÖÿìËÙºôÎüģʽ²»±£´æ
+}
+```
+
+### `keyboard_post_init_*` º¯ÊýÎĵµ
+
+* ¼üÅÌ/ÐÞ¶©: `void keyboard_post_init_kb(void)`
+* ²¼¾Ö: `void keyboard_post_init_user(void)`
+
+# ¾ØÕóɨÃè´úÂë
+
+¿ÉÄܵĻ°ÄãÒªÓÃ`process_record_*()`×Ô¶¨Òå¼üÅÌ£¬ÒÔÕâÖÖ·½Ê½Á¬½Óµ½Ê¼þÖУ¬ÒÔÈ·±£´úÂë²»»á¶Ô¼üÅ̲úÉú¸ºÃæµÄÐÔÄÜÓ°Ï졣Ȼ¶ø£¬ÔÚ¼«ÉÙÊýÇé¿öÏ£¬ÓбØÒª½øÐоØÕóɨÃè¡£ÔÚÕâЩº¯ÊýÖÐÒªÌرð×¢Òâ´úÂëµÄÐÔÄÜ£¬ÒòΪËüÿÃëÖÁÉÙ±»µ÷ÓÃ10´Î¡£
+
+### `matrix_scan_*`ʾÀýʵÏÖ
+
+Õâ¸öÀý×Ó±»¹ÊÒâÊ¡ÂÔÁË¡£ÔÚhookÕâÑùÒ»¸ö¶ÔÐÔÄܼ°ÆäÃô¸ÐµÄÇøÓò֮ǰ£¬ÄúÓ¦¸Ã×ã¹»Á˽âqmkµÄÄÚ²¿½á¹¹£¬ÒÔ±ãÔÚûÓÐʾÀýµÄÇé¿öϱàд¡£Èç¹ûÄãÐèÒª°ïÖú£¬Çë[½¨Á¢Ò»¸öissue](https://github.com/qmk/qmk_firmware/issues/new)»ò[ÔÚDiscordÉÏÓëÎÒÃǽ»Á÷](https://discord.gg/Uq7gcHh).
+
+### `matrix_scan_*` º¯ÊýÎĵµ
+
+* ¼üÅÌ/ÐÞ¶©: `void matrix_scan_kb(void)`
+* ²¼¾Ö: `void matrix_scan_user(void)`
+
+¸Ãº¯ÊýÔÚÿ´Î¾ØÕóɨÃèʱ±»µ÷Óã¬Õâ»ù±¾ÓëMCU´¦ÀíÄÜÁ¦ÉÏÏÞÏàͬ¡£ÔÚÕâÀïд´úÂëÒª½÷É÷£¬ÒòΪËü»áÔËÐкܶà´Î¡£
+
+Äã»áÔÚ×Ô¶¨Òå¾ØÕóɨÃè´úÂëʱÓõ½Õâ¸öº¯Êý¡£ÕâÒ²¿ÉÒÔÓÃ×÷×Ô¶¨Òå״̬Êä³ö(±ÈÈçLEDµÆ»òÕßÆÁÄ»)»òÕßÆäËû¼´±ãÓû§²»ÊäÈëÄãÒ²Ï붨ÆÚÔËÐеŦÄÜ¡£
+
+
+# ¼üÅÌ ¿ÕÏÐ/»½ÐÑ ´úÂë
+
+Èç¹û¼üÅÌÖ§³Ö¾Í¿ÉÒÔͨ¹ýÍ£Ö¹Ò»´óƱ¹¦ÄÜÀ´´ïµ½"¿ÕÏÐ"¡£RGBµÆºÍ±³¹â¾ÍÊǺܺõÄÀý×Ó¡£Õâ¿ÉÒÔ½ÚÔ¼Äܺģ¬Ò²¿ÉÄÜÈÃÄã¼üÅÌ·çζ¸ü¼Ñ¡£
+
+ÓÃÁ½¸öº¯Êý¿ØÖÆ: `suspend_power_down_*`ºÍ`suspend_wakeup_init_*`, ·Ö±ðÔÚϵͳ°å¿ÕÏкͻ½ÐÑʱµ÷Óá£
+
+
+### suspend_power_down_user()ºÍsuspend_wakeup_init_user()ʾÀýʵÏÖ
+
+
+```c
+void suspend_power_down_user(void) {
+ rgb_matrix_set_suspend_state(true);
+}
+
+void suspend_wakeup_init_user(void) {
+ rgb_matrix_set_suspend_state(false);
+}
+```
+
+### ¼üÅÌ ¹ÒÆð/»½ÐÑ º¯ÊýÎĵµ
+
+* ¼üÅÌ/ÐÞ¶©: `void suspend_power_down_kb(void)` ºÍ`void suspend_wakeup_init_user(void)`
+* ²¼¾Ö: `void suspend_power_down_kb(void)` ºÍ `void suspend_wakeup_init_user(void)`
+
+# ²ã¸Ä±ä´úÂë
+
+ÿµ±²ã¸Ä±äÕâ¸ö¾ÍÔËÐдúÂë¡£Õâ¶ÔÓÚ²ãָʾ»ò×Ô¶¨Òå²ã´¦ÀíºÜÓÐÓá£
+
+### `layer_state_set_*` ʾÀýʵÏÖ
+
+±¾ÀýʹÓÃÁËPlanck¼üÅÌʾ·¶ÁËÈçºÎÉèÖà [RGB±³¹âµÆ](feature_rgblight.md)ʹ֮Óë²ã¶ÔÓ¦
+
+```c
+uint32_t layer_state_set_user(uint32_t state) {
+ switch (biton32(state)) {
+ case _RAISE:
+ rgblight_setrgb (0x00, 0x00, 0xFF);
+ break;
+ case _LOWER:
+ rgblight_setrgb (0xFF, 0x00, 0x00);
+ break;
+ case _PLOVER:
+ rgblight_setrgb (0x00, 0xFF, 0x00);
+ break;
+ case _ADJUST:
+ rgblight_setrgb (0x7A, 0x00, 0xFF);
+ break;
+ default: // for any other layers, or the default layer
+ rgblight_setrgb (0x00, 0xFF, 0xFF);
+ break;
+ }
+ return state;
+}
+```
+### `layer_state_set_*` º¯ÊýÎĵµ
+
+* ¼üÅÌ/ÐÞ¶©: `uint32_t layer_state_set_kb(uint32_t state)`
+* ²¼¾Ö: `uint32_t layer_state_set_user(uint32_t state)`
+
+
+¸Ã`״̬`Êǻ²ãµÄbitmask, Ïê¼û[²¼¾Ö¸ÅÊö](keymap.md#²¼¾ÖµÄ²ã״̬)
+
+
+# µôµç±£´æÅäÖà (EEPROM)
+
+Õâ»áÈÃÄãµÄÅäÖó¤Æڵı£´æÔÚ¼üÅÌÖС£ÕâЩÅäÖñ£´æÔÚÄãÖ÷¿ØµÄEEPROMÀµôµç²»»áÏûʧ¡£ ÉèÖÿÉÒÔÓÃ`eeconfig_read_kb`ºÍ`eeconfig_read_user`¶ÁÈ¡£¬¿ÉÒÔÓÃ`eeconfig_update_kb`ºÍ`eeconfig_update_user`дÈë¡£Õâ¶ÔÓÚÄúÏ£ÍûÄܹ»Çл»µÄ¹¦ÄܺÜÓÐÓÃ(±ÈÈçÇл»RGB²ãָʾ¡£´ËÍ⣬Äã¿ÉÒÔÓÃ`eeconfig_init_kb`ºÍ`eeconfig_init_user`À´ÉèÖÃEEPROMĬÈÏÖµ¡£
+
+×ÔӵIJ¿·Ö¿ÉÄÜÊÇ£¬Óкܶ෽·¨¿ÉÒÔͨ¹ýEEPROM´æ´¢ºÍ·ÃÎÊÊý¾Ý£¬²¢ÇÒ²¢Ã»ÓÐÓÃÄÄÖÖ·½·¨ÊÇ¡°ÕþÖÎÕýÈ·¡±µÄ¡£Äãÿ¸ö¹¦ÄÜÖ»ÓÐÒ»¸öË«×Ö(ËÄ×Ö½Ú)¿Õ¼ä¡£
+
+¼ÇסEEPROMÊÇÓÐдÈëÊÙÃüµÄ¡£¾¡¹ÜдÈëÊÙÃüºÜ¸ß£¬µ«ÊDz¢²»ÊÇÖ»ÓÐÉèÖÃдµÀEEPROMÖС£Èç¹ûÄãдÈëƵ·±£¬ÄãµÄMCUÊÙÃü½«»á±ä¶Ì¡£
+
+* Èç¹ûÄú²»Àí½âÕâ¸öÀý×Ó£¬ÄÇôÄú¿ÉÄÜÏ£Íû±ÜÃâʹÓÃÕâ¸öÌØÐÔ£¬ÒòΪËüÏ൱¸´ÔÓ¡£
+
+### ʾÀýʵÏÖ
+
+±¾Àý½²½âÁËÈçºÎÌí¼ÓÉèÖ㬲¢ÇÒ¶Áд¡£±¾ÀïʹÓÃÁËÓû§²¼¾Ö¡£ÕâÊÇÒ»¸ö¸´Ôӵĺ¯Êý£¬ÓкܶàÊÂÇéÒª×ö¡£Êµ¼ÊÉÏ£¬ËüʹÓÃÁ˺ܶàÉÏÊöº¯ÊýÀ´¹¤×÷£¡
+
+
+ÔÚÄãµÄkeymap.cÎļþÖУ¬½«ÒÔÏ´úÂëÌí¼ÓÖÁ¶¥²¿:
+```c
+typedef union {
+ uint32_t raw;
+ struct {
+ bool rgb_layer_change :1;
+ };
+} user_config_t;
+
+user_config_t user_config;
+```
+
+ÒÔÉÏ´úÂ뽨Á¢ÁËÒ»¸ö½á¹¹Ì壬¸Ã½á¹¹Ìå¿ÉÒÔ´æ´¢ÉèÖò¢¿ÉÓÃÓÚдÈëEEPROM¡£Èç´ËÕâ°ã½«ÎÞÐ趨Òå±äÁ¿£¬ÒòΪÔڽṹÌåÖÐÒÑÈ»¶¨Òå¡£Òª¼Çס`bool` (²¼¶û)ֵʹÓÃ1λ, `uint8_t`ʹÓÃ8λ, `uint16_t`ʹÓÃ16λ¡£Äã¿ÉÒÔ»ìºÏ´îÅäʹÓ㬵«ÊÇ˳Ðò¼Ç´í¿ÉÄÜ»áÕÐÖÂÂé·³£¬ÒòΪÄÇ»á¸Ä±äдÈëд³öµÄÖµ¡£
+
+ `layer_state_set_*`º¯ÊýÖÐʹÓÃÁË`rgb_layer_change`£¬Ê¹ÓÃÁË`keyboard_post_init_user`ºÍ`process_record_user`À´ÅäÖÃÒ»ÇС£
+
+Ê×ÏÈҪʹÓÃ`keyboard_post_init_user£¬ÄãÒª¼ÓÈë`eeconfig_read_user()`À´Ìî³äÄã¸Õ¸Õ´´½¨µÄ½á¹¹Ì塣ȻºóÄú¿ÉÒÔÁ¢¼´Ê¹ÓÃÕâ¸ö½á¹¹À´¿ØÖÆÄúµÄ²¼¾ÖÖеŦÄÜ¡£¾ÍÏñÕâÑù£º
+```c
+void keyboard_post_init_user(void) {
+ // µ÷Óò¼¾Ö¼¶±ðµÄ¾ØÕó³õʼ»¯
+
+ // ´ÓEEPROM¶ÁÓû§ÅäÖÃ
+ user_config.raw = eeconfig_read_user();
+
+ // ÈçʹÄÜ£¬ÉèÖÃĬÈϲã
+ if (user_config.rgb_layer_change) {
+ rgblight_enable_noeeprom();
+ rgblight_sethsv_noeeprom_cyan();
+ rgblight_mode_noeeprom(1);
+ }
+}
+```
+ÒÔÉϺ¯Êý»áÔÚ¶ÁEEPROMÅäÖúóÁ¢¼´Ê¹ÓøÃÉèÖÃÀ´ÉèÖÃĬÈϲãRGBÑÕÉ«¡£"raw"µÄÖµÊÇ´ÓÄãÉÏÃæ»ùÓÚ"union"´´½¨µÄ½á¹¹ÌåÖÐת»»À´µÄ¡£
+
+```c
+uint32_t layer_state_set_user(uint32_t state) {
+ switch (biton32(state)) {
+ case _RAISE:
+ if (user_config.rgb_layer_change) { rgblight_sethsv_noeeprom_magenta(); rgblight_mode_noeeprom(1); }
+ break;
+ case _LOWER:
+ if (user_config.rgb_layer_change) { rgblight_sethsv_noeeprom_red(); rgblight_mode_noeeprom(1); }
+ break;
+ case _PLOVER:
+ if (user_config.rgb_layer_change) { rgblight_sethsv_noeeprom_green(); rgblight_mode_noeeprom(1); }
+ break;
+ case _ADJUST:
+ if (user_config.rgb_layer_change) { rgblight_sethsv_noeeprom_white(); rgblight_mode_noeeprom(1); }
+ break;
+ default: // Õë¶ÔÆäËû²ã»òĬÈϲã
+ if (user_config.rgb_layer_change) { rgblight_sethsv_noeeprom_cyan(); rgblight_mode_noeeprom(1); }
+ break;
+ }
+ return state;
+}
+```
+ÕâÑù½öÔÚֵʹÄÜʱ»á¸Ä±äRGB±³¹âµÆ¡£ÏÖÔÚÅäÖÃÕâ¸öÖµ, Ϊ`process_record_user`´´½¨Ò»¸öмüÂë½Ð×ö`RGB_LYR`¡£ÎÒÃÇҪȷ±££¬Èç¹ûʹÓÃÕý³£µÄRGB´úÂ룬ʹÓÃÉÏÃæµÄʾÀý½«Æä¹Ø±Õ£¬Ç뽫ÆäÉèÖÃΪ£º
+```c
+
+bool process_record_user(uint16_t keycode, keyrecord_t *record) {
+ switch (keycode) {
+ case FOO:
+ if (record->event.pressed) {
+ // °´ÏÂʱ×öµãʲô
+ } else {
+ // ÊÍ·Åʱ×öµãʲô
+ }
+ return false; // Ìø¹ý´Ë¼üµÄ½øÒ»²½´¦Àí
+ case KC_ENTER:
+ // ÔÚ°´Ï»سµÊ±²¥·ÅÒô·û
+ if (record->event.pressed) {
+ PLAY_NOTE_ARRAY(tone_qwerty);
+ }
+ return true; // ÈÃQMK²úÉú»Ø³µ°´ÏÂ/ÊÍ·Åʼþ
+ case RGB_LYR: // ±¾¾äÈÃunderglow×÷Ϊ²ãָʾ£¬»òÕý³£Ê¹Óá£
+ if (record->event.pressed) {
+ user_config.rgb_layer_change ^= 1; // Çл»×´Ì¬
+ eeconfig_update_user(user_config.raw); // ÏòEEPROMдÈëÐÂ״̬
+ if (user_config.rgb_layer_change) { // Èç¹û²ã״̬±»Ê¹ÄÜ
+ layer_state_set(layer_state); // ÄÇôÁ¢¿Ì¸üвãÑÕÉ«
+ }
+ }
+ return false; break;
+ case RGB_MODE_FORWARD ... RGB_MODE_GRADIENT: // ¶ÔÓÚËùÓеÄRGB´úÂë (see quantum_keycodes.h, L400 ¿ÉÒԲο¼)
+ if (record->event.pressed) { //±¾¾äʧÄܲãָʾ£¬¼ÙÉèÄã¸Ä±äÁËÕâ¸ö¡ÄãÒª°ÑËü½ûÓÃ
+ if (user_config.rgb_layer_change) { // ½öµ±Ê¹ÄÜʱ
+ user_config.rgb_layer_change = false; // ʧÄÜ£¬È»ºó
+ eeconfig_update_user(user_config.raw); // ÏòEEPROMдÈëÉèÖÃ
+ }
+ }
+ return true; break;
+ default:
+ return true; // °´ÆäËû¼üÕý³£
+ }
+}
+```
+×îºóÄãÒª¼ÓÈë`eeconfig_init_user`º¯Êý£¬ËùÒÔµ±EEPROMÖØÖÃʱ£¬¿ÉÒÔÖ¸¶¨Ä¬ÈÏÖµ, ÉõÖÁ×Ô¶¨Òå²Ù×÷¡£ÏëÇ¿ÖÆÖØÖÃEEPROM£¬ÇëÓÃ`EEP_RST`¼üÂë»ò[Bootmagic](feature_bootmagic.md)º¯Êý¡£±ÈÈ磬Èç¹ûÒªÔÚĬÈÏÇé¿öÏÂÉèÖÃRGB²ãָʾ£¬²¢±£´æĬÈÏÖµ
+
+```c
+void eeconfig_init_user(void) { // EEPROMÕý±»ÖØÖÃ
+ user_config.raw = 0;
+ user_config.rgb_layer_change = true; // ÎÒÃÇÏëҪĬÈÏʹÄÜ
+ eeconfig_update_user(user_config.raw); // ÏòEEPROMдÈëĬÈÏÖµ
+
+ // use the non noeeprom versions, »¹ÒªÏòEEPROMдÈëÕâЩֵ
+ rgblight_enable(); // ĬÈÏʹÄÜRGB
+ rgblight_sethsv_cyan(); // ĬÈÏÉèÖÃÇàÉ«
+ rgblight_mode(1); // ĬÈÏÉèÖó¤ÁÁ
+}
+```
+
+È»ºó¾ÍÍêÊÂÁË¡£RGB²ãָʾ»áÔÚÄãÏëÈÃËü¹¤×÷ʱ¹¤×÷¡£Õâ¸öÉèÖûáÒ»Ö±±£´æ£¬¼´±ãÄã°ÎϼüÅÌ¡£Èç¹ûÄãʹÓÃÆäËûRGB´úÂ룬²ãָʾ½«Ê§ÄÜ£¬ÏÖÔÚËü¿ÉÒÔ×öÄãËùÏëÁË¡£
+
+### 'EECONFIG' º¯ÊýÎĵµ
+
+* ¼üÅÌ/ÐÞ¶©: `void eeconfig_init_kb(void)`, `uint32_t eeconfig_read_kb(void)`ºÍ`void eeconfig_update_kb(uint32_t val)`
+* ²¼¾Ö: `void eeconfig_init_user(void)`, `uint32_t eeconfig_read_user(void)`ºÍ`void eeconfig_update_user(uint32_t val)`
+
+`val` ÊÇÄãÏëдÈëEEPROMµÄÖµ£¬`eeconfig_read_*`º¯Êý»á´ÓEEPROM·µ»ØÒ»¸ö32λ(Ë«×Ö)µÄÖµ¡£
+
+# ×Ô¶¨Òå»÷¼ü-³¤°´ÁÙ½çÖµ(TAPPING_TERM)
+ĬÈÏÇé¿öÏÂ,»÷¼ü-³¤°´ÁÙ½çÖµÊÇÈ«ÇòͳһµÄ£¬²¢ÇÒ²»ÄÜͨ¹ý¼ü½øÐÐÅäÖ᣶ÔÓÚ´ó¶àÊýÓû§À´ËµÕâºÜºÃ¡£µ«ÊÇÔÚÓÐЩÇé¿öÏ£¬¶ÔÓÚ`LT`¼üÀ´Ëµ°´¼üÑÓʱ¶ÔË«¹¦ÄܼüµÄÌáÉý¸ü´ó£¬¿ÉÄÜÊÇÒòΪÓÐЩ¼ü±ÈÆäËûµÄ¼ü¸üÈÝÒ×°´×¡¡£ÎªÁ˲»¸øÿ¸ö¶¼×Ô¶¨Òå¼üÂ룬±¾¹¦ÄÜ¿ÉÒÔΪÿ¸ö¼ü¶¨Òå`TAPPING_TERM`¡£
+
+ÏëʹÄÜÕâ¸ö¹¦ÄܵĻ°, ÒªÏÈÔÚ`config.h`¼ÓÉÏ`#define TAPPING_TERM_PER_KEY`¡£
+
+
+## `get_tapping_term`ʾÀýʵÏÖ
+
+ÏëÒªÐ޸ĻùÓÚ¼üÂëµÄ`TAPPING TERM`,ÄãÒªÏò`keymap.c`ÎļþÌí¼ÓÈçÏ´úÂë:
+
+```c
+uint16_t get_tapping_term(uint16_t keycode) {
+ switch (keycode) {
+ case SFT_T(KC_SPC):
+ return TAPPING_TERM + 1250;
+ case LT(1, KC_GRV):
+ return 130;
+ default:
+ return TAPPING_TERM;
+ }
+}
+```
+
+### `get_tapping_term` º¯ÊýÎĵµ
+
+²»ÏñÕâƪµÄÆäËû¹¦ÄÜ,Õâ¸ö²»ÐèÒªquantum»òÕß¼üÅ̼¶±ðµÄº¯Êý£¬Ö»ÒªÓû§¼¶º¯Êý¼´¿É¡£