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.

keypad.cpp

Committer:
gj_schoneveld
Date:
2012-11-02
Revision:
10:9a9ec143840b
Parent:
0:2df66331c109
Child:
11:a45e64141ce6

File content as of revision 10:9a9ec143840b:

#include "keypad.h"

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)
{
    _debounce = debounce_ms;
    _row0.mode(PullUp);
    _row1.mode(PullUp);
    _row2.mode(PullUp);
    _row3.mode(PullUp);
    _cols.mode(OpenDrain);
    _cols.output();
    _setupFallTrigger();
}

void Keypad::Start(void)
{
    _cols = 0x00;
}

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)
{
    wait_ms(_debounce);
    if (therow != 0)
        return;

    int c = -1;
    _cols = 0x0E;
    if (therow == 0)
        c = 0;
    else {
        _cols = 0x0D;
        if (therow == 0)
            c = 1;
        else {
            _cols = 0x0B;
            if (therow == 0)
                c = 2;
            else
                c = 3;
        }
    }
    _input.call(row * 4 + c);
    Start(); // Re-energize all columns
}

void Keypad::_cbRow0Fall(void)
{
    _callback(0, _row0);
}
void Keypad::_cbRow1Fall(void)
{
    _callback(1, _row1);
}
void Keypad::_cbRow2Fall(void)
{
    _callback(2, _row2);
}
void Keypad::_cbRow3Fall(void)
{
    _callback(3, _row3);
}

void Keypad::_setupFallTrigger(void)
{
    _row0.fall(this, &Keypad::_cbRow0Fall);
    _row1.fall(this, &Keypad::_cbRow1Fall);
    _row2.fall(this, &Keypad::_cbRow2Fall);
    _row3.fall(this, &Keypad::_cbRow3Fall);
}