teclado lcd

Dependencies:   TextLCD keypad mbed

Committer:
serbm
Date:
Sat Feb 25 14:21:11 2017 +0000
Revision:
0:9a67044d749e
teclado con lcd

Who changed what in which revision?

UserRevisionLine numberNew contents of line
serbm 0:9a67044d749e 1 #include "keypad.h"
serbm 0:9a67044d749e 2
serbm 0:9a67044d749e 3 Keypad::Keypad(PinName row3, PinName row2, PinName row1, PinName row0,
serbm 0:9a67044d749e 4 PinName col3, PinName col2, PinName col1, PinName col0,
serbm 0:9a67044d749e 5 int debounce_ms):
serbm 0:9a67044d749e 6 _row0(row0), _row1(row1), _row2(row2), _row3(row3),
serbm 0:9a67044d749e 7 _cols(col0, col1, col2, col3)
serbm 0:9a67044d749e 8 {
serbm 0:9a67044d749e 9 _debounce = debounce_ms;
serbm 0:9a67044d749e 10 _rows[0] = &_row0;
serbm 0:9a67044d749e 11 _rows[1] = &_row1;
serbm 0:9a67044d749e 12 _rows[2] = &_row2;
serbm 0:9a67044d749e 13 _rows[3] = &_row3;
serbm 0:9a67044d749e 14 for (int r = 0; r < row_count; r++)
serbm 0:9a67044d749e 15 _rows[r]->mode(PullUp);
serbm 0:9a67044d749e 16 // _cols.mode(OpenDrain);
serbm 0:9a67044d749e 17 _cols.output();
serbm 0:9a67044d749e 18 }
serbm 0:9a67044d749e 19
serbm 0:9a67044d749e 20 void Keypad::_setupFallTrigger(void)
serbm 0:9a67044d749e 21 {
serbm 0:9a67044d749e 22 for (int r = 0; r < row_count; r++)
serbm 0:9a67044d749e 23 _rows[r]->fall(this, &Keypad::_callback);
serbm 0:9a67044d749e 24 }
serbm 0:9a67044d749e 25
serbm 0:9a67044d749e 26 void Keypad::Start(void)
serbm 0:9a67044d749e 27 {
serbm 0:9a67044d749e 28 /* make the columns zero so they can pull rows down */
serbm 0:9a67044d749e 29 _cols = 0x00;
serbm 0:9a67044d749e 30 }
serbm 0:9a67044d749e 31
serbm 0:9a67044d749e 32 void Keypad::Stop(void)
serbm 0:9a67044d749e 33 {
serbm 0:9a67044d749e 34 /* make the columns one so they cannot pull any rows down anymore */
serbm 0:9a67044d749e 35 _cols = ~0x00;
serbm 0:9a67044d749e 36 }
serbm 0:9a67044d749e 37
serbm 0:9a67044d749e 38 void Keypad::CallAfterInput(uint32_t (*fptr)(uint32_t index))
serbm 0:9a67044d749e 39 {
serbm 0:9a67044d749e 40 _input.attach(fptr);
serbm 0:9a67044d749e 41 _setupFallTrigger();
serbm 0:9a67044d749e 42 }
serbm 0:9a67044d749e 43
serbm 0:9a67044d749e 44 int Keypad::DebouncedScan()
serbm 0:9a67044d749e 45 {
serbm 0:9a67044d749e 46 /* debounce */
serbm 0:9a67044d749e 47 wait_ms(_debounce);
serbm 0:9a67044d749e 48
serbm 0:9a67044d749e 49 return Scan();
serbm 0:9a67044d749e 50 }
serbm 0:9a67044d749e 51
serbm 0:9a67044d749e 52 int Keypad::Scan()
serbm 0:9a67044d749e 53 {
serbm 0:9a67044d749e 54 /* lookup row */
serbm 0:9a67044d749e 55 int r = -1;
serbm 0:9a67044d749e 56 for (r = 0; r < row_count; r++) {
serbm 0:9a67044d749e 57 if (*_rows[r] == 0)
serbm 0:9a67044d749e 58 break;
serbm 0:9a67044d749e 59 }
serbm 0:9a67044d749e 60
serbm 0:9a67044d749e 61 /* if we didn't find a valid row, return */
serbm 0:9a67044d749e 62 if (!(0 <= r && r < row_count))
serbm 0:9a67044d749e 63 return -1;
serbm 0:9a67044d749e 64
serbm 0:9a67044d749e 65 /* scan columns to find out which one pulls down the row */
serbm 0:9a67044d749e 66 int c = -1;
serbm 0:9a67044d749e 67 for (c = 0; c < col_count; c++) {
serbm 0:9a67044d749e 68 _cols = ~(1 << c);
serbm 0:9a67044d749e 69 if (*_rows[r] == 0)
serbm 0:9a67044d749e 70 break;
serbm 0:9a67044d749e 71 }
serbm 0:9a67044d749e 72
serbm 0:9a67044d749e 73 /* re-energize all columns */
serbm 0:9a67044d749e 74 Start();
serbm 0:9a67044d749e 75
serbm 0:9a67044d749e 76 /* if we didn't find a valid column, return */
serbm 0:9a67044d749e 77 if (!(0 <= c && c < col_count))
serbm 0:9a67044d749e 78 return -1;
serbm 0:9a67044d749e 79
serbm 0:9a67044d749e 80 return r * col_count + c;
serbm 0:9a67044d749e 81 }
serbm 0:9a67044d749e 82
serbm 0:9a67044d749e 83 int Keypad::DebouncedScanMultiple()
serbm 0:9a67044d749e 84 {
serbm 0:9a67044d749e 85 /* debounce */
serbm 0:9a67044d749e 86 wait_ms(_debounce);
serbm 0:9a67044d749e 87
serbm 0:9a67044d749e 88 return ScanMultiple();
serbm 0:9a67044d749e 89 }
serbm 0:9a67044d749e 90
serbm 0:9a67044d749e 91 int Keypad::ScanMultiple()
serbm 0:9a67044d749e 92 {
serbm 0:9a67044d749e 93 int res = 0;
serbm 0:9a67044d749e 94 for (int c = 0; c < col_count; c++) {
serbm 0:9a67044d749e 95 _cols = ~(1 << c);
serbm 0:9a67044d749e 96 for (int r = 0; r < row_count; r++) {
serbm 0:9a67044d749e 97 if (*_rows[r] == 0) {
serbm 0:9a67044d749e 98 res |= 1 << (r * col_count + c);
serbm 0:9a67044d749e 99 }
serbm 0:9a67044d749e 100 }
serbm 0:9a67044d749e 101 }
serbm 0:9a67044d749e 102
serbm 0:9a67044d749e 103 return res;
serbm 0:9a67044d749e 104 }
serbm 0:9a67044d749e 105
serbm 0:9a67044d749e 106 void Keypad::_callback()
serbm 0:9a67044d749e 107 {
serbm 0:9a67044d749e 108 /* lookup */
serbm 0:9a67044d749e 109 int position = DebouncedScan();
serbm 0:9a67044d749e 110
serbm 0:9a67044d749e 111 /* call back a valid position */
serbm 0:9a67044d749e 112 if (position >= 0)
serbm 0:9a67044d749e 113 _input.call(position);
serbm 0:9a67044d749e 114 }
serbm 0:9a67044d749e 115