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/
Keypad.h@4:f74ca02cdba1, 2020-04-13 (annotated)
- Committer:
- kenjiArai
- Date:
- Mon Apr 13 02:04:25 2020 +0000
- Revision:
- 4:f74ca02cdba1
- Parent:
- 3:0ea41738b560
modified DigitalOut to DigitalInOut
Who changed what in which revision?
User | Revision | Line number | New 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 | 4:f74ca02cdba1 | 11 | * Revised: April 13th, 2020 |
kenjiArai | 3:0ea41738b560 | 12 | */ |
kenjiArai | 3:0ea41738b560 | 13 | // ---- Merged below and added 4x5=20, 5x5=25 library -------------------------- |
kenjiArai | 3:0ea41738b560 | 14 | |
kenjiArai | 3:0ea41738b560 | 15 | /* |
kenjiArai | 3:0ea41738b560 | 16 | * 4x4 Fork: Henri Clarke |
kenjiArai | 3:0ea41738b560 | 17 | * May 17th, 2018 |
kenjiArai | 3:0ea41738b560 | 18 | * https://os.mbed.com/users/microHenri/code/Keypad/ |
kenjiArai | 3:0ea41738b560 | 19 | */ |
kenjiArai | 3:0ea41738b560 | 20 | |
kenjiArai | 3:0ea41738b560 | 21 | /* |
kenjiArai | 3:0ea41738b560 | 22 | * Performance |
kenjiArai | 3:0ea41738b560 | 23 | * every 2ms runs XuS for key detection(5x5=25 keys) |
kenjiArai | 3:0ea41738b560 | 24 | * on Nucleo-F446RE ->X=10uS, CPU occupancy is around 0.5% |
kenjiArai | 3:0ea41738b560 | 25 | * on Nucleo-L152RE ->X=50uS, CPU occupancy is around 2.5% |
kenjiArai | 3:0ea41738b560 | 26 | * on FRDM-K64F ->X=28uS, CPU occupancy is around 1.4% |
kenjiArai | 0:b7249629f337 | 27 | */ |
kenjiArai | 0:b7249629f337 | 28 | |
kenjiArai | 0:b7249629f337 | 29 | #ifndef KEYPAD_H |
kenjiArai | 0:b7249629f337 | 30 | #define KEYPAD_H |
kenjiArai | 0:b7249629f337 | 31 | |
kenjiArai | 0:b7249629f337 | 32 | #include "mbed.h" |
kenjiArai | 0:b7249629f337 | 33 | |
kenjiArai | 3:0ea41738b560 | 34 | #define CHNG_CNT 4 |
kenjiArai | 3:0ea41738b560 | 35 | |
kenjiArai | 3:0ea41738b560 | 36 | //------------- ASCII CODE --------------- |
kenjiArai | 3:0ea41738b560 | 37 | #define NUL 0x00 |
kenjiArai | 3:0ea41738b560 | 38 | #define SOH 0x01 |
kenjiArai | 3:0ea41738b560 | 39 | #define STX 0x02 |
kenjiArai | 3:0ea41738b560 | 40 | #define ETX 0x03 |
kenjiArai | 3:0ea41738b560 | 41 | #define EOT 0x04 |
kenjiArai | 3:0ea41738b560 | 42 | #define ENQ 0x05 |
kenjiArai | 3:0ea41738b560 | 43 | #define ACK 0x06 |
kenjiArai | 3:0ea41738b560 | 44 | #define BEL 0x07 |
kenjiArai | 3:0ea41738b560 | 45 | #define BS 0x08 |
kenjiArai | 3:0ea41738b560 | 46 | #define HT 0x09 |
kenjiArai | 3:0ea41738b560 | 47 | #define LF 0x0a |
kenjiArai | 3:0ea41738b560 | 48 | #define VT 0x0b |
kenjiArai | 3:0ea41738b560 | 49 | #define FF 0x0c |
kenjiArai | 3:0ea41738b560 | 50 | #define CR 0x0d |
kenjiArai | 3:0ea41738b560 | 51 | #define SD 0x0e |
kenjiArai | 3:0ea41738b560 | 52 | #define SI 0x0f |
kenjiArai | 3:0ea41738b560 | 53 | #define DLE 0x10 |
kenjiArai | 3:0ea41738b560 | 54 | #define DC1 0x11 |
kenjiArai | 3:0ea41738b560 | 55 | #define DC2 0x12 |
kenjiArai | 3:0ea41738b560 | 56 | #define DC3 0x13 |
kenjiArai | 3:0ea41738b560 | 57 | #define DC4 0x14 |
kenjiArai | 3:0ea41738b560 | 58 | #define NAK 0x15 |
kenjiArai | 3:0ea41738b560 | 59 | #define SYN 0x16 |
kenjiArai | 3:0ea41738b560 | 60 | #define ETB 0x17 |
kenjiArai | 3:0ea41738b560 | 61 | #define CAN 0x18 |
kenjiArai | 3:0ea41738b560 | 62 | #define EM 0x19 |
kenjiArai | 3:0ea41738b560 | 63 | #define SUB 0x1a |
kenjiArai | 3:0ea41738b560 | 64 | #define ESC 0x1b |
kenjiArai | 3:0ea41738b560 | 65 | #define FS 0x1c |
kenjiArai | 3:0ea41738b560 | 66 | #define GS 0x1d |
kenjiArai | 3:0ea41738b560 | 67 | #define RS 0x1e |
kenjiArai | 3:0ea41738b560 | 68 | #define US 0x1f |
kenjiArai | 3:0ea41738b560 | 69 | #define SPC 0x20 |
kenjiArai | 0:b7249629f337 | 70 | |
kenjiArai | 0:b7249629f337 | 71 | /** |
kenjiArai | 0:b7249629f337 | 72 | * @code |
kenjiArai | 0:b7249629f337 | 73 | * #include "mbed.h" |
kenjiArai | 0:b7249629f337 | 74 | * #include "Keypad.h" |
kenjiArai | 0:b7249629f337 | 75 | * |
kenjiArai | 0:b7249629f337 | 76 | * // output port X Y Z |
kenjiArai | 0:b7249629f337 | 77 | * // Input A * 0 # |
kenjiArai | 0:b7249629f337 | 78 | * // Input B 7 8 9 |
kenjiArai | 0:b7249629f337 | 79 | * // Input C 4 5 6 |
kenjiArai | 0:b7249629f337 | 80 | * // Input D 1 2 3 |
kenjiArai | 0:b7249629f337 | 81 | * // X Y Z A B C D OUT(XYZ), IN(ABCD) |
kenjiArai | 0:b7249629f337 | 82 | * Keypad key(D10, D9, D8, D7, D6, D5, D4); |
kenjiArai | 0:b7249629f337 | 83 | * |
kenjiArai | 0:b7249629f337 | 84 | * // define key number at main routine |
kenjiArai | 0:b7249629f337 | 85 | * char *const key_table = "?*7410852#963"; // key_table[0]=? is not used! |
kenjiArai | 0:b7249629f337 | 86 | * |
kenjiArai | 0:b7249629f337 | 87 | * int main() { |
kenjiArai | 0:b7249629f337 | 88 | * uint32_t key_num; |
kenjiArai | 0:b7249629f337 | 89 | * while(true) { |
kenjiArai | 0:b7249629f337 | 90 | * while ((key_num = key.read()) != 0){ |
kenjiArai | 0:b7249629f337 | 91 | * printf("%c\r\n", *(key_table + key_num)); |
kenjiArai | 0:b7249629f337 | 92 | * } |
kenjiArai | 3:0ea41738b560 | 93 | * wait(1.0); |
kenjiArai | 0:b7249629f337 | 94 | * } |
kenjiArai | 0:b7249629f337 | 95 | * } |
kenjiArai | 0:b7249629f337 | 96 | * @endcode |
kenjiArai | 0:b7249629f337 | 97 | */ |
kenjiArai | 0:b7249629f337 | 98 | |
kenjiArai | 3:0ea41738b560 | 99 | class Keypad |
kenjiArai | 3:0ea41738b560 | 100 | { |
kenjiArai | 0:b7249629f337 | 101 | public: |
kenjiArai | 0:b7249629f337 | 102 | /** 4x3 keypad interface: |
kenjiArai | 0:b7249629f337 | 103 | * @param key input port A,B,C,D |
kenjiArai | 0:b7249629f337 | 104 | * @param key output(scan) port X,Y,Z |
kenjiArai | 0:b7249629f337 | 105 | */ |
kenjiArai | 0:b7249629f337 | 106 | Keypad(PinName kx, PinName ky, PinName kz, |
kenjiArai | 0:b7249629f337 | 107 | PinName ka, PinName kb, PinName kc, PinName kd); |
kenjiArai | 3:0ea41738b560 | 108 | |
kenjiArai | 3:0ea41738b560 | 109 | /** 4x4 keypad interface: |
kenjiArai | 3:0ea41738b560 | 110 | * @param key input port A,B,C,D |
kenjiArai | 3:0ea41738b560 | 111 | * @param key output(scan) port X,Y,Z,W |
kenjiArai | 3:0ea41738b560 | 112 | */ |
kenjiArai | 3:0ea41738b560 | 113 | Keypad(PinName kx, PinName ky, PinName kz, PinName kw, |
kenjiArai | 3:0ea41738b560 | 114 | PinName ka, PinName kb, PinName kc, PinName kd); |
kenjiArai | 3:0ea41738b560 | 115 | |
kenjiArai | 3:0ea41738b560 | 116 | /** 5x4 keypad interface: |
kenjiArai | 3:0ea41738b560 | 117 | * @param key input port A,B,C,D,E |
kenjiArai | 3:0ea41738b560 | 118 | * @param key output(scan) port X,Y,Z,W |
kenjiArai | 3:0ea41738b560 | 119 | */ |
kenjiArai | 3:0ea41738b560 | 120 | Keypad(PinName kx, PinName ky, PinName kz, PinName kw, |
kenjiArai | 3:0ea41738b560 | 121 | PinName ka, PinName kb, PinName kc, PinName kd, PinName ke); |
kenjiArai | 3:0ea41738b560 | 122 | |
kenjiArai | 3:0ea41738b560 | 123 | /** 5x5 keypad interface: |
kenjiArai | 3:0ea41738b560 | 124 | * @param key input port A,B,C,D,E |
kenjiArai | 3:0ea41738b560 | 125 | * @param key output(scan) port X,Y,Z,W,V |
kenjiArai | 3:0ea41738b560 | 126 | */ |
kenjiArai | 3:0ea41738b560 | 127 | Keypad(PinName kx, PinName ky, PinName kz, PinName kw, PinName kv, |
kenjiArai | 3:0ea41738b560 | 128 | PinName ka, PinName kb, PinName kc, PinName kd, PinName ke); |
kenjiArai | 3:0ea41738b560 | 129 | |
kenjiArai | 0:b7249629f337 | 130 | /** Read key data into buffer |
kenjiArai | 0:b7249629f337 | 131 | * @param none |
kenjiArai | 1:ed0ad90ad734 | 132 | * @return key number by ASCII code |
kenjiArai | 0:b7249629f337 | 133 | */ |
kenjiArai | 0:b7249629f337 | 134 | uint8_t read(void); |
kenjiArai | 0:b7249629f337 | 135 | |
kenjiArai | 3:0ea41738b560 | 136 | /** Read key ON/OFF state |
kenjiArai | 3:0ea41738b560 | 137 | * @param none |
kenjiArai | 3:0ea41738b560 | 138 | * @return ON(true) or OFF(false) |
kenjiArai | 3:0ea41738b560 | 139 | */ |
kenjiArai | 3:0ea41738b560 | 140 | bool read_state(uint8_t key_num); |
kenjiArai | 3:0ea41738b560 | 141 | |
kenjiArai | 0:b7249629f337 | 142 | protected: |
kenjiArai | 3:0ea41738b560 | 143 | #define BF_SIZE 32 |
kenjiArai | 3:0ea41738b560 | 144 | #define NUM 5 |
kenjiArai | 3:0ea41738b560 | 145 | |
kenjiArai | 4:f74ca02cdba1 | 146 | DigitalIn *k_in[NUM]; |
kenjiArai | 4:f74ca02cdba1 | 147 | DigitalInOut *k_out[NUM]; |
kenjiArai | 4:f74ca02cdba1 | 148 | Ticker tk; |
kenjiArai | 0:b7249629f337 | 149 | |
kenjiArai | 0:b7249629f337 | 150 | // key control |
kenjiArai | 3:0ea41738b560 | 151 | enum State {OFF_state, OFF_to_ON_transient, ON_state, ON_to_OFF_transient}; |
kenjiArai | 3:0ea41738b560 | 152 | volatile State key_state[NUM][NUM]; |
kenjiArai | 3:0ea41738b560 | 153 | volatile int8_t key_transent_cntr[NUM][NUM]; |
kenjiArai | 0:b7249629f337 | 154 | void key_scan(void); |
kenjiArai | 3:0ea41738b560 | 155 | void initialize(void); |
kenjiArai | 3:0ea41738b560 | 156 | |
kenjiArai | 3:0ea41738b560 | 157 | // mode control |
kenjiArai | 3:0ea41738b560 | 158 | uint8_t key_mode; |
kenjiArai | 3:0ea41738b560 | 159 | uint8_t key_in_num; |
kenjiArai | 3:0ea41738b560 | 160 | uint8_t key_out_num; |
kenjiArai | 3:0ea41738b560 | 161 | |
kenjiArai | 0:b7249629f337 | 162 | // buffer control |
kenjiArai | 3:0ea41738b560 | 163 | uint8_t read_addr; |
kenjiArai | 3:0ea41738b560 | 164 | uint8_t write_addr; |
kenjiArai | 3:0ea41738b560 | 165 | uint8_t buf[BF_SIZE]; |
kenjiArai | 3:0ea41738b560 | 166 | void bf_put(char dat); |
kenjiArai | 3:0ea41738b560 | 167 | int8_t bf_get(void); |
kenjiArai | 0:b7249629f337 | 168 | |
kenjiArai | 0:b7249629f337 | 169 | }; |
kenjiArai | 0:b7249629f337 | 170 | |
kenjiArai | 0:b7249629f337 | 171 | #endif // KEYPAD_H |