An interrupt-driven interface to 4x4 keypad.

Dependents:   FYPFinalProgram FYPFinalizeProgram KEYS Proyect_Patric_electronic_door_MSC_Ok_ESP ... more

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers Keypad.cpp Source File

Keypad.cpp

00001 #include "Keypad.h"
00002 
00003 extern Serial PC;
00004 
00005 void Keypad::_cbRow0Rise()
00006 {
00007     _checkIndex(0, _rows[0]);
00008 }
00009 
00010 void Keypad::_cbRow1Rise()
00011 {
00012     _checkIndex(1, _rows[1]);
00013 }
00014 
00015 void Keypad::_cbRow2Rise()
00016 {
00017     _checkIndex(2, _rows[2]);
00018 }
00019 
00020 void Keypad::_cbRow3Rise()
00021 {
00022     _checkIndex(3, _rows[3]);
00023 }
00024 
00025 void
00026 Keypad::_setupRiseTrigger
00027 (
00028 )
00029 {
00030     if (_rows[0]) {
00031         _rows[0]->rise(this, &Keypad::_cbRow0Rise);
00032     }
00033 
00034     if (_rows[1]) {
00035         _rows[1]->rise(this, &Keypad::_cbRow1Rise);
00036     }
00037 
00038     if (_rows[2]) {
00039         _rows[2]->rise(this, &Keypad::_cbRow2Rise);
00040     }
00041 
00042     if (_rows[3]) {
00043         _rows[3]->rise(this, &Keypad::_cbRow3Rise);
00044     }
00045 }
00046 
00047 
00048 Keypad::Keypad
00049 (PinName      r0
00050 ,PinName      r1
00051 ,PinName      r2
00052 ,PinName      r3
00053 ,PinName      c0
00054 ,PinName      c1
00055 ,PinName      c2
00056 ,PinName      c3
00057 ,int          debounce_ms
00058 )
00059 {
00060     PinName rPins[4] = {r0, r1, r2, r3};
00061     PinName cPins[4] = {c0, c1, c2, c3};
00062 
00063     for (int i = 0; i < 4; i++) {
00064         _rows[i] = NULL;
00065         _cols[i] = NULL;
00066     }
00067     
00068     _nRow = 0;
00069     for (int i = 0; i < 4; i++) {
00070         if (rPins[i] != NC) {
00071             _rows[i] = new InterruptIn(rPins[i]);
00072             _nRow++;
00073         } else
00074             break;
00075     }
00076     _setupRiseTrigger();
00077     
00078     _nCol = 0;
00079     for (int i = 0; i < 4; i++) {
00080         if (cPins[i] != NC) {
00081             _cols[i] = new DigitalOut(cPins[i]);
00082             _nCol++;
00083         } else
00084             break;
00085     }
00086 
00087     _debounce = debounce_ms; 
00088 }
00089 
00090 Keypad::~Keypad
00091 ()
00092 {
00093     for (int i = 0; i < 4; i++) {
00094         if (_rows[i] != 0)
00095             delete _rows[i];
00096     }
00097 
00098     for (int i = 0; i < 4; i++) {
00099         if (_cols[i] != 0)
00100             delete _cols[i];
00101     }
00102 }
00103 
00104 void
00105 Keypad::start
00106 (
00107 )
00108 {
00109     for (int i = 0; i < _nCol; i++)
00110         _cols[i]->write(1);
00111 }
00112 
00113 void
00114 Keypad::stop
00115 (
00116 )
00117 {
00118     for (int i = 0; i < _nCol; i++)
00119         _cols[i++]->write(0);
00120 }
00121 
00122 void
00123 Keypad::attach
00124 (uint32_t     (*fptr)(uint32_t index)
00125 )
00126 {
00127     _callback.attach(fptr);
00128 }
00129 
00130 void
00131 Keypad::_checkIndex
00132 (int          row
00133 ,InterruptIn *therow
00134 )
00135 {
00136 #ifdef THREAD_H
00137     Thread::wait(_debounce);
00138 #else
00139     wait_ms(_debounce);
00140 #endif
00141 
00142     if (therow->read() == 0)
00143         return;
00144 
00145     int c;
00146     for (c = 0; c < _nCol; c++) {
00147         _cols[c]->write(0); // de-energize the column
00148         if (therow->read() == 0) {
00149             break;
00150         }
00151     }
00152     
00153     int index = row * _nCol + c;
00154     _callback.call(index);
00155     start(); // Re-energize all columns
00156 }
00157