4x4 matrix keypad
Fork of Keypad by
Keypad.cpp@2:a3545b56bdd7, 2017-12-21 (annotated)
- Committer:
- kenjiArai
- Date:
- Thu Dec 21 22:46:19 2017 +0000
- Revision:
- 2:a3545b56bdd7
- Parent:
- 1:ed0ad90ad734
- Child:
- 3:82aae98732cd
bug / buffer size -> initialize different size
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( |
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 | 2:a3545b56bdd7 | 39 | for(i = 0; i < BF_SIZE; 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 | } |