Fork without short circuits

Dependents:   SaveKeypad

Fork of keypad by HM Yoong

No extra hardware is needed besides the wires and switches. The columns are outputs configured with open drain. The rows are inputs configured with pull up resistors. A key press pulls down its row. With scanning the column is determined thereafter.

See SaveKeypad for an example usage.

Revision:
10:9a9ec143840b
Parent:
0:2df66331c109
Child:
11:a45e64141ce6
--- a/keypad.cpp	Tue Jan 31 00:31:58 2012 +0000
+++ b/keypad.cpp	Fri Nov 02 22:42:28 2012 +0000
@@ -3,39 +3,50 @@
 Keypad::Keypad(PinName row3, PinName row2, PinName row1, PinName row0,
                PinName col3, PinName col2, PinName col1, PinName col0,
                int debounce_ms):
-        _row0(row0), _row1(row1), _row2(row2), _row3(row3),
-        _cols(col0, col1, col2, col3) {
+    _row0(row0), _row1(row1), _row2(row2), _row3(row3),
+    _cols(col0, col1, col2, col3)
+{
     _debounce = debounce_ms;
-    _setupRiseTrigger();
+    _row0.mode(PullUp);
+    _row1.mode(PullUp);
+    _row2.mode(PullUp);
+    _row3.mode(PullUp);
+    _cols.mode(OpenDrain);
+    _cols.output();
+    _setupFallTrigger();
 }
 
-void Keypad::Start(void) {
-    _cols = 0x0F;
-}
-
-void Keypad::Stop(void) {
+void Keypad::Start(void)
+{
     _cols = 0x00;
 }
 
-void Keypad::CallAfterInput(uint32_t (*fptr)(uint32_t index)) {
+void Keypad::Stop(void)
+{
+    _cols = 0x0F;
+}
+
+void Keypad::CallAfterInput(uint32_t (*fptr)(uint32_t index))
+{
     _input.attach(fptr);
 }
 
-void Keypad::_callback(int row, InterruptIn &therow) {
+void Keypad::_callback(int row, InterruptIn &therow)
+{
     wait_ms(_debounce);
-    if (therow != 1)
+    if (therow != 0)
         return;
 
     int c = -1;
-    _cols = _cols & 0x0E;
+    _cols = 0x0E;
     if (therow == 0)
         c = 0;
     else {
-        _cols = _cols & 0x0D;
+        _cols = 0x0D;
         if (therow == 0)
             c = 1;
         else {
-            _cols = _cols & 0x0B;
+            _cols = 0x0B;
             if (therow == 0)
                 c = 2;
             else
@@ -46,22 +57,27 @@
     Start(); // Re-energize all columns
 }
 
-void Keypad::_cbRow0Rise(void) {
+void Keypad::_cbRow0Fall(void)
+{
     _callback(0, _row0);
 }
-void Keypad::_cbRow1Rise(void) {
+void Keypad::_cbRow1Fall(void)
+{
     _callback(1, _row1);
 }
-void Keypad::_cbRow2Rise(void) {
+void Keypad::_cbRow2Fall(void)
+{
     _callback(2, _row2);
 }
-void Keypad::_cbRow3Rise(void) {
+void Keypad::_cbRow3Fall(void)
+{
     _callback(3, _row3);
 }
 
-void Keypad::_setupRiseTrigger(void) {
-    _row0.rise(this, &Keypad::_cbRow0Rise);
-    _row1.rise(this, &Keypad::_cbRow1Rise);
-    _row2.rise(this, &Keypad::_cbRow2Rise);
-    _row3.rise(this, &Keypad::_cbRow3Rise);
-}
\ No newline at end of file
+void Keypad::_setupFallTrigger(void)
+{
+    _row0.fall(this, &Keypad::_cbRow0Fall);
+    _row1.fall(this, &Keypad::_cbRow1Fall);
+    _row2.fall(this, &Keypad::_cbRow2Fall);
+    _row3.fall(this, &Keypad::_cbRow3Fall);
+}