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:
Mon Apr 13 02:04:25 2020 +0000
Revision:
4:f74ca02cdba1
Parent:
3:0ea41738b560
modified DigitalOut to DigitalInOut

Who changed what in which revision?

UserRevisionLine numberNew 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