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/

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?

UserRevisionLine numberNew 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 }