4x4 matrix keypad
Fork of Keypad by
Keypad.cpp@4:cbbd6e3a3be0, 2018-05-17 (annotated)
- 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?
User | Revision | Line number | New 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 | } |