teclado lcd
Dependencies: TextLCD keypad mbed
keypad.cpp@0:9a67044d749e, 2017-02-25 (annotated)
- Committer:
- serbm
- Date:
- Sat Feb 25 14:21:11 2017 +0000
- Revision:
- 0:9a67044d749e
teclado con lcd
Who changed what in which revision?
User | Revision | Line number | New 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 |