A library to control a 4x3 matrix style keypad.

Keypad

A basic library to read in pushbutton presses from the Sparkfun Keypad - 12 Button.

The product site and documentation for the keypad is here. https://www.sparkfun.com/products/8653

Keypad.cpp

Committer:
mitchpang
Date:
2015-03-11
Revision:
0:fef7520ff0a6

File content as of revision 0:fef7520ff0a6:

#include "Keypad.h"

#include "mbed.h"

// create a Keypad object
Keypad::Keypad(PinName row1, PinName row2, PinName row3, PinName row4, PinName col1, PinName col2, PinName col3)
    : rows (row1, row2, row3, row4),cols (col1, col2, col3)
{
}



int Keypad::getKey()
{
    //int row_hit = getRowHit(); // get row that was hit (1-4)
    //int col_hit = getColHit(); // get col that was hit (1-3)
    char key = decode();
    last_key_hit = key;
    return key;
}

int Keypad::isNewAndPressed() // Is the button a new button press?
{
    col_hit = getColHit();
    row_hit = getRowHit();
    char key = decode();
    if (key == last_key_hit) {
        // No new button has been hit
        return 0;
    } else if(key == ' ') { //button has been released
        last_key_hit = key;
        return 0;
    } else {
        return 1;
    }
}

//Private memeber function implementations below

void Keypad::tristate_all()
{
    // simulate tri-state by changing mode to PullNone
    rows.input();
    rows.mode(PullNone);
    cols.input();
    cols.mode(PullNone);
}

int Keypad::log2(int num)
{
    int count = -1;
    while(num > 0) {
        num = num >> 1;
        ++count;
    }
    return count;
}

char Keypad::decode()
{
    char dig = ' ';
    if (row_hit >= 0 && row_hit < 3 && col_hit != -1) {
        // output the character for buttons 1-9 pressed on the keypad
        int key_pressed = row_hit * 3 + col_hit + 1;
        dig = (char)(((int)'0')+key_pressed);
        return dig;
    } else if(row_hit == 3) { // the last row was hit
        switch(col_hit) {
            case 0 :
                dig = '*';
                break;
            case 1 :
                dig = '0';
                break;
            case 2 :
                dig = '#';
                break;
        }
    }
    return dig;
}

int Keypad::getRowHit()
{
    //Set cols to output and output HIGH, read rows for any inputs that are high.
    cols.output();
    rows.input();
    rows.mode(PullDown);
    wait_ms(100);
    cols = 0xF;
    int row_hit = rows.read();
    tristate_all();
    row_hit = log2(row_hit);
    return row_hit;
}

int Keypad::getColHit()
{
    //Set rows to output and output HIGH, read cols for any inputs that are high.
    rows.output();
    cols.input();
    cols.mode(PullDown);
    wait_ms(100); // Give time to set up pin modes
    rows = 0xF;
    int col_hit = cols.read();
    tristate_all();
    col_hit = log2(col_hit);
    return col_hit;
}