Sense keypresses from a 4x4 keypad A derivative ot he Hotboard_keypad library
Dependents: 26_Hotboards_MultiKey 26_Hotboards_EventKeypad
Fork of Hotboards_keypad by
Diff: Hotboards_keypad.h
- Revision:
- 0:4ca112f96484
- Child:
- 2:e870110f753b
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Hotboards_keypad.h Tue Feb 09 03:25:28 2016 +0000 @@ -0,0 +1,135 @@ +/* +|| +|| @file Hotboards_Keypad.h +|| @version 3.2 +|| @ported by Diego (Hotboards) +|| This Keypad fork library allow to work with keyboard that +|| has physical pull-ups on columns (rather than rows) +|| +|| Keypad library originaly develop by: +|| @author Mark Stanley, Alexander Brevig +|| @contact mstanley@technologist.com, alexanderbrevig@gmail.com +|| +|| @description +|| | This library provides a simple interface for using matrix +|| | keypads. It supports multiple keypresses while maintaining +|| | backwards compatibility with the old single key library. +|| | It also supports user selectable pins and definable keymaps. +|| # +|| +|| @license +|| | This library is free software; you can redistribute it and/or +|| | modify it under the terms of the GNU Lesser General Public +|| | License as published by the Free Software Foundation; version +|| | 2.1 of the License. +|| | +|| | This library is distributed in the hope that it will be useful, +|| | but WITHOUT ANY WARRANTY; without even the implied warranty of +|| | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +|| | Lesser General Public License for more details. +|| | +|| | You should have received a copy of the GNU Lesser General Public +|| | License along with this library; if not, write to the Free Software +|| | Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +|| # +|| +*/ + +#ifndef KEYPAD_H +#define KEYPAD_H + +#include "Key.h" + + +#define OPEN 0 +#define CLOSED 1 + +typedef char KeypadEvent; +typedef unsigned int uint; +typedef unsigned long ulong; + +// Made changes according to this post http://arduino.cc/forum/index.php?topic=58337.0 +// by Nick Gammon. Thanks for the input Nick. It actually saved 78 bytes for me. :) +typedef struct { + uint8_t rows; + uint8_t columns; +} KeypadSize; + +#define LIST_MAX 10 // Max number of keys on the active list. +#define MAPSIZE 10 // MAPSIZE is the number of rows (times 16 columns) +#define makeKeymap(x) ((char*)x) + + +//class Keypad : public Key, public HAL_obj { +class Keypad : public Key { +public: + + Keypad(char *userKeymap, DigitalInOut *row, DigitalInOut *col, uint8_t numRows, uint8_t numCols); + + uint bitMap[MAPSIZE]; // 10 row x 16 column array of bits. Except Due which has 32 columns. + Key key[LIST_MAX]; + unsigned long holdTimer; + + char getKey(); + bool getKeys(); + KeyState getState(); + void begin(char *userKeymap); + bool isPressed(char keyChar); + void setDebounceTime(uint); + void setHoldTime(uint); + void addEventListener(void (*listener)(char)); + int findInList(char keyChar); + int findInList(int keyCode); + char waitForKey(); + bool keyStateChanged(); + uint8_t numKeys(); + +private: + unsigned long startTime; + char *keymap; + DigitalInOut *rowPins; + DigitalInOut *columnPins; + KeypadSize sizeKpd; + uint debounceTime; + uint holdTime; + bool single_key; + Timer debounce; + + void scanKeys(); + bool updateList(); + void nextKeyState(uint8_t n, bool button); + void transitionTo(uint8_t n, KeyState nextState); + void (*keypadEventListener)(char); +}; + +#endif + +/* +|| @changelog +|| | 3.1 2013-01-15 - Mark Stanley : Fixed missing RELEASED & IDLE status when using a single key. +|| | 3.0 2012-07-12 - Mark Stanley : Made library multi-keypress by default. (Backwards compatible) +|| | 3.0 2012-07-12 - Mark Stanley : Modified pin functions to support Keypad_I2C +|| | 3.0 2012-07-12 - Stanley & Young : Removed static variables. Fix for multiple keypad objects. +|| | 3.0 2012-07-12 - Mark Stanley : Fixed bug that caused shorted pins when pressing multiple keys. +|| | 2.0 2011-12-29 - Mark Stanley : Added waitForKey(). +|| | 2.0 2011-12-23 - Mark Stanley : Added the public function keyStateChanged(). +|| | 2.0 2011-12-23 - Mark Stanley : Added the private function scanKeys(). +|| | 2.0 2011-12-23 - Mark Stanley : Moved the Finite State Machine into the function getKeyState(). +|| | 2.0 2011-12-23 - Mark Stanley : Removed the member variable lastUdate. Not needed after rewrite. +|| | 1.8 2011-11-21 - Mark Stanley : Added test to determine which header file to compile, +|| | WProgram.h or Arduino.h. +|| | 1.8 2009-07-08 - Alexander Brevig : No longer uses arrays +|| | 1.7 2009-06-18 - Alexander Brevig : This library is a Finite State Machine every time a state changes +|| | the keypadEventListener will trigger, if set +|| | 1.7 2009-06-18 - Alexander Brevig : Added setDebounceTime setHoldTime specifies the amount of +|| | microseconds before a HOLD state triggers +|| | 1.7 2009-06-18 - Alexander Brevig : Added transitionTo +|| | 1.6 2009-06-15 - Alexander Brevig : Added getState() and state variable +|| | 1.5 2009-05-19 - Alexander Brevig : Added setHoldTime() +|| | 1.4 2009-05-15 - Alexander Brevig : Added addEventListener +|| | 1.3 2009-05-12 - Alexander Brevig : Added lastUdate, in order to do simple debouncing +|| | 1.2 2009-05-09 - Alexander Brevig : Changed getKey() +|| | 1.1 2009-04-28 - Alexander Brevig : Modified API, and made variables private +|| | 1.0 2007-XX-XX - Mark Stanley : Initial Release +|| # +*/ \ No newline at end of file