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@3:0ea41738b560, 2020-04-06 (annotated)
- Committer:
- kenjiArai
- Date:
- Mon Apr 06 04:53:25 2020 +0000
- Revision:
- 3:0ea41738b560
- Parent:
- 2:a3545b56bdd7
- Child:
- 4:f74ca02cdba1
Extended not only 3x4 but 4x4,4x5 and 5x5 keys
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 | 3:0ea41738b560 | 7 | * Copyright (c) 2017,'20 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 | 3:0ea41738b560 | 11 | * Revised: April 6th, 2020 |
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 | 3:0ea41738b560 | 36 | k_out[0] = new DigitalOut(kx); |
kenjiArai | 3:0ea41738b560 | 37 | k_out[1] = new DigitalOut(ky); |
kenjiArai | 3:0ea41738b560 | 38 | k_out[2] = new DigitalOut(kz); |
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 | 3:0ea41738b560 | 54 | k_out[0] = new DigitalOut(kx); |
kenjiArai | 3:0ea41738b560 | 55 | k_out[1] = new DigitalOut(ky); |
kenjiArai | 3:0ea41738b560 | 56 | k_out[2] = new DigitalOut(kz); |
kenjiArai | 3:0ea41738b560 | 57 | k_out[3] = new DigitalOut(kw); |
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 | 3:0ea41738b560 | 74 | k_out[0] = new DigitalOut(kx); |
kenjiArai | 3:0ea41738b560 | 75 | k_out[1] = new DigitalOut(ky); |
kenjiArai | 3:0ea41738b560 | 76 | k_out[2] = new DigitalOut(kz); |
kenjiArai | 3:0ea41738b560 | 77 | k_out[3] = new DigitalOut(kw); |
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 | 3:0ea41738b560 | 94 | k_out[0] = new DigitalOut(kx); |
kenjiArai | 3:0ea41738b560 | 95 | k_out[1] = new DigitalOut(ky); |
kenjiArai | 3:0ea41738b560 | 96 | k_out[2] = new DigitalOut(kz); |
kenjiArai | 3:0ea41738b560 | 97 | k_out[3] = new DigitalOut(kw); |
kenjiArai | 3:0ea41738b560 | 98 | k_out[4] = new DigitalOut(kv); |
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 | *k_out[0] = 1; |
kenjiArai | 0:b7249629f337 | 108 | *k_out[1] = 1; |
kenjiArai | 0:b7249629f337 | 109 | *k_out[2] = 1; |
kenjiArai | 3:0ea41738b560 | 110 | if (key_mode > 12) { |
kenjiArai | 3:0ea41738b560 | 111 | *k_out[3] = 1; |
kenjiArai | 3:0ea41738b560 | 112 | } |
kenjiArai | 3:0ea41738b560 | 113 | if (key_mode > 20) { |
kenjiArai | 3:0ea41738b560 | 114 | *k_out[4] = 1; |
kenjiArai | 3:0ea41738b560 | 115 | } |
kenjiArai | 0:b7249629f337 | 116 | uint8_t j,i; |
kenjiArai | 3:0ea41738b560 | 117 | for (j = 0; j < key_out_num; j++) { |
kenjiArai | 3:0ea41738b560 | 118 | for(i = 0; i < key_in_num; i++) { |
kenjiArai | 0:b7249629f337 | 119 | key_transent_cntr[j][i] = CHNG_CNT; |
kenjiArai | 3:0ea41738b560 | 120 | key_state[j][i] = OFF_state; |
kenjiArai | 0:b7249629f337 | 121 | } |
kenjiArai | 0:b7249629f337 | 122 | } |
kenjiArai | 3:0ea41738b560 | 123 | for(i = 0; i < BF_SIZE; i++) { |
kenjiArai | 0:b7249629f337 | 124 | buf[i] = 0; |
kenjiArai | 0:b7249629f337 | 125 | } |
kenjiArai | 0:b7249629f337 | 126 | read_addr = 0; |
kenjiArai | 0:b7249629f337 | 127 | write_addr = 0; |
kenjiArai | 3:0ea41738b560 | 128 | tk.attach_us(callback(this, &Keypad::key_scan), 2000); // 2mS |
kenjiArai | 0:b7249629f337 | 129 | } |
kenjiArai | 0:b7249629f337 | 130 | |
kenjiArai | 0:b7249629f337 | 131 | void Keypad::key_scan(void) |
kenjiArai | 0:b7249629f337 | 132 | { |
kenjiArai | 3:0ea41738b560 | 133 | LEDON; |
kenjiArai | 3:0ea41738b560 | 134 | for (int32_t j = 0; j < key_out_num; j++) { |
kenjiArai | 3:0ea41738b560 | 135 | for (int32_t k = 0; k < key_out_num; k++) { |
kenjiArai | 3:0ea41738b560 | 136 | *k_out[k] = 1; |
kenjiArai | 3:0ea41738b560 | 137 | } |
kenjiArai | 0:b7249629f337 | 138 | *k_out[j] = 0; |
kenjiArai | 0:b7249629f337 | 139 | wait_us(1); |
kenjiArai | 3:0ea41738b560 | 140 | for (int32_t i = 0; i < key_in_num; i++) { |
kenjiArai | 3:0ea41738b560 | 141 | switch (key_state[j][i]) { |
kenjiArai | 3:0ea41738b560 | 142 | case OFF_state: |
kenjiArai | 3:0ea41738b560 | 143 | if (*k_in[i] == 0) { // key on |
kenjiArai | 3:0ea41738b560 | 144 | key_state[j][i] = OFF_to_ON_transient; |
kenjiArai | 0:b7249629f337 | 145 | key_transent_cntr[j][i] = CHNG_CNT; |
kenjiArai | 0:b7249629f337 | 146 | } |
kenjiArai | 0:b7249629f337 | 147 | break; |
kenjiArai | 3:0ea41738b560 | 148 | case OFF_to_ON_transient: |
kenjiArai | 3:0ea41738b560 | 149 | if (*k_in[i] == 0) { // key on |
kenjiArai | 3:0ea41738b560 | 150 | if (--key_transent_cntr[j][i] < -CHNG_CNT) { |
kenjiArai | 3:0ea41738b560 | 151 | // save data into buffer |
kenjiArai | 3:0ea41738b560 | 152 | bf_put(j * key_in_num + i + 1); |
kenjiArai | 3:0ea41738b560 | 153 | key_state[j][i] = ON_state; |
kenjiArai | 0:b7249629f337 | 154 | } |
kenjiArai | 0:b7249629f337 | 155 | } else { // key off |
kenjiArai | 3:0ea41738b560 | 156 | if (++key_transent_cntr[j][i] > CHNG_CNT) { |
kenjiArai | 3:0ea41738b560 | 157 | key_state[j][i] = OFF_state; |
kenjiArai | 0:b7249629f337 | 158 | } |
kenjiArai | 0:b7249629f337 | 159 | } |
kenjiArai | 0:b7249629f337 | 160 | break; |
kenjiArai | 3:0ea41738b560 | 161 | case ON_state: |
kenjiArai | 3:0ea41738b560 | 162 | if (*k_in[i] == 1) { // key off |
kenjiArai | 3:0ea41738b560 | 163 | key_state[j][i] = ON_to_OFF_transient; |
kenjiArai | 0:b7249629f337 | 164 | key_transent_cntr[j][i] = -CHNG_CNT; |
kenjiArai | 0:b7249629f337 | 165 | } |
kenjiArai | 0:b7249629f337 | 166 | break; |
kenjiArai | 3:0ea41738b560 | 167 | case ON_to_OFF_transient: |
kenjiArai | 3:0ea41738b560 | 168 | if (*k_in[i] == 0) { // key on |
kenjiArai | 3:0ea41738b560 | 169 | if (--key_transent_cntr[j][i] < -CHNG_CNT) { |
kenjiArai | 3:0ea41738b560 | 170 | key_state[j][i] = ON_state; |
kenjiArai | 0:b7249629f337 | 171 | } |
kenjiArai | 0:b7249629f337 | 172 | } else { // key off |
kenjiArai | 3:0ea41738b560 | 173 | if (++key_transent_cntr[j][i] > CHNG_CNT) { |
kenjiArai | 3:0ea41738b560 | 174 | key_state[j][i] = OFF_state; |
kenjiArai | 0:b7249629f337 | 175 | } |
kenjiArai | 0:b7249629f337 | 176 | } |
kenjiArai | 0:b7249629f337 | 177 | break; |
kenjiArai | 0:b7249629f337 | 178 | default: // just in case |
kenjiArai | 3:0ea41738b560 | 179 | key_state[j][i] = OFF_state; |
kenjiArai | 0:b7249629f337 | 180 | break; |
kenjiArai | 0:b7249629f337 | 181 | } |
kenjiArai | 0:b7249629f337 | 182 | } |
kenjiArai | 0:b7249629f337 | 183 | } |
kenjiArai | 3:0ea41738b560 | 184 | for (int32_t k = 0; k < key_out_num; k++) { |
kenjiArai | 3:0ea41738b560 | 185 | *k_out[k] = 1; |
kenjiArai | 3:0ea41738b560 | 186 | } |
kenjiArai | 3:0ea41738b560 | 187 | LEDOFF; |
kenjiArai | 0:b7249629f337 | 188 | } |
kenjiArai | 0:b7249629f337 | 189 | |
kenjiArai | 0:b7249629f337 | 190 | uint8_t Keypad::read(void) |
kenjiArai | 0:b7249629f337 | 191 | { |
kenjiArai | 0:b7249629f337 | 192 | return bf_get(); |
kenjiArai | 0:b7249629f337 | 193 | } |
kenjiArai | 0:b7249629f337 | 194 | |
kenjiArai | 3:0ea41738b560 | 195 | bool Keypad::read_state(uint8_t key_num) |
kenjiArai | 3:0ea41738b560 | 196 | { |
kenjiArai | 3:0ea41738b560 | 197 | |
kenjiArai | 3:0ea41738b560 | 198 | uint8_t x = (key_num - 1) % key_out_num; |
kenjiArai | 3:0ea41738b560 | 199 | uint8_t y = (key_num - 1)/ key_out_num; |
kenjiArai | 3:0ea41738b560 | 200 | if (key_state[y][x] == ON_state) { |
kenjiArai | 3:0ea41738b560 | 201 | return true; |
kenjiArai | 3:0ea41738b560 | 202 | } else { |
kenjiArai | 3:0ea41738b560 | 203 | return false; |
kenjiArai | 3:0ea41738b560 | 204 | } |
kenjiArai | 3:0ea41738b560 | 205 | } |
kenjiArai | 3:0ea41738b560 | 206 | |
kenjiArai | 0:b7249629f337 | 207 | void Keypad::bf_put(char dt) |
kenjiArai | 0:b7249629f337 | 208 | { |
kenjiArai | 0:b7249629f337 | 209 | uint8_t next = write_addr + 1; |
kenjiArai | 0:b7249629f337 | 210 | if (next == BF_SIZE) { |
kenjiArai | 0:b7249629f337 | 211 | next = 0; |
kenjiArai | 0:b7249629f337 | 212 | } |
kenjiArai | 0:b7249629f337 | 213 | buf[write_addr] = dt; |
kenjiArai | 0:b7249629f337 | 214 | write_addr = next; |
kenjiArai | 0:b7249629f337 | 215 | } |
kenjiArai | 0:b7249629f337 | 216 | |
kenjiArai | 3:0ea41738b560 | 217 | int8_t Keypad::bf_get (void) |
kenjiArai | 3:0ea41738b560 | 218 | { |
kenjiArai | 3:0ea41738b560 | 219 | if (read_addr == write_addr) { |
kenjiArai | 0:b7249629f337 | 220 | return 0; |
kenjiArai | 0:b7249629f337 | 221 | } |
kenjiArai | 0:b7249629f337 | 222 | uint8_t dt = buf[read_addr]; |
kenjiArai | 0:b7249629f337 | 223 | ++read_addr; |
kenjiArai | 3:0ea41738b560 | 224 | if (read_addr == BF_SIZE) { |
kenjiArai | 0:b7249629f337 | 225 | read_addr = 0; |
kenjiArai | 0:b7249629f337 | 226 | } |
kenjiArai | 0:b7249629f337 | 227 | return dt; |
kenjiArai | 0:b7249629f337 | 228 | } |