3 by 4 edited
Fork of keypad by
Diff: Keypad.h
- Revision:
- 10:da060f8c03e8
- Child:
- 11:86fef9e61104
diff -r e48ba5b4c497 -r da060f8c03e8 Keypad.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Keypad.h Wed Jan 01 17:45:53 2014 +0000 @@ -0,0 +1,126 @@ +/* mbed Keypad library, using user-defined interrupt callback + * Copyright (c) 2012 Yoong Hor Meng + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE + */ + +#ifndef KEYPAD_H +#define KEYPAD_H + +#include "mbed.h" +#include "FPointer.h" + +/** + * An interrupt-based interface to 4x4 keypad. + * + * On each key pressed on a keypad, the index of the key is passed to a + * user-defined function. User is free to define what to be done with the + * input. + * + * Example: + * @code + * #include "mbed.h" + * #include "Keypad.h" + * + * // Define your own keypad values + * char Keytable[] = { '1', '2', '3', 'A', // r0 + * '4', '5', '6', 'B', // r1 + * '7', '8', '9', 'C', // r2 + * '*', '0', '#', 'D' // r3 + * }; + * // c0 c1 c2 c3 + * + * uint32_t Index; + * + * uint32_t cbAfterInput(uint32_t index) { + * Index = index; + * return 0; + * } + * + * int main() { + * // r0 r1 r2 r3 c0 c1 c2 c3 + * Keypad keypad(p21, p22, p23, p24, p25, p26, p27, p28); + * keypad.attach(&cbAfterInput); + * keypad.start(); // energize the keypad via c0-c3 + * + * while (1) { + * __wfi(); + * printf("Interrupted\r\n"); + * printf("Index:%d => Key:%c\r\n", Index, Keytable[Index]); + * } + * } + * @endcode + */ + +class Keypad { +public: + /** Create a 4x4 (row, col) or 4x3 keypad interface: + * + * | Col0 | Col1 | Col2 | Col3 + * -------+------+------+------+----- + * Row 0 | x | x | x | x + * Row 1 | x | x | x | x + * Row 2 | x | x | x | x + * Row 3 | x | x | x | x + * + * @param row<0..3> Row data lines + * @param col<0..3> Column data lines + * @param debounce_ms Debounce in ms (Default to 20ms) + */ + Keypad(PinName r0, PinName r1, PinName r2, PinName r3, + PinName c0, PinName c1, PinName c2, PinName c3, + int debounce_ms = 20); + + /** Destructor + */ + ~Keypad(); + + /** Start the keypad interrupt routines + */ + void start(void); + + /** Stop the keypad interrupt routines + */ + void stop(void); + + /** User-defined function that to be called when a key is pressed + * @param fptr A function pointer takes a uint32_t and + * returns uint32_t + */ + void attach(uint32_t (*fptr)(uint32_t)); + +protected: + InterruptIn *_rows[4]; + DigitalOut *_cols[4]; + int _debounce; // miliseconds + int _nRow; + int _nCol; + FPointer _callback; // Called after each input + + void _checkIndex(int row, InterruptIn *therow); + void _cbRow0Rise(void); + void _cbRow1Rise(void); + void _cbRow2Rise(void); + void _cbRow3Rise(void); + void _setupRiseTrigger(void); +}; + +#endif // KEYPAD_H +