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

Committer:
mitchpang
Date:
Wed Mar 11 14:50:03 2015 +0000
Revision:
0:fef7520ff0a6
test1

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mitchpang 0:fef7520ff0a6 1 #include "Keypad.h"
mitchpang 0:fef7520ff0a6 2
mitchpang 0:fef7520ff0a6 3 #include "mbed.h"
mitchpang 0:fef7520ff0a6 4
mitchpang 0:fef7520ff0a6 5 // create a Keypad object
mitchpang 0:fef7520ff0a6 6 Keypad::Keypad(PinName row1, PinName row2, PinName row3, PinName row4, PinName col1, PinName col2, PinName col3)
mitchpang 0:fef7520ff0a6 7 : rows (row1, row2, row3, row4),cols (col1, col2, col3)
mitchpang 0:fef7520ff0a6 8 {
mitchpang 0:fef7520ff0a6 9 }
mitchpang 0:fef7520ff0a6 10
mitchpang 0:fef7520ff0a6 11
mitchpang 0:fef7520ff0a6 12
mitchpang 0:fef7520ff0a6 13 int Keypad::getKey()
mitchpang 0:fef7520ff0a6 14 {
mitchpang 0:fef7520ff0a6 15 //int row_hit = getRowHit(); // get row that was hit (1-4)
mitchpang 0:fef7520ff0a6 16 //int col_hit = getColHit(); // get col that was hit (1-3)
mitchpang 0:fef7520ff0a6 17 char key = decode();
mitchpang 0:fef7520ff0a6 18 last_key_hit = key;
mitchpang 0:fef7520ff0a6 19 return key;
mitchpang 0:fef7520ff0a6 20 }
mitchpang 0:fef7520ff0a6 21
mitchpang 0:fef7520ff0a6 22 int Keypad::isNewAndPressed() // Is the button a new button press?
mitchpang 0:fef7520ff0a6 23 {
mitchpang 0:fef7520ff0a6 24 col_hit = getColHit();
mitchpang 0:fef7520ff0a6 25 row_hit = getRowHit();
mitchpang 0:fef7520ff0a6 26 char key = decode();
mitchpang 0:fef7520ff0a6 27 if (key == last_key_hit) {
mitchpang 0:fef7520ff0a6 28 // No new button has been hit
mitchpang 0:fef7520ff0a6 29 return 0;
mitchpang 0:fef7520ff0a6 30 } else if(key == ' ') { //button has been released
mitchpang 0:fef7520ff0a6 31 last_key_hit = key;
mitchpang 0:fef7520ff0a6 32 return 0;
mitchpang 0:fef7520ff0a6 33 } else {
mitchpang 0:fef7520ff0a6 34 return 1;
mitchpang 0:fef7520ff0a6 35 }
mitchpang 0:fef7520ff0a6 36 }
mitchpang 0:fef7520ff0a6 37
mitchpang 0:fef7520ff0a6 38 //Private memeber function implementations below
mitchpang 0:fef7520ff0a6 39
mitchpang 0:fef7520ff0a6 40 void Keypad::tristate_all()
mitchpang 0:fef7520ff0a6 41 {
mitchpang 0:fef7520ff0a6 42 // simulate tri-state by changing mode to PullNone
mitchpang 0:fef7520ff0a6 43 rows.input();
mitchpang 0:fef7520ff0a6 44 rows.mode(PullNone);
mitchpang 0:fef7520ff0a6 45 cols.input();
mitchpang 0:fef7520ff0a6 46 cols.mode(PullNone);
mitchpang 0:fef7520ff0a6 47 }
mitchpang 0:fef7520ff0a6 48
mitchpang 0:fef7520ff0a6 49 int Keypad::log2(int num)
mitchpang 0:fef7520ff0a6 50 {
mitchpang 0:fef7520ff0a6 51 int count = -1;
mitchpang 0:fef7520ff0a6 52 while(num > 0) {
mitchpang 0:fef7520ff0a6 53 num = num >> 1;
mitchpang 0:fef7520ff0a6 54 ++count;
mitchpang 0:fef7520ff0a6 55 }
mitchpang 0:fef7520ff0a6 56 return count;
mitchpang 0:fef7520ff0a6 57 }
mitchpang 0:fef7520ff0a6 58
mitchpang 0:fef7520ff0a6 59 char Keypad::decode()
mitchpang 0:fef7520ff0a6 60 {
mitchpang 0:fef7520ff0a6 61 char dig = ' ';
mitchpang 0:fef7520ff0a6 62 if (row_hit >= 0 && row_hit < 3 && col_hit != -1) {
mitchpang 0:fef7520ff0a6 63 // output the character for buttons 1-9 pressed on the keypad
mitchpang 0:fef7520ff0a6 64 int key_pressed = row_hit * 3 + col_hit + 1;
mitchpang 0:fef7520ff0a6 65 dig = (char)(((int)'0')+key_pressed);
mitchpang 0:fef7520ff0a6 66 return dig;
mitchpang 0:fef7520ff0a6 67 } else if(row_hit == 3) { // the last row was hit
mitchpang 0:fef7520ff0a6 68 switch(col_hit) {
mitchpang 0:fef7520ff0a6 69 case 0 :
mitchpang 0:fef7520ff0a6 70 dig = '*';
mitchpang 0:fef7520ff0a6 71 break;
mitchpang 0:fef7520ff0a6 72 case 1 :
mitchpang 0:fef7520ff0a6 73 dig = '0';
mitchpang 0:fef7520ff0a6 74 break;
mitchpang 0:fef7520ff0a6 75 case 2 :
mitchpang 0:fef7520ff0a6 76 dig = '#';
mitchpang 0:fef7520ff0a6 77 break;
mitchpang 0:fef7520ff0a6 78 }
mitchpang 0:fef7520ff0a6 79 }
mitchpang 0:fef7520ff0a6 80 return dig;
mitchpang 0:fef7520ff0a6 81 }
mitchpang 0:fef7520ff0a6 82
mitchpang 0:fef7520ff0a6 83 int Keypad::getRowHit()
mitchpang 0:fef7520ff0a6 84 {
mitchpang 0:fef7520ff0a6 85 //Set cols to output and output HIGH, read rows for any inputs that are high.
mitchpang 0:fef7520ff0a6 86 cols.output();
mitchpang 0:fef7520ff0a6 87 rows.input();
mitchpang 0:fef7520ff0a6 88 rows.mode(PullDown);
mitchpang 0:fef7520ff0a6 89 wait_ms(100);
mitchpang 0:fef7520ff0a6 90 cols = 0xF;
mitchpang 0:fef7520ff0a6 91 int row_hit = rows.read();
mitchpang 0:fef7520ff0a6 92 tristate_all();
mitchpang 0:fef7520ff0a6 93 row_hit = log2(row_hit);
mitchpang 0:fef7520ff0a6 94 return row_hit;
mitchpang 0:fef7520ff0a6 95 }
mitchpang 0:fef7520ff0a6 96
mitchpang 0:fef7520ff0a6 97 int Keypad::getColHit()
mitchpang 0:fef7520ff0a6 98 {
mitchpang 0:fef7520ff0a6 99 //Set rows to output and output HIGH, read cols for any inputs that are high.
mitchpang 0:fef7520ff0a6 100 rows.output();
mitchpang 0:fef7520ff0a6 101 cols.input();
mitchpang 0:fef7520ff0a6 102 cols.mode(PullDown);
mitchpang 0:fef7520ff0a6 103 wait_ms(100); // Give time to set up pin modes
mitchpang 0:fef7520ff0a6 104 rows = 0xF;
mitchpang 0:fef7520ff0a6 105 int col_hit = cols.read();
mitchpang 0:fef7520ff0a6 106 tristate_all();
mitchpang 0:fef7520ff0a6 107 col_hit = log2(col_hit);
mitchpang 0:fef7520ff0a6 108 return col_hit;
mitchpang 0:fef7520ff0a6 109 }