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
- Committer:
- jatinsha
- Date:
- 2014-09-28
- Revision:
- 1:9b8e060faeab
- Parent:
- 0:73f8ad8f29bb
- Child:
- 2:0d5060721258
File content as of revision 1:9b8e060faeab:
/*
CIS 541 - Embedded Systems for Life Critical Applications
Assignment3
Timer using mBed 1768 + 4x4 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]);
if(Keytable[Index] == '*')
{
if(timerState == Reset)
{
timerReference.start();
timerDisplay.start();
timerState = Running;
}
else if(timerState == Paused)
{
timerReference.start();
timerDisplay.start();
timerState = Running;
}
}
if(Keytable[Index] == '0')
{
if(timerState == Running)
{
timerReference.stop();
timerDisplay.stop();
timerState = Paused;
}
}
if(Keytable[Index] == '#')
{
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");
}
}
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;
}
else if(timerState == Paused)
{
timerReference.start();
timerDisplay.start();
timerState = Running;
}
}
if((keyboardInput == 'p' || keyboardInput == 'P'))
{
if(timerState == Running)
{
timerReference.stop();
timerDisplay.stop();
timerState = Paused;
}
}
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);
}
}
}