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@0:fef7520ff0a6, 2015-03-11 (annotated)
- Committer:
- mitchpang
- Date:
- Wed Mar 11 14:50:03 2015 +0000
- Revision:
- 0:fef7520ff0a6
test1
Who changed what in which revision?
User | Revision | Line number | New 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 | } |