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:
Mon Apr 13 02:04:25 2020 +0000
Revision:
4:f74ca02cdba1
Parent:
3:0ea41738b560
Child:
5:8929ce2f393c
modified DigitalOut to DigitalInOut

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 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 4:f74ca02cdba1 11 * Revised: April 13th, 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 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 3:0ea41738b560 119 tk.attach_us(callback(this, &Keypad::key_scan), 2000); // 2mS
kenjiArai 0:b7249629f337 120 }
kenjiArai 0:b7249629f337 121
kenjiArai 0:b7249629f337 122 void Keypad::key_scan(void)
kenjiArai 0:b7249629f337 123 {
kenjiArai 3:0ea41738b560 124 LEDON;
kenjiArai 3:0ea41738b560 125 for (int32_t j = 0; j < key_out_num; j++) {
kenjiArai 3:0ea41738b560 126 for (int32_t k = 0; k < key_out_num; k++) {
kenjiArai 3:0ea41738b560 127 *k_out[k] = 1;
kenjiArai 3:0ea41738b560 128 }
kenjiArai 0:b7249629f337 129 *k_out[j] = 0;
kenjiArai 0:b7249629f337 130 wait_us(1);
kenjiArai 3:0ea41738b560 131 for (int32_t i = 0; i < key_in_num; i++) {
kenjiArai 3:0ea41738b560 132 switch (key_state[j][i]) {
kenjiArai 3:0ea41738b560 133 case OFF_state:
kenjiArai 3:0ea41738b560 134 if (*k_in[i] == 0) { // key on
kenjiArai 3:0ea41738b560 135 key_state[j][i] = OFF_to_ON_transient;
kenjiArai 0:b7249629f337 136 key_transent_cntr[j][i] = CHNG_CNT;
kenjiArai 0:b7249629f337 137 }
kenjiArai 0:b7249629f337 138 break;
kenjiArai 3:0ea41738b560 139 case OFF_to_ON_transient:
kenjiArai 3:0ea41738b560 140 if (*k_in[i] == 0) { // key on
kenjiArai 3:0ea41738b560 141 if (--key_transent_cntr[j][i] < -CHNG_CNT) {
kenjiArai 3:0ea41738b560 142 // save data into buffer
kenjiArai 3:0ea41738b560 143 bf_put(j * key_in_num + i + 1);
kenjiArai 3:0ea41738b560 144 key_state[j][i] = ON_state;
kenjiArai 0:b7249629f337 145 }
kenjiArai 0:b7249629f337 146 } else { // key off
kenjiArai 3:0ea41738b560 147 if (++key_transent_cntr[j][i] > CHNG_CNT) {
kenjiArai 3:0ea41738b560 148 key_state[j][i] = OFF_state;
kenjiArai 0:b7249629f337 149 }
kenjiArai 0:b7249629f337 150 }
kenjiArai 0:b7249629f337 151 break;
kenjiArai 3:0ea41738b560 152 case ON_state:
kenjiArai 3:0ea41738b560 153 if (*k_in[i] == 1) { // key off
kenjiArai 3:0ea41738b560 154 key_state[j][i] = ON_to_OFF_transient;
kenjiArai 0:b7249629f337 155 key_transent_cntr[j][i] = -CHNG_CNT;
kenjiArai 0:b7249629f337 156 }
kenjiArai 0:b7249629f337 157 break;
kenjiArai 3:0ea41738b560 158 case ON_to_OFF_transient:
kenjiArai 3:0ea41738b560 159 if (*k_in[i] == 0) { // key on
kenjiArai 3:0ea41738b560 160 if (--key_transent_cntr[j][i] < -CHNG_CNT) {
kenjiArai 3:0ea41738b560 161 key_state[j][i] = ON_state;
kenjiArai 0:b7249629f337 162 }
kenjiArai 0:b7249629f337 163 } else { // key off
kenjiArai 3:0ea41738b560 164 if (++key_transent_cntr[j][i] > CHNG_CNT) {
kenjiArai 3:0ea41738b560 165 key_state[j][i] = OFF_state;
kenjiArai 0:b7249629f337 166 }
kenjiArai 0:b7249629f337 167 }
kenjiArai 0:b7249629f337 168 break;
kenjiArai 0:b7249629f337 169 default: // just in case
kenjiArai 3:0ea41738b560 170 key_state[j][i] = OFF_state;
kenjiArai 0:b7249629f337 171 break;
kenjiArai 0:b7249629f337 172 }
kenjiArai 0:b7249629f337 173 }
kenjiArai 0:b7249629f337 174 }
kenjiArai 3:0ea41738b560 175 for (int32_t k = 0; k < key_out_num; k++) {
kenjiArai 3:0ea41738b560 176 *k_out[k] = 1;
kenjiArai 3:0ea41738b560 177 }
kenjiArai 3:0ea41738b560 178 LEDOFF;
kenjiArai 0:b7249629f337 179 }
kenjiArai 0:b7249629f337 180
kenjiArai 0:b7249629f337 181 uint8_t Keypad::read(void)
kenjiArai 0:b7249629f337 182 {
kenjiArai 0:b7249629f337 183 return bf_get();
kenjiArai 0:b7249629f337 184 }
kenjiArai 0:b7249629f337 185
kenjiArai 3:0ea41738b560 186 bool Keypad::read_state(uint8_t key_num)
kenjiArai 3:0ea41738b560 187 {
kenjiArai 3:0ea41738b560 188
kenjiArai 3:0ea41738b560 189 uint8_t x = (key_num - 1) % key_out_num;
kenjiArai 3:0ea41738b560 190 uint8_t y = (key_num - 1)/ key_out_num;
kenjiArai 3:0ea41738b560 191 if (key_state[y][x] == ON_state) {
kenjiArai 3:0ea41738b560 192 return true;
kenjiArai 3:0ea41738b560 193 } else {
kenjiArai 3:0ea41738b560 194 return false;
kenjiArai 3:0ea41738b560 195 }
kenjiArai 3:0ea41738b560 196 }
kenjiArai 3:0ea41738b560 197
kenjiArai 0:b7249629f337 198 void Keypad::bf_put(char dt)
kenjiArai 0:b7249629f337 199 {
kenjiArai 0:b7249629f337 200 uint8_t next = write_addr + 1;
kenjiArai 0:b7249629f337 201 if (next == BF_SIZE) {
kenjiArai 0:b7249629f337 202 next = 0;
kenjiArai 0:b7249629f337 203 }
kenjiArai 0:b7249629f337 204 buf[write_addr] = dt;
kenjiArai 0:b7249629f337 205 write_addr = next;
kenjiArai 0:b7249629f337 206 }
kenjiArai 0:b7249629f337 207
kenjiArai 3:0ea41738b560 208 int8_t Keypad::bf_get (void)
kenjiArai 3:0ea41738b560 209 {
kenjiArai 3:0ea41738b560 210 if (read_addr == write_addr) {
kenjiArai 0:b7249629f337 211 return 0;
kenjiArai 0:b7249629f337 212 }
kenjiArai 0:b7249629f337 213 uint8_t dt = buf[read_addr];
kenjiArai 0:b7249629f337 214 ++read_addr;
kenjiArai 3:0ea41738b560 215 if (read_addr == BF_SIZE) {
kenjiArai 0:b7249629f337 216 read_addr = 0;
kenjiArai 0:b7249629f337 217 }
kenjiArai 0:b7249629f337 218 return dt;
kenjiArai 0:b7249629f337 219 }