driver to control n by m matrix keyboard with external pull-ups on columns
Dependents: LoopCounter HelloKeypad MultiKey EventKeypad ... more
Diff: Hotboards_keypad.cpp
- Revision:
- 2:e870110f753b
- Parent:
- 1:975a5c527e8e
diff -r 975a5c527e8e -r e870110f753b Hotboards_keypad.cpp
--- a/Hotboards_keypad.cpp Wed Feb 17 01:58:30 2016 +0000
+++ b/Hotboards_keypad.cpp Fri Mar 04 02:37:55 2016 +0000
@@ -36,6 +36,9 @@
*/
#include "Hotboards_keypad.h"
+#define bitRead( var, bit ) (((var) >> (bit)) & 0x01)
+#define bitWrite( var, bit, val ) (val) ? (var) |= (1<<(bit)) : (var) &= ~(1<<(bit))
+
// <<constructor>> Allows custom keymap, pin configuration, and keypad sizes.
Keypad::Keypad(char *userKeymap, DigitalInOut *row, DigitalInOut *col, uint8_t numRows, uint8_t numCols) {
rowPins = row;
@@ -88,20 +91,19 @@
// Private : Hardware scan
void Keypad::scanKeys() {
// Re-intialize the row pins. Allows sharing these pins with other hardware.
- for (uint8_t r=0; r<sizeKpd.columns; r++) {
- columnPins[r].input();
+ for (uint8_t c=0; c<sizeKpd.columns; c++) {
+ columnPins[c].input();
}
// bitMap stores ALL the keys that are being pressed.
for (uint8_t r=0; r<sizeKpd.rows; r++) {
rowPins[r].output();
- rowPins[r] = 0; // Begin column pulse output.
+ rowPins[r].write( 0 ); // Begin column pulse output.
for (uint8_t c=0; c<sizeKpd.columns; c++) {
- if(!columnPins[c]) bitMap[c] |= ( 1<< r );
- //bitWrite(bitMap[c], r, !digitalRead(columnPins[c])); // keypress is active low so invert to high.
+ bitWrite(bitMap[c], r, !columnPins[c].read()); // keypress is active low so invert to high.
}
// Set pin to high impedance input. Effectively ends column pulse.
- rowPins[r] = 1;
+ rowPins[r].write( 1 );
rowPins[r].input();
}
}
@@ -123,7 +125,7 @@
// Add new keys to empty slots in the key list.
for (uint8_t c=0; c<sizeKpd.columns; c++) {
for (uint8_t r=0; r<sizeKpd.rows; r++) {
- bool button = (bitMap[r] >> c) & 0x01; //bitRead(bitMap[r],c);
+ bool button = bitRead(bitMap[r],c);
char keyChar = keymap[c * sizeKpd.rows + r];
int keyCode = r * sizeKpd.columns + c;
int idx = findInList (keyCode);
Hotboards KeyPad