4x4 matrix keypad

Fork of Keypad by Kenji Arai

Committer:
microHenri
Date:
Thu May 17 18:41:52 2018 +0000
Revision:
4:cbbd6e3a3be0
Parent:
3:82aae98732cd
4x4 matrix fork

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 2:a3545b56bdd7 9 * Revised: December 22nd, 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(
microHenri 3:82aae98732cd 18 PinName kw, 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);
microHenri 3:82aae98732cd 26 k_out[0] = new DigitalOut (kw);
microHenri 3:82aae98732cd 27 k_out[1] = new DigitalOut (kx);
microHenri 3:82aae98732cd 28 k_out[2] = new DigitalOut (ky);
microHenri 3:82aae98732cd 29 k_out[3] = new DigitalOut (kz);
kenjiArai 0:b7249629f337 30 *k_out[0] = 1;
kenjiArai 0:b7249629f337 31 *k_out[1] = 1;
kenjiArai 0:b7249629f337 32 *k_out[2] = 1;
microHenri 3:82aae98732cd 33 *k_out[3] = 1;
kenjiArai 0:b7249629f337 34 uint8_t j,i;
microHenri 3:82aae98732cd 35 for (j = 0; j < 4; j++){
kenjiArai 0:b7249629f337 36 for(i = 0; i < 4; i++){
kenjiArai 0:b7249629f337 37 key_transent_cntr[j][i] = CHNG_CNT;
kenjiArai 0:b7249629f337 38 key_state[j][i] = Off_state;
kenjiArai 0:b7249629f337 39 }
kenjiArai 0:b7249629f337 40 }
kenjiArai 2:a3545b56bdd7 41 for(i = 0; i < BF_SIZE; i++){
kenjiArai 0:b7249629f337 42 buf[i] = 0;
kenjiArai 0:b7249629f337 43 }
kenjiArai 0:b7249629f337 44 read_addr = 0;
kenjiArai 0:b7249629f337 45 write_addr = 0;
kenjiArai 0:b7249629f337 46 tk.attach_us(callback(this, &Keypad::key_scan), 2000); // 2mS
kenjiArai 0:b7249629f337 47 }
kenjiArai 0:b7249629f337 48
kenjiArai 0:b7249629f337 49 void Keypad::key_scan(void)
kenjiArai 0:b7249629f337 50 {
kenjiArai 0:b7249629f337 51 //my_led = 1;
microHenri 3:82aae98732cd 52 for (int32_t j = 0; j < 4; j++){
microHenri 3:82aae98732cd 53 *k_out[0] = 1; *k_out[1] = 1; *k_out[2] = 1; *k_out[3] = 1;
kenjiArai 0:b7249629f337 54 *k_out[j] = 0;
kenjiArai 0:b7249629f337 55 wait_us(1);
kenjiArai 0:b7249629f337 56 for (int32_t i = 0; i < 4; i++){
kenjiArai 0:b7249629f337 57 switch (key_state[j][i]){
kenjiArai 0:b7249629f337 58 case Off_state:
kenjiArai 0:b7249629f337 59 //my_led = 1;
kenjiArai 0:b7249629f337 60 if (*k_in[i] == 0){ // key on
kenjiArai 0:b7249629f337 61 key_state[j][i] = Off_to_on_transient;
kenjiArai 0:b7249629f337 62 key_transent_cntr[j][i] = CHNG_CNT;
kenjiArai 0:b7249629f337 63 }
kenjiArai 0:b7249629f337 64 break;
kenjiArai 0:b7249629f337 65 case Off_to_on_transient:
kenjiArai 0:b7249629f337 66 //my_led = 1;
kenjiArai 0:b7249629f337 67 if (*k_in[i] == 0){ // key on
kenjiArai 0:b7249629f337 68 if (--key_transent_cntr[j][i] < -CHNG_CNT){
kenjiArai 0:b7249629f337 69 //my_led = 1;
kenjiArai 0:b7249629f337 70 bf_put(j * 4 + i + 1); // save data into buffer
kenjiArai 0:b7249629f337 71 key_state[j][i] = On_state;
kenjiArai 0:b7249629f337 72 }
kenjiArai 0:b7249629f337 73 } else { // key off
kenjiArai 0:b7249629f337 74 if (++key_transent_cntr[j][i] > CHNG_CNT){
kenjiArai 0:b7249629f337 75 key_state[j][i] = Off_state;
kenjiArai 0:b7249629f337 76 }
kenjiArai 0:b7249629f337 77 }
kenjiArai 0:b7249629f337 78 break;
kenjiArai 0:b7249629f337 79 case On_state:
kenjiArai 0:b7249629f337 80 //my_led = 1;
kenjiArai 0:b7249629f337 81 if (*k_in[i] == 1){ // key off
kenjiArai 0:b7249629f337 82 key_state[j][i] = On_to_off_transient;
kenjiArai 0:b7249629f337 83 key_transent_cntr[j][i] = -CHNG_CNT;
kenjiArai 0:b7249629f337 84 }
kenjiArai 0:b7249629f337 85 break;
kenjiArai 0:b7249629f337 86 case On_to_off_transient:
kenjiArai 0:b7249629f337 87 //my_led = 1;
kenjiArai 0:b7249629f337 88 if (*k_in[i] == 0){ // key on
kenjiArai 0:b7249629f337 89 if (--key_transent_cntr[j][i] < -CHNG_CNT){
kenjiArai 0:b7249629f337 90 key_state[j][i] = On_state;
kenjiArai 0:b7249629f337 91 }
kenjiArai 0:b7249629f337 92 } else { // key off
kenjiArai 0:b7249629f337 93 if (++key_transent_cntr[j][i] > CHNG_CNT){
kenjiArai 0:b7249629f337 94 key_state[j][i] = Off_state;
kenjiArai 0:b7249629f337 95 }
kenjiArai 0:b7249629f337 96 }
kenjiArai 0:b7249629f337 97 break;
kenjiArai 0:b7249629f337 98 default: // just in case
kenjiArai 0:b7249629f337 99 key_state[j][i] = Off_state;
kenjiArai 0:b7249629f337 100 break;
kenjiArai 0:b7249629f337 101 }
kenjiArai 0:b7249629f337 102 //my_led = 0;
kenjiArai 0:b7249629f337 103 }
kenjiArai 0:b7249629f337 104 }
microHenri 3:82aae98732cd 105 *k_out[0] = 1; *k_out[1] = 1; *k_out[2] = 1; *k_out[3] = 1;
kenjiArai 0:b7249629f337 106 //my_led = 0;
kenjiArai 0:b7249629f337 107 }
kenjiArai 0:b7249629f337 108
kenjiArai 0:b7249629f337 109 uint8_t Keypad::read(void)
kenjiArai 0:b7249629f337 110 {
kenjiArai 0:b7249629f337 111 return bf_get();
kenjiArai 0:b7249629f337 112 }
kenjiArai 0:b7249629f337 113
kenjiArai 0:b7249629f337 114 void Keypad::bf_put(char dt)
kenjiArai 0:b7249629f337 115 {
kenjiArai 0:b7249629f337 116 uint8_t next = write_addr + 1;
kenjiArai 0:b7249629f337 117 if (next == BF_SIZE) {
kenjiArai 0:b7249629f337 118 next = 0;
kenjiArai 0:b7249629f337 119 }
kenjiArai 0:b7249629f337 120 buf[write_addr] = dt;
kenjiArai 0:b7249629f337 121 write_addr = next;
kenjiArai 0:b7249629f337 122 }
kenjiArai 0:b7249629f337 123
kenjiArai 0:b7249629f337 124 int8_t Keypad::bf_get (void){
kenjiArai 0:b7249629f337 125 if (read_addr == write_addr){
kenjiArai 0:b7249629f337 126 return 0;
kenjiArai 0:b7249629f337 127 }
kenjiArai 0:b7249629f337 128 uint8_t dt = buf[read_addr];
kenjiArai 0:b7249629f337 129 ++read_addr;
kenjiArai 0:b7249629f337 130 if (read_addr == BF_SIZE){
kenjiArai 0:b7249629f337 131 read_addr = 0;
kenjiArai 0:b7249629f337 132 }
kenjiArai 0:b7249629f337 133 return dt;
kenjiArai 0:b7249629f337 134 }