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 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?

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