2020 February 29 Breaking Changes Update (#8064)
[jackhill/qmk/firmware.git] / docs / feature_encoders.md
1 # Encoders
2
3 Basic encoders are supported by adding this to your `rules.mk`:
4
5 ```make
6 ENCODER_ENABLE = yes
7 ```
8
9 and this to your `config.h`:
10
11 ```c
12 #define ENCODERS_PAD_A { B12 }
13 #define ENCODERS_PAD_B { B13 }
14 ```
15
16 Each PAD_A/B variable defines an array so multiple encoders can be defined, e.g.:
17
18 ```c
19 #define ENCODERS_PAD_A { encoder1a, encoder2a }
20 #define ENCODERS_PAD_B { encoder1b, encoder2b }
21 ```
22
23 If your encoder's clockwise directions are incorrect, you can swap the A & B pad definitions. They can also be flipped with a define:
24
25 ```c
26 #define ENCODER_DIRECTION_FLIP
27 ```
28
29 Additionally, the resolution can be specified in the same file (the default & suggested is 4):
30
31 ```c
32 #define ENCODER_RESOLUTION 4
33 ```
34
35 ## Split Keyboards
36
37 If you are using different pinouts for the encoders on each half of a split keyboard, you can define the pinout for the right half like this:
38
39 ```c
40 #define ENCODERS_PAD_A_RIGHT { encoder1a, encoder2a }
41 #define ENCODERS_PAD_B_RIGHT { encoder1b, encoder2b }
42 ```
43
44 ## Callbacks
45
46 The callback functions can be inserted into your `<keyboard>.c`:
47
48 ```c
49 void encoder_update_kb(uint8_t index, bool clockwise) {
50 encoder_update_user(index, clockwise);
51 }
52 ```
53
54 or `keymap.c`:
55
56 ```c
57 void encoder_update_user(uint8_t index, bool clockwise) {
58 if (index == 0) { /* First encoder */
59 if (clockwise) {
60 tap_code(KC_PGDN);
61 } else {
62 tap_code(KC_PGUP);
63 }
64 } else if (index == 1) { /* Second encoder */
65 if (clockwise) {
66 tap_code(KC_DOWN);
67 } else {
68 tap_code(KC_UP);
69 }
70 }
71 }
72 ```
73
74 ## Hardware
75
76 The A an B lines of the encoders should be wired directly to the MCU, and the C/common lines should be wired to ground.