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:
Sat Sep 30 23:26:44 2017 +0000
Revision:
1:ed0ad90ad734
Parent:
0:b7249629f337
Child:
2:a3545b56bdd7
small modification

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kenjiArai 0:b7249629f337 1 /*
kenjiArai 0:b7249629f337 2 * Mbed Library / Akizuki AE-KIT45-KEYPAD4X3
kenjiArai 0:b7249629f337 3 * http://akizukidenshi.com/catalog/g/gK-12229/
kenjiArai 0:b7249629f337 4 *
kenjiArai 0:b7249629f337 5 * Copyright (c) 2017 Kenji Arai / JH1PJL
kenjiArai 0:b7249629f337 6 * http://www.page.sannet.ne.jp/kenjia/index.html
kenjiArai 0:b7249629f337 7 * http://mbed.org/users/kenjiArai/
kenjiArai 0:b7249629f337 8 * Created: September 27th, 2017
kenjiArai 0:b7249629f337 9 * Revised: October 1st, 2017
kenjiArai 0:b7249629f337 10 */
kenjiArai 0:b7249629f337 11
kenjiArai 0:b7249629f337 12 #include "Keypad.h"
kenjiArai 0:b7249629f337 13
kenjiArai 1:ed0ad90ad734 14 //extern Serial pc;
kenjiArai 1:ed0ad90ad734 15 //extern DigitalOut my_led;
kenjiArai 0:b7249629f337 16
kenjiArai 0:b7249629f337 17 Keypad::Keypad(
kenjiArai 0:b7249629f337 18 PinName kx, PinName ky, PinName kz,
kenjiArai 0:b7249629f337 19 PinName ka, PinName kb, PinName kc, PinName kd
kenjiArai 0:b7249629f337 20 )
kenjiArai 0:b7249629f337 21 {
kenjiArai 0:b7249629f337 22 k_in[0] = new DigitalIn (ka, PullUp);
kenjiArai 0:b7249629f337 23 k_in[1] = new DigitalIn (kb, PullUp);
kenjiArai 0:b7249629f337 24 k_in[2] = new DigitalIn (kc, PullUp);
kenjiArai 0:b7249629f337 25 k_in[3] = new DigitalIn (kd, PullUp);
kenjiArai 0:b7249629f337 26 k_out[0] = new DigitalOut (kx);
kenjiArai 0:b7249629f337 27 k_out[1] = new DigitalOut (ky);
kenjiArai 0:b7249629f337 28 k_out[2] = new DigitalOut (kz);
kenjiArai 0:b7249629f337 29 *k_out[0] = 1;
kenjiArai 0:b7249629f337 30 *k_out[1] = 1;
kenjiArai 0:b7249629f337 31 *k_out[2] = 1;
kenjiArai 0:b7249629f337 32 uint8_t j,i;
kenjiArai 0:b7249629f337 33 for (j = 0; j < 3; j++){
kenjiArai 0:b7249629f337 34 for(i = 0; i < 4; i++){
kenjiArai 0:b7249629f337 35 key_transent_cntr[j][i] = CHNG_CNT;
kenjiArai 0:b7249629f337 36 key_state[j][i] = Off_state;
kenjiArai 0:b7249629f337 37 }
kenjiArai 0:b7249629f337 38 }
kenjiArai 0:b7249629f337 39 for(i = 0; i < 32; i++){
kenjiArai 0:b7249629f337 40 buf[i] = 0;
kenjiArai 0:b7249629f337 41 }
kenjiArai 0:b7249629f337 42 read_addr = 0;
kenjiArai 0:b7249629f337 43 write_addr = 0;
kenjiArai 0:b7249629f337 44 tk.attach_us(callback(this, &Keypad::key_scan), 2000); // 2mS
kenjiArai 0:b7249629f337 45 }
kenjiArai 0:b7249629f337 46
kenjiArai 0:b7249629f337 47 void Keypad::key_scan(void)
kenjiArai 0:b7249629f337 48 {
kenjiArai 0:b7249629f337 49 //my_led = 1;
kenjiArai 0:b7249629f337 50 for (int32_t j = 0; j < 3; j++){
kenjiArai 0:b7249629f337 51 *k_out[0] = 1; *k_out[1] = 1; *k_out[2] = 1;
kenjiArai 0:b7249629f337 52 *k_out[j] = 0;
kenjiArai 0:b7249629f337 53 wait_us(1);
kenjiArai 0:b7249629f337 54 for (int32_t i = 0; i < 4; i++){
kenjiArai 0:b7249629f337 55 switch (key_state[j][i]){
kenjiArai 0:b7249629f337 56 case Off_state:
kenjiArai 0:b7249629f337 57 //my_led = 1;
kenjiArai 0:b7249629f337 58 if (*k_in[i] == 0){ // key on
kenjiArai 0:b7249629f337 59 key_state[j][i] = Off_to_on_transient;
kenjiArai 0:b7249629f337 60 key_transent_cntr[j][i] = CHNG_CNT;
kenjiArai 0:b7249629f337 61 }
kenjiArai 0:b7249629f337 62 break;
kenjiArai 0:b7249629f337 63 case Off_to_on_transient:
kenjiArai 0:b7249629f337 64 //my_led = 1;
kenjiArai 0:b7249629f337 65 if (*k_in[i] == 0){ // key on
kenjiArai 0:b7249629f337 66 if (--key_transent_cntr[j][i] < -CHNG_CNT){
kenjiArai 0:b7249629f337 67 //my_led = 1;
kenjiArai 0:b7249629f337 68 bf_put(j * 4 + i + 1); // save data into buffer
kenjiArai 0:b7249629f337 69 key_state[j][i] = On_state;
kenjiArai 0:b7249629f337 70 }
kenjiArai 0:b7249629f337 71 } else { // key off
kenjiArai 0:b7249629f337 72 if (++key_transent_cntr[j][i] > CHNG_CNT){
kenjiArai 0:b7249629f337 73 key_state[j][i] = Off_state;
kenjiArai 0:b7249629f337 74 }
kenjiArai 0:b7249629f337 75 }
kenjiArai 0:b7249629f337 76 break;
kenjiArai 0:b7249629f337 77 case On_state:
kenjiArai 0:b7249629f337 78 //my_led = 1;
kenjiArai 0:b7249629f337 79 if (*k_in[i] == 1){ // key off
kenjiArai 0:b7249629f337 80 key_state[j][i] = On_to_off_transient;
kenjiArai 0:b7249629f337 81 key_transent_cntr[j][i] = -CHNG_CNT;
kenjiArai 0:b7249629f337 82 }
kenjiArai 0:b7249629f337 83 break;
kenjiArai 0:b7249629f337 84 case On_to_off_transient:
kenjiArai 0:b7249629f337 85 //my_led = 1;
kenjiArai 0:b7249629f337 86 if (*k_in[i] == 0){ // key on
kenjiArai 0:b7249629f337 87 if (--key_transent_cntr[j][i] < -CHNG_CNT){
kenjiArai 0:b7249629f337 88 key_state[j][i] = On_state;
kenjiArai 0:b7249629f337 89 }
kenjiArai 0:b7249629f337 90 } else { // key off
kenjiArai 0:b7249629f337 91 if (++key_transent_cntr[j][i] > CHNG_CNT){
kenjiArai 0:b7249629f337 92 key_state[j][i] = Off_state;
kenjiArai 0:b7249629f337 93 }
kenjiArai 0:b7249629f337 94 }
kenjiArai 0:b7249629f337 95 break;
kenjiArai 0:b7249629f337 96 default: // just in case
kenjiArai 0:b7249629f337 97 key_state[j][i] = Off_state;
kenjiArai 0:b7249629f337 98 break;
kenjiArai 0:b7249629f337 99 }
kenjiArai 0:b7249629f337 100 //my_led = 0;
kenjiArai 0:b7249629f337 101 }
kenjiArai 0:b7249629f337 102 }
kenjiArai 0:b7249629f337 103 *k_out[0] = 1; *k_out[1] = 1; *k_out[2] = 1;
kenjiArai 0:b7249629f337 104 //my_led = 0;
kenjiArai 0:b7249629f337 105 }
kenjiArai 0:b7249629f337 106
kenjiArai 0:b7249629f337 107 uint8_t Keypad::read(void)
kenjiArai 0:b7249629f337 108 {
kenjiArai 0:b7249629f337 109 return bf_get();
kenjiArai 0:b7249629f337 110 }
kenjiArai 0:b7249629f337 111
kenjiArai 0:b7249629f337 112 void Keypad::bf_put(char dt)
kenjiArai 0:b7249629f337 113 {
kenjiArai 0:b7249629f337 114 uint8_t next = write_addr + 1;
kenjiArai 0:b7249629f337 115 if (next == BF_SIZE) {
kenjiArai 0:b7249629f337 116 next = 0;
kenjiArai 0:b7249629f337 117 }
kenjiArai 0:b7249629f337 118 buf[write_addr] = dt;
kenjiArai 0:b7249629f337 119 write_addr = next;
kenjiArai 0:b7249629f337 120 }
kenjiArai 0:b7249629f337 121
kenjiArai 0:b7249629f337 122 int8_t Keypad::bf_get (void){
kenjiArai 0:b7249629f337 123 if (read_addr == write_addr){
kenjiArai 0:b7249629f337 124 return 0;
kenjiArai 0:b7249629f337 125 }
kenjiArai 0:b7249629f337 126 uint8_t dt = buf[read_addr];
kenjiArai 0:b7249629f337 127 ++read_addr;
kenjiArai 0:b7249629f337 128 if (read_addr == BF_SIZE){
kenjiArai 0:b7249629f337 129 read_addr = 0;
kenjiArai 0:b7249629f337 130 }
kenjiArai 0:b7249629f337 131 return dt;
kenjiArai 0:b7249629f337 132 }