mBed + timer + keyboard + keypad
Dependencies: TextLCD keypad mbed
Diff: main.cpp
- Revision:
- 0:73f8ad8f29bb
- Child:
- 1:9b8e060faeab
diff -r 000000000000 -r 73f8ad8f29bb main.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Sun Sep 28 03:30:04 2014 +0000 @@ -0,0 +1,181 @@ +/* +CIS 541 - Embedded Systems for Life Critical Applications +Assignment3 +Timer using mBed 1768 + keypad + +Developers - Jatin Sharma and Samarth Shah + +References +1. Timer : http://mbed.org/handbook/Timer +2. String format modifiers : http://www.cdf.toronto.edu/~ajr/209/notes/printf.html +3. Keyboard Input : http://mbed.org/handbook/SerialPC +4. Interrupt attach : http://mbed.org/handbook/Serial +5. Enum tutorial : http://stackoverflow.com/questions/1102542/how-to-define-an-enumerated-type-enum-in-c +6. Keypad interfacing : http://mbed.org/users/yoonghm/code/keypad/docs/tip/ + +*/ + + +#include "mbed.h" +#include "TextLCD.h" +#include "Keypad.h" + +// RS, E, D4 - D7 for 4 bit mode +#define RS p15 +#define E p16 +#define D4 p17 +#define D5 p18 +#define D6 p19 +#define D7 p20 +#define interval 10 + +TextLCD lcd(RS, E, D4, D5, D6, D7, TextLCD::LCD16x2); +Timer timerDisplay, timerReference; +Serial pc(USBTX, USBRX); // tx, rx + + +int miliSeconds, centiSeconds, seconds, minutes; +int currentReferenceTime, previousReferenceTime; +int calculatedTimeInterval, referenceTimeInterval, runningError; +char keyboardInput; +int32_t Index = -1; // keypad state + +typedef enum {Running, Paused, Reset} state_t; +state_t timerState = Reset; + +// Define your own keypad values +// Define your own keypad values + char Keytable[] = { '1', '2', '3', 'A', // r0 + '4', '5', '6', 'B', // r1 + '7', '8', '9', 'C', // r2 + '*', '0', '#', 'D' // r3 + }; + // c0 c1 c2 c3 + + +uint32_t cbAfterInput(uint32_t _index) +{ + Index = _index; + + if (Index > -1) { + lcd.locate(0,1); + lcd.printf("Key:%c", Keytable[Index]); + Index = -1; + } + + return 0; +} + +void callback() +{ + // Keyboard input : you need to actually read from the serial to clear the RX interrupt + if(keyboardInput = pc.getc()) + { + if((keyboardInput == 's' || keyboardInput == 'S')) + { + if(timerState == Reset) + { + timerReference.start(); + timerDisplay.start(); + timerState = Running; + } + } + if((keyboardInput == 'p' || keyboardInput == 'P')) + { + if(timerState == Running) + { + timerReference.stop(); + timerDisplay.stop(); + timerState = Paused; + } + else if(timerState == Paused) + { + timerReference.start(); + timerDisplay.start(); + timerState = Running; + } + } + if((keyboardInput == 'r' || keyboardInput == 'R')) + { + if(timerState == Paused) + { + // Reset timer + timerReference.reset(); + timerDisplay.reset(); + timerState = Reset; + + // Reset variables + miliSeconds = seconds = minutes = 0; + currentReferenceTime = previousReferenceTime = 0; + calculatedTimeInterval = referenceTimeInterval = runningError = 0; + lcd.locate(0,0); + lcd.printf("00:00:00"); + lcd.locate(0,1); + lcd.printf("000000"); + } + } + } +} + +int main() +{ + // interrupt service routine + pc.attach(&callback); + // r0 r1 r2 r3 c0 c1 c2 c3 + Keypad keypad(p21, p22, p23, p24, p25, p26, p27, p28); + keypad.attach(&cbAfterInput); + keypad.start(); // energize the columns c0-c3 of the keypad + + // local variable + miliSeconds = seconds = minutes = 0; + currentReferenceTime = previousReferenceTime = 0; + calculatedTimeInterval = referenceTimeInterval = runningError = 0; + //timerReference.start(); + //timerDisplay.start(); + + // Initial display work + lcd.locate(0,0); + lcd.printf("00:00:00"); + + while(1) + { + if( timerDisplay.read_ms() >= interval) + { + timerDisplay.reset(); + + // Calculate display variables + miliSeconds += interval; + + centiSeconds += (miliSeconds / 10); + miliSeconds %= 10; + + seconds += (centiSeconds / 100); + centiSeconds %= 100; + + minutes += (seconds / 60); + seconds %= 60; + + // Error correction using referenceClock + currentReferenceTime = timerReference.read_us(); + referenceTimeInterval = currentReferenceTime - previousReferenceTime; + runningError += (referenceTimeInterval - interval*1000); + + //miliSeconds += runningError; + previousReferenceTime = currentReferenceTime; + + + // Display time on LCD + lcd.locate(0,0); + lcd.printf("%02d:%02d:%02d",minutes, seconds, centiSeconds); + + lcd.locate(0,1); + lcd.printf("%06d", runningError); + } + + + + + + } + +}