mBed + timer + keyboard + keypad

Dependencies:   TextLCD keypad mbed

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?

UserRevisionLine numberNew 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 }