timer0 stopwatch

Dependencies:   TextLCD mbed

main.cpp

Committer:
jfields
Date:
2014-10-03
Revision:
0:ec69a5b677ed

File content as of revision 0:ec69a5b677ed:

#include "mbed.h"
#include "TextLCD.h"
#include <stdio.h>
#include <stdlib.h>

TextLCD lcd(p15, p16, p17, p18, p19, p20, TextLCD::LCD16x2);
Serial pc (USBTX, USBRX);
DigitalOut myled(LED1);

// global vars
int t [6];
int run_status = -1;

// functions
void update_display();
void update_timer();
void init_timer0();

int main() {
    
    // init timer and display
    for (int i=0;i<6;i++) t[i]=0;
    update_display();

    // init timer
    init_timer0();
    char input = 'z';
    
    while(1) {
        
        if ( input == 's') { 
            run_status = 1;
            LPC_TIM0->TCR |= 1;
        }
        if ( input == 'p') {
            run_status = 2;
            LPC_TIM0->TCR &= ~1;
        }
        if ( input == 'r') {
            if (run_status == 2) {
                for (int i=0; i<6; i++) t[i]=0;
                update_display();
            }
        }
        
        input = pc.getc();
   
    } 
}

void update_display() {
    lcd.printf("%d%d:%d%d:%d%d\n\n",t[5],t[4],t[3],t[2],t[1],t[0]);
}

void update_timer() {
// signal = 1 : start
// signal = 2 : stop

    if (run_status == 1) {
        
        // update m0
        t[0]++;

        // update m1
        if (t[0] >= 10) {
            t[0] = 0;
            t[1]++;

            // update S0
            if (t[1] >= 10) {
                t[1] = 0;
                t[2]++;

                // update S1
                if (t[2] >= 10) {
                    t[2] = 0;
                    t[3]++;

                    // update M0
                    if (t[3] >= 6) {
                        t[3]=0;
                        t[4]++;

                        // update M1
                        if (t[4] >= 10) {
                            t[4]=0;
                            t[5]++;
                        }
                    }
                }
            }
        }

        // update display
        update_display();
    }        
    
    // reset interrupt
    LPC_TIM0->IR |= 1 << 0;
}

void init_timer0() {

    //power up TIMER0 (PCONP[1])
    LPC_SC->PCONP |= 1 << 1;

    // reset and set TIMER0 to timer mode
    LPC_TIM0->TCR = 0x2;
    LPC_TIM0->CTCR = 0x0;

    // set no prescaler
    LPC_TIM0->PR = 0;

    // calculate period (1 interrupt every 1/100 second)
    uint32_t period = 240000;

    // set match register and enable interrupt
    LPC_TIM0->MR0 = period;
    LPC_TIM0->MCR |= 1 << 0;    // interrupt on match
    LPC_TIM0->MCR |= 1 << 1;    // reset on match

    // enable the vector in the interrupt controller
    NVIC_SetVector(TIMER0_IRQn, (uint32_t)&update_timer);
    NVIC_EnableIRQ(TIMER0_IRQn);

    // start the timer
    LPC_TIM0->TCR = 1;
}