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:
2017-09-30
Revision:
1:ed0ad90ad734
Parent:
0:b7249629f337
Child:
2:a3545b56bdd7

File content as of revision 1:ed0ad90ad734:

/*
 * Mbed Library / Akizuki AE-KIT45-KEYPAD4X3
 *  http://akizukidenshi.com/catalog/g/gK-12229/
 *
 * Copyright (c) 2017 Kenji Arai / JH1PJL
 *  http://www.page.sannet.ne.jp/kenjia/index.html
 *  http://mbed.org/users/kenjiArai/
 *      Created:    September 27th, 2017
 *      Revised:    October    1st, 2017
 */

#ifndef KEYPAD_H
#define KEYPAD_H

#include "mbed.h"

#define  CHNG_CNT       3

/**
 * @code
 * #include "mbed.h"
 * #include "Keypad.h"
 *
 * // every 2ms runs 6uS for key detection (CPU occupancy is 0.3%)
 * //       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);
                    
    /** Read key data into buffer
     *  @param none
     *  @return key number by ASCII code
     */
    uint8_t read(void);

protected:
    DigitalIn   *k_in[4];
    DigitalOut  *k_out[3];
    Ticker      tk;

    // key control
    enum State {Off_state, Off_to_on_transient, On_state, On_to_off_transient};
    volatile State  key_state[3][4];
    volatile int8_t key_transent_cntr[3][4];
    void key_scan(void);
    
    // buffer control
    #define BF_SIZE 16
    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