mBed + timer + keyboard + keypad
Dependencies: TextLCD keypad mbed
main.cpp@0:73f8ad8f29bb, 2014-09-28 (annotated)
- Committer:
- jatinsha
- Date:
- Sun Sep 28 03:30:04 2014 +0000
- Revision:
- 0:73f8ad8f29bb
- Child:
- 1:9b8e060faeab
keypad interfacing with mbed
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
jatinsha | 0:73f8ad8f29bb | 1 | /* |
jatinsha | 0:73f8ad8f29bb | 2 | CIS 541 - Embedded Systems for Life Critical Applications |
jatinsha | 0:73f8ad8f29bb | 3 | Assignment3 |
jatinsha | 0:73f8ad8f29bb | 4 | Timer using mBed 1768 + keypad |
jatinsha | 0:73f8ad8f29bb | 5 | |
jatinsha | 0:73f8ad8f29bb | 6 | Developers - Jatin Sharma and Samarth Shah |
jatinsha | 0:73f8ad8f29bb | 7 | |
jatinsha | 0:73f8ad8f29bb | 8 | References |
jatinsha | 0:73f8ad8f29bb | 9 | 1. Timer : http://mbed.org/handbook/Timer |
jatinsha | 0:73f8ad8f29bb | 10 | 2. String format modifiers : http://www.cdf.toronto.edu/~ajr/209/notes/printf.html |
jatinsha | 0:73f8ad8f29bb | 11 | 3. Keyboard Input : http://mbed.org/handbook/SerialPC |
jatinsha | 0:73f8ad8f29bb | 12 | 4. Interrupt attach : http://mbed.org/handbook/Serial |
jatinsha | 0:73f8ad8f29bb | 13 | 5. Enum tutorial : http://stackoverflow.com/questions/1102542/how-to-define-an-enumerated-type-enum-in-c |
jatinsha | 0:73f8ad8f29bb | 14 | 6. Keypad interfacing : http://mbed.org/users/yoonghm/code/keypad/docs/tip/ |
jatinsha | 0:73f8ad8f29bb | 15 | |
jatinsha | 0:73f8ad8f29bb | 16 | */ |
jatinsha | 0:73f8ad8f29bb | 17 | |
jatinsha | 0:73f8ad8f29bb | 18 | |
jatinsha | 0:73f8ad8f29bb | 19 | #include "mbed.h" |
jatinsha | 0:73f8ad8f29bb | 20 | #include "TextLCD.h" |
jatinsha | 0:73f8ad8f29bb | 21 | #include "Keypad.h" |
jatinsha | 0:73f8ad8f29bb | 22 | |
jatinsha | 0:73f8ad8f29bb | 23 | // RS, E, D4 - D7 for 4 bit mode |
jatinsha | 0:73f8ad8f29bb | 24 | #define RS p15 |
jatinsha | 0:73f8ad8f29bb | 25 | #define E p16 |
jatinsha | 0:73f8ad8f29bb | 26 | #define D4 p17 |
jatinsha | 0:73f8ad8f29bb | 27 | #define D5 p18 |
jatinsha | 0:73f8ad8f29bb | 28 | #define D6 p19 |
jatinsha | 0:73f8ad8f29bb | 29 | #define D7 p20 |
jatinsha | 0:73f8ad8f29bb | 30 | #define interval 10 |
jatinsha | 0:73f8ad8f29bb | 31 | |
jatinsha | 0:73f8ad8f29bb | 32 | TextLCD lcd(RS, E, D4, D5, D6, D7, TextLCD::LCD16x2); |
jatinsha | 0:73f8ad8f29bb | 33 | Timer timerDisplay, timerReference; |
jatinsha | 0:73f8ad8f29bb | 34 | Serial pc(USBTX, USBRX); // tx, rx |
jatinsha | 0:73f8ad8f29bb | 35 | |
jatinsha | 0:73f8ad8f29bb | 36 | |
jatinsha | 0:73f8ad8f29bb | 37 | int miliSeconds, centiSeconds, seconds, minutes; |
jatinsha | 0:73f8ad8f29bb | 38 | int currentReferenceTime, previousReferenceTime; |
jatinsha | 0:73f8ad8f29bb | 39 | int calculatedTimeInterval, referenceTimeInterval, runningError; |
jatinsha | 0:73f8ad8f29bb | 40 | char keyboardInput; |
jatinsha | 0:73f8ad8f29bb | 41 | int32_t Index = -1; // keypad state |
jatinsha | 0:73f8ad8f29bb | 42 | |
jatinsha | 0:73f8ad8f29bb | 43 | typedef enum {Running, Paused, Reset} state_t; |
jatinsha | 0:73f8ad8f29bb | 44 | state_t timerState = Reset; |
jatinsha | 0:73f8ad8f29bb | 45 | |
jatinsha | 0:73f8ad8f29bb | 46 | // Define your own keypad values |
jatinsha | 0:73f8ad8f29bb | 47 | // Define your own keypad values |
jatinsha | 0:73f8ad8f29bb | 48 | char Keytable[] = { '1', '2', '3', 'A', // r0 |
jatinsha | 0:73f8ad8f29bb | 49 | '4', '5', '6', 'B', // r1 |
jatinsha | 0:73f8ad8f29bb | 50 | '7', '8', '9', 'C', // r2 |
jatinsha | 0:73f8ad8f29bb | 51 | '*', '0', '#', 'D' // r3 |
jatinsha | 0:73f8ad8f29bb | 52 | }; |
jatinsha | 0:73f8ad8f29bb | 53 | // c0 c1 c2 c3 |
jatinsha | 0:73f8ad8f29bb | 54 | |
jatinsha | 0:73f8ad8f29bb | 55 | |
jatinsha | 0:73f8ad8f29bb | 56 | uint32_t cbAfterInput(uint32_t _index) |
jatinsha | 0:73f8ad8f29bb | 57 | { |
jatinsha | 0:73f8ad8f29bb | 58 | Index = _index; |
jatinsha | 0:73f8ad8f29bb | 59 | |
jatinsha | 0:73f8ad8f29bb | 60 | if (Index > -1) { |
jatinsha | 0:73f8ad8f29bb | 61 | lcd.locate(0,1); |
jatinsha | 0:73f8ad8f29bb | 62 | lcd.printf("Key:%c", Keytable[Index]); |
jatinsha | 0:73f8ad8f29bb | 63 | Index = -1; |
jatinsha | 0:73f8ad8f29bb | 64 | } |
jatinsha | 0:73f8ad8f29bb | 65 | |
jatinsha | 0:73f8ad8f29bb | 66 | return 0; |
jatinsha | 0:73f8ad8f29bb | 67 | } |
jatinsha | 0:73f8ad8f29bb | 68 | |
jatinsha | 0:73f8ad8f29bb | 69 | void callback() |
jatinsha | 0:73f8ad8f29bb | 70 | { |
jatinsha | 0:73f8ad8f29bb | 71 | // Keyboard input : you need to actually read from the serial to clear the RX interrupt |
jatinsha | 0:73f8ad8f29bb | 72 | if(keyboardInput = pc.getc()) |
jatinsha | 0:73f8ad8f29bb | 73 | { |
jatinsha | 0:73f8ad8f29bb | 74 | if((keyboardInput == 's' || keyboardInput == 'S')) |
jatinsha | 0:73f8ad8f29bb | 75 | { |
jatinsha | 0:73f8ad8f29bb | 76 | if(timerState == Reset) |
jatinsha | 0:73f8ad8f29bb | 77 | { |
jatinsha | 0:73f8ad8f29bb | 78 | timerReference.start(); |
jatinsha | 0:73f8ad8f29bb | 79 | timerDisplay.start(); |
jatinsha | 0:73f8ad8f29bb | 80 | timerState = Running; |
jatinsha | 0:73f8ad8f29bb | 81 | } |
jatinsha | 0:73f8ad8f29bb | 82 | } |
jatinsha | 0:73f8ad8f29bb | 83 | if((keyboardInput == 'p' || keyboardInput == 'P')) |
jatinsha | 0:73f8ad8f29bb | 84 | { |
jatinsha | 0:73f8ad8f29bb | 85 | if(timerState == Running) |
jatinsha | 0:73f8ad8f29bb | 86 | { |
jatinsha | 0:73f8ad8f29bb | 87 | timerReference.stop(); |
jatinsha | 0:73f8ad8f29bb | 88 | timerDisplay.stop(); |
jatinsha | 0:73f8ad8f29bb | 89 | timerState = Paused; |
jatinsha | 0:73f8ad8f29bb | 90 | } |
jatinsha | 0:73f8ad8f29bb | 91 | else if(timerState == Paused) |
jatinsha | 0:73f8ad8f29bb | 92 | { |
jatinsha | 0:73f8ad8f29bb | 93 | timerReference.start(); |
jatinsha | 0:73f8ad8f29bb | 94 | timerDisplay.start(); |
jatinsha | 0:73f8ad8f29bb | 95 | timerState = Running; |
jatinsha | 0:73f8ad8f29bb | 96 | } |
jatinsha | 0:73f8ad8f29bb | 97 | } |
jatinsha | 0:73f8ad8f29bb | 98 | if((keyboardInput == 'r' || keyboardInput == 'R')) |
jatinsha | 0:73f8ad8f29bb | 99 | { |
jatinsha | 0:73f8ad8f29bb | 100 | if(timerState == Paused) |
jatinsha | 0:73f8ad8f29bb | 101 | { |
jatinsha | 0:73f8ad8f29bb | 102 | // Reset timer |
jatinsha | 0:73f8ad8f29bb | 103 | timerReference.reset(); |
jatinsha | 0:73f8ad8f29bb | 104 | timerDisplay.reset(); |
jatinsha | 0:73f8ad8f29bb | 105 | timerState = Reset; |
jatinsha | 0:73f8ad8f29bb | 106 | |
jatinsha | 0:73f8ad8f29bb | 107 | // Reset variables |
jatinsha | 0:73f8ad8f29bb | 108 | miliSeconds = seconds = minutes = 0; |
jatinsha | 0:73f8ad8f29bb | 109 | currentReferenceTime = previousReferenceTime = 0; |
jatinsha | 0:73f8ad8f29bb | 110 | calculatedTimeInterval = referenceTimeInterval = runningError = 0; |
jatinsha | 0:73f8ad8f29bb | 111 | lcd.locate(0,0); |
jatinsha | 0:73f8ad8f29bb | 112 | lcd.printf("00:00:00"); |
jatinsha | 0:73f8ad8f29bb | 113 | lcd.locate(0,1); |
jatinsha | 0:73f8ad8f29bb | 114 | lcd.printf("000000"); |
jatinsha | 0:73f8ad8f29bb | 115 | } |
jatinsha | 0:73f8ad8f29bb | 116 | } |
jatinsha | 0:73f8ad8f29bb | 117 | } |
jatinsha | 0:73f8ad8f29bb | 118 | } |
jatinsha | 0:73f8ad8f29bb | 119 | |
jatinsha | 0:73f8ad8f29bb | 120 | int main() |
jatinsha | 0:73f8ad8f29bb | 121 | { |
jatinsha | 0:73f8ad8f29bb | 122 | // interrupt service routine |
jatinsha | 0:73f8ad8f29bb | 123 | pc.attach(&callback); |
jatinsha | 0:73f8ad8f29bb | 124 | // r0 r1 r2 r3 c0 c1 c2 c3 |
jatinsha | 0:73f8ad8f29bb | 125 | Keypad keypad(p21, p22, p23, p24, p25, p26, p27, p28); |
jatinsha | 0:73f8ad8f29bb | 126 | keypad.attach(&cbAfterInput); |
jatinsha | 0:73f8ad8f29bb | 127 | keypad.start(); // energize the columns c0-c3 of the keypad |
jatinsha | 0:73f8ad8f29bb | 128 | |
jatinsha | 0:73f8ad8f29bb | 129 | // local variable |
jatinsha | 0:73f8ad8f29bb | 130 | miliSeconds = seconds = minutes = 0; |
jatinsha | 0:73f8ad8f29bb | 131 | currentReferenceTime = previousReferenceTime = 0; |
jatinsha | 0:73f8ad8f29bb | 132 | calculatedTimeInterval = referenceTimeInterval = runningError = 0; |
jatinsha | 0:73f8ad8f29bb | 133 | //timerReference.start(); |
jatinsha | 0:73f8ad8f29bb | 134 | //timerDisplay.start(); |
jatinsha | 0:73f8ad8f29bb | 135 | |
jatinsha | 0:73f8ad8f29bb | 136 | // Initial display work |
jatinsha | 0:73f8ad8f29bb | 137 | lcd.locate(0,0); |
jatinsha | 0:73f8ad8f29bb | 138 | lcd.printf("00:00:00"); |
jatinsha | 0:73f8ad8f29bb | 139 | |
jatinsha | 0:73f8ad8f29bb | 140 | while(1) |
jatinsha | 0:73f8ad8f29bb | 141 | { |
jatinsha | 0:73f8ad8f29bb | 142 | if( timerDisplay.read_ms() >= interval) |
jatinsha | 0:73f8ad8f29bb | 143 | { |
jatinsha | 0:73f8ad8f29bb | 144 | timerDisplay.reset(); |
jatinsha | 0:73f8ad8f29bb | 145 | |
jatinsha | 0:73f8ad8f29bb | 146 | // Calculate display variables |
jatinsha | 0:73f8ad8f29bb | 147 | miliSeconds += interval; |
jatinsha | 0:73f8ad8f29bb | 148 | |
jatinsha | 0:73f8ad8f29bb | 149 | centiSeconds += (miliSeconds / 10); |
jatinsha | 0:73f8ad8f29bb | 150 | miliSeconds %= 10; |
jatinsha | 0:73f8ad8f29bb | 151 | |
jatinsha | 0:73f8ad8f29bb | 152 | seconds += (centiSeconds / 100); |
jatinsha | 0:73f8ad8f29bb | 153 | centiSeconds %= 100; |
jatinsha | 0:73f8ad8f29bb | 154 | |
jatinsha | 0:73f8ad8f29bb | 155 | minutes += (seconds / 60); |
jatinsha | 0:73f8ad8f29bb | 156 | seconds %= 60; |
jatinsha | 0:73f8ad8f29bb | 157 | |
jatinsha | 0:73f8ad8f29bb | 158 | // Error correction using referenceClock |
jatinsha | 0:73f8ad8f29bb | 159 | currentReferenceTime = timerReference.read_us(); |
jatinsha | 0:73f8ad8f29bb | 160 | referenceTimeInterval = currentReferenceTime - previousReferenceTime; |
jatinsha | 0:73f8ad8f29bb | 161 | runningError += (referenceTimeInterval - interval*1000); |
jatinsha | 0:73f8ad8f29bb | 162 | |
jatinsha | 0:73f8ad8f29bb | 163 | //miliSeconds += runningError; |
jatinsha | 0:73f8ad8f29bb | 164 | previousReferenceTime = currentReferenceTime; |
jatinsha | 0:73f8ad8f29bb | 165 | |
jatinsha | 0:73f8ad8f29bb | 166 | |
jatinsha | 0:73f8ad8f29bb | 167 | // Display time on LCD |
jatinsha | 0:73f8ad8f29bb | 168 | lcd.locate(0,0); |
jatinsha | 0:73f8ad8f29bb | 169 | lcd.printf("%02d:%02d:%02d",minutes, seconds, centiSeconds); |
jatinsha | 0:73f8ad8f29bb | 170 | |
jatinsha | 0:73f8ad8f29bb | 171 | lcd.locate(0,1); |
jatinsha | 0:73f8ad8f29bb | 172 | lcd.printf("%06d", runningError); |
jatinsha | 0:73f8ad8f29bb | 173 | } |
jatinsha | 0:73f8ad8f29bb | 174 | |
jatinsha | 0:73f8ad8f29bb | 175 | |
jatinsha | 0:73f8ad8f29bb | 176 | |
jatinsha | 0:73f8ad8f29bb | 177 | |
jatinsha | 0:73f8ad8f29bb | 178 | |
jatinsha | 0:73f8ad8f29bb | 179 | } |
jatinsha | 0:73f8ad8f29bb | 180 | |
jatinsha | 0:73f8ad8f29bb | 181 | } |