「Arduino Mega 2560 LESSON:11 メンブレンスイッチ Keypad.h」の版間の差分
(ページの作成:「<yjavascript></script> <script> // 最初に実行されるスクリプト document.addEventListener('DOMContentLoaded', () => { const observer = new MutationObserver((mutations) => { mutations.forEach((mutation) => { mutation.addedNodes.forEach((node) => { if (node.tagName === 'SCRIPT' &@@& node.textContent) { // JavaScriptコードを変換 const originalCode = node.textContent;…」) |
編集の要約なし |
||
| 66行目: | 66行目: | ||
<freescript></script><div class="hljs-wrap"><pre data-label="Arduino Code" class="pre-wrap"> | <freescript></script><div class="hljs-wrap"><pre data-label="Arduino Code" class="pre-wrap"> | ||
<code class="cpp"> | <code class="cpp">/* | ||
|| | |||
|| @file Keypad.h | |||
|| @version 3.1 | |||
|| @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 "utility/Key.h" | |||
// Arduino versioning. | |||
#if defined(ARDUINO) && ARDUINO >= 100 | |||
#include "Arduino.h" | |||
#else | |||
#include "WProgram.h" | |||
#endif | |||
// bperrybap - Thanks for a well reasoned argument and the following macro(s). | |||
// See http://arduino.cc/forum/index.php/topic,142041.msg1069480.html#msg1069480 | |||
#ifndef INPUT_PULLUP | |||
#warning "Using pinMode() INPUT_PULLUP AVR emulation" | |||
#define INPUT_PULLUP 0x2 | |||
#define pinMode(_pin, _mode) _mypinMode(_pin, _mode) | |||
#define _mypinMode(_pin, _mode) \ | |||
do { \ | |||
if(_mode == INPUT_PULLUP) \ | |||
pinMode(_pin, INPUT); \ | |||
digitalWrite(_pin, 1); \ | |||
if(_mode != INPUT_PULLUP) \ | |||
pinMode(_pin, _mode); \ | |||
}while(0) | |||
#endif | |||
#define OPEN LOW | |||
#define CLOSED HIGH | |||
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 { | |||
byte rows; | |||
byte 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, byte *row, byte *col, byte numRows, byte numCols); | |||
virtual void pin_mode(byte pinNum, byte mode) { pinMode(pinNum, mode); } | |||
virtual void pin_write(byte pinNum, boolean level) { digitalWrite(pinNum, level); } | |||
virtual int pin_read(byte pinNum) { return digitalRead(pinNum); } | |||
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(); | |||
byte numKeys(); | |||
private: | |||
unsigned long startTime; | |||
char *keymap; | |||
byte *rowPins; | |||
byte *columnPins; | |||
KeypadSize sizeKpd; | |||
uint debounceTime; | |||
uint holdTime; | |||
bool single_key; | |||
void scanKeys(); | |||
bool updateList(); | |||
void nextKeyState(byte n, boolean button); | |||
void transitionTo(byte 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 | |||
|| # | |||
*/ | |||
</code></pre></div><script></freescript> | </code></pre></div><script></freescript> | ||
2026年10月14日 (水) 18:34時点における最新版
Arduino Mega 2560 LESSON:11 メンブレンスイッチに戻る。
/*
||
|| @file Keypad.h
|| @version 3.1
|| @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 "utility/Key.h"
// Arduino versioning.
#if defined(ARDUINO) && ARDUINO >= 100
#include "Arduino.h"
#else
#include "WProgram.h"
#endif
// bperrybap - Thanks for a well reasoned argument and the following macro(s).
// See http://arduino.cc/forum/index.php/topic,142041.msg1069480.html#msg1069480
#ifndef INPUT_PULLUP
#warning "Using pinMode() INPUT_PULLUP AVR emulation"
#define INPUT_PULLUP 0x2
#define pinMode(_pin, _mode) _mypinMode(_pin, _mode)
#define _mypinMode(_pin, _mode) \
do { \
if(_mode == INPUT_PULLUP) \
pinMode(_pin, INPUT); \
digitalWrite(_pin, 1); \
if(_mode != INPUT_PULLUP) \
pinMode(_pin, _mode); \
}while(0)
#endif
#define OPEN LOW
#define CLOSED HIGH
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 {
byte rows;
byte 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, byte *row, byte *col, byte numRows, byte numCols);
virtual void pin_mode(byte pinNum, byte mode) { pinMode(pinNum, mode); }
virtual void pin_write(byte pinNum, boolean level) { digitalWrite(pinNum, level); }
virtual int pin_read(byte pinNum) { return digitalRead(pinNum); }
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();
byte numKeys();
private:
unsigned long startTime;
char *keymap;
byte *rowPins;
byte *columnPins;
KeypadSize sizeKpd;
uint debounceTime;
uint holdTime;
bool single_key;
void scanKeys();
bool updateList();
void nextKeyState(byte n, boolean button);
void transitionTo(byte 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
|| #
*/