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

Committer:
kenjiArai
Date:
2021-02-18
Revision:
5:8929ce2f393c
Parent:
4:f74ca02cdba1

File content as of revision 5:8929ce2f393c:

/*
 * Mbed Library
 *  example:
 *      Akizuki AE-KIT45-KEYPAD4X3
 *      http://akizukidenshi.com/catalog/g/gK-12229/
 *
 * Copyright (c) 2017,'20 Kenji Arai / JH1PJL
 *  http://www7b.biglobe.ne.jp/~kenjia/
 *  https://os.mbed.com/users/kenjiArai/
 *      Created:    September 27th, 2017
 *      Revised:    April     13th, 2020
 */
// ---- Merged below and added 4x5=20, 5x5=25 library --------------------------

/*
 * 4x4 Fork: Henri Clarke
 *          May 17th, 2018
 *      https://os.mbed.com/users/microHenri/code/Keypad/
 */

/*
 *  Performance
 *      every 2ms runs XuS for key detection(5x5=25 keys)
 *          on Nucleo-F446RE ->X=10uS, CPU occupancy is around 0.5%
 *          on Nucleo-L152RE ->X=50uS, CPU occupancy is around 2.5%
 *          on FRDM-K64F     ->X=28uS, CPU occupancy is around 1.4%
 */

#ifndef KEYPAD_H
#define KEYPAD_H

#include "mbed.h"

#define  CHNG_CNT       4

//------------- ASCII CODE ---------------
#define NUL     0x00
#define SOH     0x01
#define STX     0x02
#define ETX     0x03
#define EOT     0x04
#define ENQ     0x05
#define ACK     0x06
#define BEL     0x07
#define BS      0x08
#define HT      0x09
#define LF      0x0a
#define VT      0x0b
#define FF      0x0c
#define CR      0x0d
#define SD      0x0e
#define SI      0x0f
#define DLE     0x10
#define DC1     0x11
#define DC2     0x12
#define DC3     0x13
#define DC4     0x14
#define NAK     0x15
#define SYN     0x16
#define ETB     0x17
#define CAN     0x18
#define EM      0x19
#define SUB     0x1a
#define ESC     0x1b
#define FS      0x1c
#define GS      0x1d
#define RS      0x1e
#define US      0x1f
#define SPC     0x20

/**
 * @code
 * #include "mbed.h"
 * #include "Keypad.h"
 *
 * //       output port  X  Y  Z
 * //       Input A      *  0  #
 * //       Input B      7  8  9
 * //       Input C      4  5  6
 * //       Input D      1  2  3
 * //          X    Y   Z   A   B   C   D   OUT(XYZ), IN(ABCD)
 * Keypad key(D10, D9, D8, D7, D6, D5, D4);
 *
 * // define key number at main routine
 * char *const key_table = "?*7410852#963";  // key_table[0]=? is not used!
 *
 * int main() {
 *     uint32_t key_num;
 *     while(true) {
 *         while ((key_num = key.read()) != 0){
 *             printf("%c\r\n", *(key_table + key_num));
 *         }
 *         wait(1.0);
 *     }
 * }
 * @endcode
 */

class Keypad
{
public:
    /** 4x3 keypad interface:
     *  @param key input port           A,B,C,D
     *  @param key output(scan) port    X,Y,Z
     */
    Keypad(PinName kx, PinName ky, PinName kz,
           PinName ka, PinName kb, PinName kc, PinName kd);

    /** 4x4 keypad interface:
     *  @param key input port           A,B,C,D
     *  @param key output(scan) port    X,Y,Z,W
     */
    Keypad(PinName kx, PinName ky, PinName kz, PinName kw,
           PinName ka, PinName kb, PinName kc, PinName kd);

    /** 5x4 keypad interface:
     *  @param key input port           A,B,C,D,E
     *  @param key output(scan) port    X,Y,Z,W
     */
    Keypad(PinName kx, PinName ky, PinName kz, PinName kw,
           PinName ka, PinName kb, PinName kc, PinName kd, PinName ke);

    /** 5x5 keypad interface:
     *  @param key input port           A,B,C,D,E
     *  @param key output(scan) port    X,Y,Z,W,V
     */
    Keypad(PinName kx, PinName ky, PinName kz, PinName kw, PinName kv,
           PinName ka, PinName kb, PinName kc, PinName kd, PinName ke);

    /** Read key data into buffer
     *  @param none
     *  @return key number by ASCII code
     */
    uint8_t read(void);

    /** Read key ON/OFF state
     *  @param none
     *  @return ON(true) or OFF(false)
     */
    bool read_state(uint8_t key_num);

protected:
#define BF_SIZE     32
#define NUM         5

    DigitalIn     *k_in[NUM];
    DigitalInOut  *k_out[NUM];
    Ticker        tk;

    // key control
    enum State {OFF_state, OFF_to_ON_transient, ON_state, ON_to_OFF_transient};
    volatile State  key_state[NUM][NUM];
    volatile int8_t key_transent_cntr[NUM][NUM];
    void key_scan(void);
    void initialize(void);

    // mode control
    uint8_t key_mode;
    uint8_t key_in_num;
    uint8_t key_out_num;

    // buffer control
    uint8_t read_addr;
    uint8_t write_addr;
    uint8_t buf[BF_SIZE];
    void bf_put(char dat);
    int8_t bf_get(void);

};

#endif // KEYPAD_H