Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: TextLCD keypad mbed
main.cpp@2:0d5060721258, 2014-09-28 (annotated)
- Committer:
- jatinsha
- Date:
- Sun Sep 28 04:32:01 2014 +0000
- Revision:
- 2:0d5060721258
- Parent:
- 1:9b8e060faeab
c2
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 | 1:9b8e060faeab | 4 | Timer using mBed 1768 + 4x4 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 | 1:9b8e060faeab | 60 | if (Index > -1) | 
| jatinsha | 1:9b8e060faeab | 61 | { | 
| jatinsha | 1:9b8e060faeab | 62 | //lcd.locate(0,1); | 
| jatinsha | 1:9b8e060faeab | 63 | //lcd.printf("Key:%c", Keytable[Index]); | 
| jatinsha | 1:9b8e060faeab | 64 | |
| jatinsha | 1:9b8e060faeab | 65 | |
| jatinsha | 1:9b8e060faeab | 66 | if(Keytable[Index] == '*') | 
| jatinsha | 1:9b8e060faeab | 67 | { | 
| jatinsha | 1:9b8e060faeab | 68 | if(timerState == Reset) | 
| jatinsha | 1:9b8e060faeab | 69 | { | 
| jatinsha | 1:9b8e060faeab | 70 | timerReference.start(); | 
| jatinsha | 1:9b8e060faeab | 71 | timerDisplay.start(); | 
| jatinsha | 1:9b8e060faeab | 72 | timerState = Running; | 
| jatinsha | 1:9b8e060faeab | 73 | } | 
| jatinsha | 1:9b8e060faeab | 74 | else if(timerState == Paused) | 
| jatinsha | 1:9b8e060faeab | 75 | { | 
| jatinsha | 1:9b8e060faeab | 76 | timerReference.start(); | 
| jatinsha | 1:9b8e060faeab | 77 | timerDisplay.start(); | 
| jatinsha | 1:9b8e060faeab | 78 | timerState = Running; | 
| jatinsha | 1:9b8e060faeab | 79 | } | 
| jatinsha | 0:73f8ad8f29bb | 80 | } | 
| jatinsha | 1:9b8e060faeab | 81 | if(Keytable[Index] == '0') | 
| jatinsha | 1:9b8e060faeab | 82 | { | 
| jatinsha | 1:9b8e060faeab | 83 | if(timerState == Running) | 
| jatinsha | 1:9b8e060faeab | 84 | { | 
| jatinsha | 1:9b8e060faeab | 85 | timerReference.stop(); | 
| jatinsha | 1:9b8e060faeab | 86 | timerDisplay.stop(); | 
| jatinsha | 1:9b8e060faeab | 87 | timerState = Paused; | 
| jatinsha | 1:9b8e060faeab | 88 | } | 
| jatinsha | 1:9b8e060faeab | 89 | |
| jatinsha | 1:9b8e060faeab | 90 | } | 
| jatinsha | 1:9b8e060faeab | 91 | if(Keytable[Index] == '#') | 
| jatinsha | 1:9b8e060faeab | 92 | |
| jatinsha | 1:9b8e060faeab | 93 | { | 
| jatinsha | 1:9b8e060faeab | 94 | if(timerState == Paused) | 
| jatinsha | 1:9b8e060faeab | 95 | { | 
| jatinsha | 1:9b8e060faeab | 96 | // Reset timer | 
| jatinsha | 1:9b8e060faeab | 97 | timerReference.reset(); | 
| jatinsha | 1:9b8e060faeab | 98 | timerDisplay.reset(); | 
| jatinsha | 1:9b8e060faeab | 99 | timerState = Reset; | 
| jatinsha | 1:9b8e060faeab | 100 | |
| jatinsha | 1:9b8e060faeab | 101 | // Reset variables | 
| jatinsha | 1:9b8e060faeab | 102 | miliSeconds = seconds = minutes = 0; | 
| jatinsha | 1:9b8e060faeab | 103 | currentReferenceTime = previousReferenceTime = 0; | 
| jatinsha | 1:9b8e060faeab | 104 | calculatedTimeInterval = referenceTimeInterval = runningError = 0; | 
| jatinsha | 1:9b8e060faeab | 105 | lcd.locate(0,0); | 
| jatinsha | 1:9b8e060faeab | 106 | lcd.printf("00:00:00"); | 
| jatinsha | 2:0d5060721258 | 107 | //lcd.locate(0,1); | 
| jatinsha | 2:0d5060721258 | 108 | //lcd.printf("000000"); | 
| jatinsha | 1:9b8e060faeab | 109 | } | 
| jatinsha | 1:9b8e060faeab | 110 | } | 
| jatinsha | 1:9b8e060faeab | 111 | |
| jatinsha | 1:9b8e060faeab | 112 | Index = -1; | 
| jatinsha | 1:9b8e060faeab | 113 | } | 
| jatinsha | 0:73f8ad8f29bb | 114 | |
| jatinsha | 0:73f8ad8f29bb | 115 | return 0; | 
| jatinsha | 0:73f8ad8f29bb | 116 | } | 
| jatinsha | 0:73f8ad8f29bb | 117 | |
| jatinsha | 0:73f8ad8f29bb | 118 | void callback() | 
| jatinsha | 0:73f8ad8f29bb | 119 | { | 
| jatinsha | 0:73f8ad8f29bb | 120 | // Keyboard input : you need to actually read from the serial to clear the RX interrupt | 
| jatinsha | 0:73f8ad8f29bb | 121 | if(keyboardInput = pc.getc()) | 
| jatinsha | 0:73f8ad8f29bb | 122 | { | 
| jatinsha | 0:73f8ad8f29bb | 123 | if((keyboardInput == 's' || keyboardInput == 'S')) | 
| jatinsha | 0:73f8ad8f29bb | 124 | { | 
| jatinsha | 0:73f8ad8f29bb | 125 | if(timerState == Reset) | 
| jatinsha | 0:73f8ad8f29bb | 126 | { | 
| jatinsha | 0:73f8ad8f29bb | 127 | timerReference.start(); | 
| jatinsha | 0:73f8ad8f29bb | 128 | timerDisplay.start(); | 
| jatinsha | 0:73f8ad8f29bb | 129 | timerState = Running; | 
| jatinsha | 0:73f8ad8f29bb | 130 | } | 
| jatinsha | 1:9b8e060faeab | 131 | else if(timerState == Paused) | 
| jatinsha | 1:9b8e060faeab | 132 | { | 
| jatinsha | 1:9b8e060faeab | 133 | timerReference.start(); | 
| jatinsha | 1:9b8e060faeab | 134 | timerDisplay.start(); | 
| jatinsha | 1:9b8e060faeab | 135 | timerState = Running; | 
| jatinsha | 1:9b8e060faeab | 136 | } | 
| jatinsha | 0:73f8ad8f29bb | 137 | } | 
| jatinsha | 0:73f8ad8f29bb | 138 | if((keyboardInput == 'p' || keyboardInput == 'P')) | 
| jatinsha | 0:73f8ad8f29bb | 139 | { | 
| jatinsha | 0:73f8ad8f29bb | 140 | if(timerState == Running) | 
| jatinsha | 0:73f8ad8f29bb | 141 | { | 
| jatinsha | 0:73f8ad8f29bb | 142 | timerReference.stop(); | 
| jatinsha | 0:73f8ad8f29bb | 143 | timerDisplay.stop(); | 
| jatinsha | 0:73f8ad8f29bb | 144 | timerState = Paused; | 
| jatinsha | 0:73f8ad8f29bb | 145 | } | 
| jatinsha | 1:9b8e060faeab | 146 | |
| jatinsha | 0:73f8ad8f29bb | 147 | } | 
| jatinsha | 0:73f8ad8f29bb | 148 | if((keyboardInput == 'r' || keyboardInput == 'R')) | 
| jatinsha | 0:73f8ad8f29bb | 149 | { | 
| jatinsha | 0:73f8ad8f29bb | 150 | if(timerState == Paused) | 
| jatinsha | 0:73f8ad8f29bb | 151 | { | 
| jatinsha | 0:73f8ad8f29bb | 152 | // Reset timer | 
| jatinsha | 0:73f8ad8f29bb | 153 | timerReference.reset(); | 
| jatinsha | 0:73f8ad8f29bb | 154 | timerDisplay.reset(); | 
| jatinsha | 0:73f8ad8f29bb | 155 | timerState = Reset; | 
| jatinsha | 0:73f8ad8f29bb | 156 | |
| jatinsha | 0:73f8ad8f29bb | 157 | // Reset variables | 
| jatinsha | 0:73f8ad8f29bb | 158 | miliSeconds = seconds = minutes = 0; | 
| jatinsha | 0:73f8ad8f29bb | 159 | currentReferenceTime = previousReferenceTime = 0; | 
| jatinsha | 0:73f8ad8f29bb | 160 | calculatedTimeInterval = referenceTimeInterval = runningError = 0; | 
| jatinsha | 0:73f8ad8f29bb | 161 | lcd.locate(0,0); | 
| jatinsha | 0:73f8ad8f29bb | 162 | lcd.printf("00:00:00"); | 
| jatinsha | 2:0d5060721258 | 163 | //lcd.locate(0,1); | 
| jatinsha | 2:0d5060721258 | 164 | //lcd.printf("000000"); | 
| jatinsha | 0:73f8ad8f29bb | 165 | } | 
| jatinsha | 0:73f8ad8f29bb | 166 | } | 
| jatinsha | 0:73f8ad8f29bb | 167 | } | 
| jatinsha | 0:73f8ad8f29bb | 168 | } | 
| jatinsha | 0:73f8ad8f29bb | 169 | |
| jatinsha | 0:73f8ad8f29bb | 170 | int main() | 
| jatinsha | 0:73f8ad8f29bb | 171 | { | 
| jatinsha | 0:73f8ad8f29bb | 172 | // interrupt service routine | 
| jatinsha | 0:73f8ad8f29bb | 173 | pc.attach(&callback); | 
| jatinsha | 0:73f8ad8f29bb | 174 | // r0 r1 r2 r3 c0 c1 c2 c3 | 
| jatinsha | 0:73f8ad8f29bb | 175 | Keypad keypad(p21, p22, p23, p24, p25, p26, p27, p28); | 
| jatinsha | 0:73f8ad8f29bb | 176 | keypad.attach(&cbAfterInput); | 
| jatinsha | 0:73f8ad8f29bb | 177 | keypad.start(); // energize the columns c0-c3 of the keypad | 
| jatinsha | 0:73f8ad8f29bb | 178 | |
| jatinsha | 0:73f8ad8f29bb | 179 | // local variable | 
| jatinsha | 0:73f8ad8f29bb | 180 | miliSeconds = seconds = minutes = 0; | 
| jatinsha | 0:73f8ad8f29bb | 181 | currentReferenceTime = previousReferenceTime = 0; | 
| jatinsha | 0:73f8ad8f29bb | 182 | calculatedTimeInterval = referenceTimeInterval = runningError = 0; | 
| jatinsha | 0:73f8ad8f29bb | 183 | //timerReference.start(); | 
| jatinsha | 0:73f8ad8f29bb | 184 | //timerDisplay.start(); | 
| jatinsha | 0:73f8ad8f29bb | 185 | |
| jatinsha | 0:73f8ad8f29bb | 186 | // Initial display work | 
| jatinsha | 0:73f8ad8f29bb | 187 | lcd.locate(0,0); | 
| jatinsha | 0:73f8ad8f29bb | 188 | lcd.printf("00:00:00"); | 
| jatinsha | 0:73f8ad8f29bb | 189 | |
| jatinsha | 0:73f8ad8f29bb | 190 | while(1) | 
| jatinsha | 0:73f8ad8f29bb | 191 | { | 
| jatinsha | 0:73f8ad8f29bb | 192 | if( timerDisplay.read_ms() >= interval) | 
| jatinsha | 0:73f8ad8f29bb | 193 | { | 
| jatinsha | 0:73f8ad8f29bb | 194 | timerDisplay.reset(); | 
| jatinsha | 0:73f8ad8f29bb | 195 | |
| jatinsha | 0:73f8ad8f29bb | 196 | // Calculate display variables | 
| jatinsha | 0:73f8ad8f29bb | 197 | miliSeconds += interval; | 
| jatinsha | 0:73f8ad8f29bb | 198 | |
| jatinsha | 0:73f8ad8f29bb | 199 | centiSeconds += (miliSeconds / 10); | 
| jatinsha | 0:73f8ad8f29bb | 200 | miliSeconds %= 10; | 
| jatinsha | 0:73f8ad8f29bb | 201 | |
| jatinsha | 0:73f8ad8f29bb | 202 | seconds += (centiSeconds / 100); | 
| jatinsha | 0:73f8ad8f29bb | 203 | centiSeconds %= 100; | 
| jatinsha | 0:73f8ad8f29bb | 204 | |
| jatinsha | 0:73f8ad8f29bb | 205 | minutes += (seconds / 60); | 
| jatinsha | 0:73f8ad8f29bb | 206 | seconds %= 60; | 
| jatinsha | 0:73f8ad8f29bb | 207 | |
| jatinsha | 0:73f8ad8f29bb | 208 | // Error correction using referenceClock | 
| jatinsha | 0:73f8ad8f29bb | 209 | currentReferenceTime = timerReference.read_us(); | 
| jatinsha | 0:73f8ad8f29bb | 210 | referenceTimeInterval = currentReferenceTime - previousReferenceTime; | 
| jatinsha | 0:73f8ad8f29bb | 211 | runningError += (referenceTimeInterval - interval*1000); | 
| jatinsha | 0:73f8ad8f29bb | 212 | |
| jatinsha | 0:73f8ad8f29bb | 213 | //miliSeconds += runningError; | 
| jatinsha | 0:73f8ad8f29bb | 214 | previousReferenceTime = currentReferenceTime; | 
| jatinsha | 0:73f8ad8f29bb | 215 | |
| jatinsha | 0:73f8ad8f29bb | 216 | |
| jatinsha | 0:73f8ad8f29bb | 217 | // Display time on LCD | 
| jatinsha | 0:73f8ad8f29bb | 218 | lcd.locate(0,0); | 
| jatinsha | 0:73f8ad8f29bb | 219 | lcd.printf("%02d:%02d:%02d",minutes, seconds, centiSeconds); | 
| jatinsha | 0:73f8ad8f29bb | 220 | |
| jatinsha | 2:0d5060721258 | 221 | //lcd.locate(0,1); | 
| jatinsha | 2:0d5060721258 | 222 | //lcd.printf("%06d", runningError); | 
| jatinsha | 0:73f8ad8f29bb | 223 | } | 
| jatinsha | 0:73f8ad8f29bb | 224 | |
| jatinsha | 0:73f8ad8f29bb | 225 | |
| jatinsha | 0:73f8ad8f29bb | 226 | |
| jatinsha | 0:73f8ad8f29bb | 227 | |
| jatinsha | 0:73f8ad8f29bb | 228 | |
| jatinsha | 0:73f8ad8f29bb | 229 | } | 
| jatinsha | 0:73f8ad8f29bb | 230 | |
| jatinsha | 0:73f8ad8f29bb | 231 | } |