3x4 keypad library (Extended not only 3x4 but 4x4,4x5 and 5x5 keys)
Dependents: Keypad_input_OS2 Keypad_input
see /users/kenjiArai/notebook/keypadkey-matrix--control/
Keypad.cpp@5:8929ce2f393c, 2021-02-18 (annotated)
- Committer:
- kenjiArai
- Date:
- Thu Feb 18 08:14:19 2021 +0000
- Revision:
- 5:8929ce2f393c
- Parent:
- 4:f74ca02cdba1
changed attach function call
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
kenjiArai | 0:b7249629f337 | 1 | /* |
kenjiArai | 3:0ea41738b560 | 2 | * Mbed Library |
kenjiArai | 3:0ea41738b560 | 3 | * example: |
kenjiArai | 3:0ea41738b560 | 4 | * Akizuki AE-KIT45-KEYPAD4X3 |
kenjiArai | 3:0ea41738b560 | 5 | * http://akizukidenshi.com/catalog/g/gK-12229/ |
kenjiArai | 0:b7249629f337 | 6 | * |
kenjiArai | 5:8929ce2f393c | 7 | * Copyright (c) 2017,'20,'21 Kenji Arai / JH1PJL |
kenjiArai | 3:0ea41738b560 | 8 | * http://www7b.biglobe.ne.jp/~kenjia/ |
kenjiArai | 3:0ea41738b560 | 9 | * https://os.mbed.com/users/kenjiArai/ |
kenjiArai | 0:b7249629f337 | 10 | * Created: September 27th, 2017 |
kenjiArai | 5:8929ce2f393c | 11 | * Revised: February 18th, 2021 |
kenjiArai | 0:b7249629f337 | 12 | */ |
kenjiArai | 0:b7249629f337 | 13 | |
kenjiArai | 0:b7249629f337 | 14 | #include "Keypad.h" |
kenjiArai | 0:b7249629f337 | 15 | |
kenjiArai | 3:0ea41738b560 | 16 | //#define DEBUG_LED // for debug |
kenjiArai | 3:0ea41738b560 | 17 | |
kenjiArai | 3:0ea41738b560 | 18 | #if defined(DEBUG_LED) |
kenjiArai | 3:0ea41738b560 | 19 | extern DigitalOut my_led; |
kenjiArai | 3:0ea41738b560 | 20 | #define LEDON {my_led=1;} |
kenjiArai | 3:0ea41738b560 | 21 | #define LEDOFF {my_led=0;} |
kenjiArai | 3:0ea41738b560 | 22 | #else |
kenjiArai | 3:0ea41738b560 | 23 | #define LEDON {;} |
kenjiArai | 3:0ea41738b560 | 24 | #define LEDOFF {;} |
kenjiArai | 3:0ea41738b560 | 25 | #endif |
kenjiArai | 0:b7249629f337 | 26 | |
kenjiArai | 0:b7249629f337 | 27 | Keypad::Keypad( |
kenjiArai | 0:b7249629f337 | 28 | PinName kx, PinName ky, PinName kz, |
kenjiArai | 0:b7249629f337 | 29 | PinName ka, PinName kb, PinName kc, PinName kd |
kenjiArai | 0:b7249629f337 | 30 | ) |
kenjiArai | 0:b7249629f337 | 31 | { |
kenjiArai | 3:0ea41738b560 | 32 | k_in[0] = new DigitalIn(ka, PullUp); |
kenjiArai | 3:0ea41738b560 | 33 | k_in[1] = new DigitalIn(kb, PullUp); |
kenjiArai | 3:0ea41738b560 | 34 | k_in[2] = new DigitalIn(kc, PullUp); |
kenjiArai | 3:0ea41738b560 | 35 | k_in[3] = new DigitalIn(kd, PullUp); |
kenjiArai | 4:f74ca02cdba1 | 36 | k_out[0] = new DigitalInOut(kx, PIN_OUTPUT, OpenDrain, 1); |
kenjiArai | 4:f74ca02cdba1 | 37 | k_out[1] = new DigitalInOut(ky, PIN_OUTPUT, OpenDrain, 1); |
kenjiArai | 4:f74ca02cdba1 | 38 | k_out[2] = new DigitalInOut(kz, PIN_OUTPUT, OpenDrain, 1); |
kenjiArai | 3:0ea41738b560 | 39 | key_mode = 12; |
kenjiArai | 3:0ea41738b560 | 40 | key_in_num = 4; |
kenjiArai | 3:0ea41738b560 | 41 | key_out_num = 3; |
kenjiArai | 3:0ea41738b560 | 42 | initialize(); |
kenjiArai | 3:0ea41738b560 | 43 | } |
kenjiArai | 3:0ea41738b560 | 44 | |
kenjiArai | 3:0ea41738b560 | 45 | Keypad::Keypad( |
kenjiArai | 3:0ea41738b560 | 46 | PinName kx, PinName ky, PinName kz, PinName kw, |
kenjiArai | 3:0ea41738b560 | 47 | PinName ka, PinName kb, PinName kc, PinName kd |
kenjiArai | 3:0ea41738b560 | 48 | ) |
kenjiArai | 3:0ea41738b560 | 49 | { |
kenjiArai | 3:0ea41738b560 | 50 | k_in[0] = new DigitalIn(ka, PullUp); |
kenjiArai | 3:0ea41738b560 | 51 | k_in[1] = new DigitalIn(kb, PullUp); |
kenjiArai | 3:0ea41738b560 | 52 | k_in[2] = new DigitalIn(kc, PullUp); |
kenjiArai | 3:0ea41738b560 | 53 | k_in[3] = new DigitalIn(kd, PullUp); |
kenjiArai | 4:f74ca02cdba1 | 54 | k_out[0] = new DigitalInOut(kx, PIN_OUTPUT, OpenDrain, 1); |
kenjiArai | 4:f74ca02cdba1 | 55 | k_out[1] = new DigitalInOut(ky, PIN_OUTPUT, OpenDrain, 1); |
kenjiArai | 4:f74ca02cdba1 | 56 | k_out[2] = new DigitalInOut(kz, PIN_OUTPUT, OpenDrain, 1); |
kenjiArai | 4:f74ca02cdba1 | 57 | k_out[3] = new DigitalInOut(kw, PIN_OUTPUT, OpenDrain, 1); |
kenjiArai | 3:0ea41738b560 | 58 | key_mode = 16; |
kenjiArai | 3:0ea41738b560 | 59 | key_in_num = 4; |
kenjiArai | 3:0ea41738b560 | 60 | key_out_num = 4; |
kenjiArai | 3:0ea41738b560 | 61 | initialize(); |
kenjiArai | 3:0ea41738b560 | 62 | } |
kenjiArai | 3:0ea41738b560 | 63 | |
kenjiArai | 3:0ea41738b560 | 64 | Keypad::Keypad( |
kenjiArai | 3:0ea41738b560 | 65 | PinName kx, PinName ky, PinName kz, PinName kw, |
kenjiArai | 3:0ea41738b560 | 66 | PinName ka, PinName kb, PinName kc, PinName kd, PinName ke |
kenjiArai | 3:0ea41738b560 | 67 | ) |
kenjiArai | 3:0ea41738b560 | 68 | { |
kenjiArai | 3:0ea41738b560 | 69 | k_in[0] = new DigitalIn(ka, PullUp); |
kenjiArai | 3:0ea41738b560 | 70 | k_in[1] = new DigitalIn(kb, PullUp); |
kenjiArai | 3:0ea41738b560 | 71 | k_in[2] = new DigitalIn(kc, PullUp); |
kenjiArai | 3:0ea41738b560 | 72 | k_in[3] = new DigitalIn(kd, PullUp); |
kenjiArai | 3:0ea41738b560 | 73 | k_in[4] = new DigitalIn(ke, PullUp); |
kenjiArai | 4:f74ca02cdba1 | 74 | k_out[0] = new DigitalInOut(kx, PIN_OUTPUT, OpenDrain, 1); |
kenjiArai | 4:f74ca02cdba1 | 75 | k_out[1] = new DigitalInOut(ky, PIN_OUTPUT, OpenDrain, 1); |
kenjiArai | 4:f74ca02cdba1 | 76 | k_out[2] = new DigitalInOut(kz, PIN_OUTPUT, OpenDrain, 1); |
kenjiArai | 4:f74ca02cdba1 | 77 | k_out[3] = new DigitalInOut(kw, PIN_OUTPUT, OpenDrain, 1); |
kenjiArai | 3:0ea41738b560 | 78 | key_mode = 20; |
kenjiArai | 3:0ea41738b560 | 79 | key_in_num = 5; |
kenjiArai | 3:0ea41738b560 | 80 | key_out_num = 4; |
kenjiArai | 3:0ea41738b560 | 81 | initialize(); |
kenjiArai | 3:0ea41738b560 | 82 | } |
kenjiArai | 3:0ea41738b560 | 83 | |
kenjiArai | 3:0ea41738b560 | 84 | Keypad::Keypad( |
kenjiArai | 3:0ea41738b560 | 85 | PinName kx, PinName ky, PinName kz, PinName kw, PinName kv, |
kenjiArai | 3:0ea41738b560 | 86 | PinName ka, PinName kb, PinName kc, PinName kd, PinName ke |
kenjiArai | 3:0ea41738b560 | 87 | ) |
kenjiArai | 3:0ea41738b560 | 88 | { |
kenjiArai | 3:0ea41738b560 | 89 | k_in[0] = new DigitalIn(ka, PullUp); |
kenjiArai | 3:0ea41738b560 | 90 | k_in[1] = new DigitalIn(kb, PullUp); |
kenjiArai | 3:0ea41738b560 | 91 | k_in[2] = new DigitalIn(kc, PullUp); |
kenjiArai | 3:0ea41738b560 | 92 | k_in[3] = new DigitalIn(kd, PullUp); |
kenjiArai | 3:0ea41738b560 | 93 | k_in[4] = new DigitalIn(ke, PullUp); |
kenjiArai | 4:f74ca02cdba1 | 94 | k_out[0] = new DigitalInOut(kx, PIN_OUTPUT, OpenDrain, 1); |
kenjiArai | 4:f74ca02cdba1 | 95 | k_out[1] = new DigitalInOut(ky, PIN_OUTPUT, OpenDrain, 1); |
kenjiArai | 4:f74ca02cdba1 | 96 | k_out[2] = new DigitalInOut(kz, PIN_OUTPUT, OpenDrain, 1); |
kenjiArai | 4:f74ca02cdba1 | 97 | k_out[3] = new DigitalInOut(kw, PIN_OUTPUT, OpenDrain, 1); |
kenjiArai | 4:f74ca02cdba1 | 98 | k_out[4] = new DigitalInOut(kv, PIN_OUTPUT, OpenDrain, 1); |
kenjiArai | 3:0ea41738b560 | 99 | key_mode = 25; |
kenjiArai | 3:0ea41738b560 | 100 | key_in_num = 5; |
kenjiArai | 3:0ea41738b560 | 101 | key_out_num = 5; |
kenjiArai | 3:0ea41738b560 | 102 | initialize(); |
kenjiArai | 3:0ea41738b560 | 103 | } |
kenjiArai | 3:0ea41738b560 | 104 | |
kenjiArai | 3:0ea41738b560 | 105 | void Keypad::initialize(void) |
kenjiArai | 3:0ea41738b560 | 106 | { |
kenjiArai | 0:b7249629f337 | 107 | uint8_t j,i; |
kenjiArai | 3:0ea41738b560 | 108 | for (j = 0; j < key_out_num; j++) { |
kenjiArai | 3:0ea41738b560 | 109 | for(i = 0; i < key_in_num; i++) { |
kenjiArai | 0:b7249629f337 | 110 | key_transent_cntr[j][i] = CHNG_CNT; |
kenjiArai | 3:0ea41738b560 | 111 | key_state[j][i] = OFF_state; |
kenjiArai | 0:b7249629f337 | 112 | } |
kenjiArai | 0:b7249629f337 | 113 | } |
kenjiArai | 3:0ea41738b560 | 114 | for(i = 0; i < BF_SIZE; i++) { |
kenjiArai | 0:b7249629f337 | 115 | buf[i] = 0; |
kenjiArai | 0:b7249629f337 | 116 | } |
kenjiArai | 0:b7249629f337 | 117 | read_addr = 0; |
kenjiArai | 0:b7249629f337 | 118 | write_addr = 0; |
kenjiArai | 5:8929ce2f393c | 119 | #if (MBED_MAJOR_VERSION == 2) |
kenjiArai | 3:0ea41738b560 | 120 | tk.attach_us(callback(this, &Keypad::key_scan), 2000); // 2mS |
kenjiArai | 5:8929ce2f393c | 121 | #else |
kenjiArai | 5:8929ce2f393c | 122 | tk.attach(callback(this, &Keypad::key_scan), 2ms); // 2mS |
kenjiArai | 5:8929ce2f393c | 123 | #endif |
kenjiArai | 0:b7249629f337 | 124 | } |
kenjiArai | 0:b7249629f337 | 125 | |
kenjiArai | 0:b7249629f337 | 126 | void Keypad::key_scan(void) |
kenjiArai | 0:b7249629f337 | 127 | { |
kenjiArai | 3:0ea41738b560 | 128 | LEDON; |
kenjiArai | 3:0ea41738b560 | 129 | for (int32_t j = 0; j < key_out_num; j++) { |
kenjiArai | 3:0ea41738b560 | 130 | for (int32_t k = 0; k < key_out_num; k++) { |
kenjiArai | 3:0ea41738b560 | 131 | *k_out[k] = 1; |
kenjiArai | 3:0ea41738b560 | 132 | } |
kenjiArai | 0:b7249629f337 | 133 | *k_out[j] = 0; |
kenjiArai | 0:b7249629f337 | 134 | wait_us(1); |
kenjiArai | 3:0ea41738b560 | 135 | for (int32_t i = 0; i < key_in_num; i++) { |
kenjiArai | 3:0ea41738b560 | 136 | switch (key_state[j][i]) { |
kenjiArai | 3:0ea41738b560 | 137 | case OFF_state: |
kenjiArai | 3:0ea41738b560 | 138 | if (*k_in[i] == 0) { // key on |
kenjiArai | 3:0ea41738b560 | 139 | key_state[j][i] = OFF_to_ON_transient; |
kenjiArai | 0:b7249629f337 | 140 | key_transent_cntr[j][i] = CHNG_CNT; |
kenjiArai | 0:b7249629f337 | 141 | } |
kenjiArai | 0:b7249629f337 | 142 | break; |
kenjiArai | 3:0ea41738b560 | 143 | case OFF_to_ON_transient: |
kenjiArai | 3:0ea41738b560 | 144 | if (*k_in[i] == 0) { // key on |
kenjiArai | 3:0ea41738b560 | 145 | if (--key_transent_cntr[j][i] < -CHNG_CNT) { |
kenjiArai | 3:0ea41738b560 | 146 | // save data into buffer |
kenjiArai | 3:0ea41738b560 | 147 | bf_put(j * key_in_num + i + 1); |
kenjiArai | 3:0ea41738b560 | 148 | key_state[j][i] = ON_state; |
kenjiArai | 0:b7249629f337 | 149 | } |
kenjiArai | 0:b7249629f337 | 150 | } else { // key off |
kenjiArai | 3:0ea41738b560 | 151 | if (++key_transent_cntr[j][i] > CHNG_CNT) { |
kenjiArai | 3:0ea41738b560 | 152 | key_state[j][i] = OFF_state; |
kenjiArai | 0:b7249629f337 | 153 | } |
kenjiArai | 0:b7249629f337 | 154 | } |
kenjiArai | 0:b7249629f337 | 155 | break; |
kenjiArai | 3:0ea41738b560 | 156 | case ON_state: |
kenjiArai | 3:0ea41738b560 | 157 | if (*k_in[i] == 1) { // key off |
kenjiArai | 3:0ea41738b560 | 158 | key_state[j][i] = ON_to_OFF_transient; |
kenjiArai | 0:b7249629f337 | 159 | key_transent_cntr[j][i] = -CHNG_CNT; |
kenjiArai | 0:b7249629f337 | 160 | } |
kenjiArai | 0:b7249629f337 | 161 | break; |
kenjiArai | 3:0ea41738b560 | 162 | case ON_to_OFF_transient: |
kenjiArai | 3:0ea41738b560 | 163 | if (*k_in[i] == 0) { // key on |
kenjiArai | 3:0ea41738b560 | 164 | if (--key_transent_cntr[j][i] < -CHNG_CNT) { |
kenjiArai | 3:0ea41738b560 | 165 | key_state[j][i] = ON_state; |
kenjiArai | 0:b7249629f337 | 166 | } |
kenjiArai | 0:b7249629f337 | 167 | } else { // key off |
kenjiArai | 3:0ea41738b560 | 168 | if (++key_transent_cntr[j][i] > CHNG_CNT) { |
kenjiArai | 3:0ea41738b560 | 169 | key_state[j][i] = OFF_state; |
kenjiArai | 0:b7249629f337 | 170 | } |
kenjiArai | 0:b7249629f337 | 171 | } |
kenjiArai | 0:b7249629f337 | 172 | break; |
kenjiArai | 0:b7249629f337 | 173 | default: // just in case |
kenjiArai | 3:0ea41738b560 | 174 | key_state[j][i] = OFF_state; |
kenjiArai | 0:b7249629f337 | 175 | break; |
kenjiArai | 0:b7249629f337 | 176 | } |
kenjiArai | 0:b7249629f337 | 177 | } |
kenjiArai | 0:b7249629f337 | 178 | } |
kenjiArai | 3:0ea41738b560 | 179 | for (int32_t k = 0; k < key_out_num; k++) { |
kenjiArai | 3:0ea41738b560 | 180 | *k_out[k] = 1; |
kenjiArai | 3:0ea41738b560 | 181 | } |
kenjiArai | 3:0ea41738b560 | 182 | LEDOFF; |
kenjiArai | 0:b7249629f337 | 183 | } |
kenjiArai | 0:b7249629f337 | 184 | |
kenjiArai | 0:b7249629f337 | 185 | uint8_t Keypad::read(void) |
kenjiArai | 0:b7249629f337 | 186 | { |
kenjiArai | 0:b7249629f337 | 187 | return bf_get(); |
kenjiArai | 0:b7249629f337 | 188 | } |
kenjiArai | 0:b7249629f337 | 189 | |
kenjiArai | 3:0ea41738b560 | 190 | bool Keypad::read_state(uint8_t key_num) |
kenjiArai | 3:0ea41738b560 | 191 | { |
kenjiArai | 3:0ea41738b560 | 192 | |
kenjiArai | 3:0ea41738b560 | 193 | uint8_t x = (key_num - 1) % key_out_num; |
kenjiArai | 3:0ea41738b560 | 194 | uint8_t y = (key_num - 1)/ key_out_num; |
kenjiArai | 3:0ea41738b560 | 195 | if (key_state[y][x] == ON_state) { |
kenjiArai | 3:0ea41738b560 | 196 | return true; |
kenjiArai | 3:0ea41738b560 | 197 | } else { |
kenjiArai | 3:0ea41738b560 | 198 | return false; |
kenjiArai | 3:0ea41738b560 | 199 | } |
kenjiArai | 3:0ea41738b560 | 200 | } |
kenjiArai | 3:0ea41738b560 | 201 | |
kenjiArai | 0:b7249629f337 | 202 | void Keypad::bf_put(char dt) |
kenjiArai | 0:b7249629f337 | 203 | { |
kenjiArai | 0:b7249629f337 | 204 | uint8_t next = write_addr + 1; |
kenjiArai | 0:b7249629f337 | 205 | if (next == BF_SIZE) { |
kenjiArai | 0:b7249629f337 | 206 | next = 0; |
kenjiArai | 0:b7249629f337 | 207 | } |
kenjiArai | 0:b7249629f337 | 208 | buf[write_addr] = dt; |
kenjiArai | 0:b7249629f337 | 209 | write_addr = next; |
kenjiArai | 0:b7249629f337 | 210 | } |
kenjiArai | 0:b7249629f337 | 211 | |
kenjiArai | 3:0ea41738b560 | 212 | int8_t Keypad::bf_get (void) |
kenjiArai | 3:0ea41738b560 | 213 | { |
kenjiArai | 3:0ea41738b560 | 214 | if (read_addr == write_addr) { |
kenjiArai | 0:b7249629f337 | 215 | return 0; |
kenjiArai | 0:b7249629f337 | 216 | } |
kenjiArai | 0:b7249629f337 | 217 | uint8_t dt = buf[read_addr]; |
kenjiArai | 0:b7249629f337 | 218 | ++read_addr; |
kenjiArai | 3:0ea41738b560 | 219 | if (read_addr == BF_SIZE) { |
kenjiArai | 0:b7249629f337 | 220 | read_addr = 0; |
kenjiArai | 0:b7249629f337 | 221 | } |
kenjiArai | 0:b7249629f337 | 222 | return dt; |
kenjiArai | 0:b7249629f337 | 223 | } |