Dependencies:   mbed

stopwatch_2016.cpp

Committer:
martwerl
Date:
2018-11-15
Revision:
0:3b4026dea19d

File content as of revision 0:3b4026dea19d:

// Stopuhr: min:sec:hsec am LCD
// Start: Joystick Up
// Stopp: Joystick Down
// Reset: Joystick  Center (sets value to 0 and retarts ..)

#include "mbed.h"
#include "C12832_lcd.h"

InterruptIn iiUp(p15);
DigitalIn diUp(p15);
InterruptIn iiDown(p12);
DigitalIn diDown(p12);
InterruptIn iiCenter(p14);
DigitalIn diCenter(p14);
Ticker myTimer;
uint32_t hSec;
bool runFlag = false;
bool updateLcd = true;

// prototypes

// functions
// Diese Funktion ist zum Entprellen von Tastern geeignet: 
// Durch den zusätzlichen Code kann eine Entprellzeit von durchschnittlich 1,5-4ms
// (mindestens 8*150us = 1,2ms) erreicht werden. 
// Grundsätzlich prüft die Funktion den Pegel des Pins eine DigitalIn. 
// Wenn der Pegel 8 Mal konstant war, wird die Schleife verlassen. 
// Diese Funktion kann sehr gut eingesetzt werden, um in einer Endlosschleife Taster 
// anzufragen, da sie, wie erwähnt, eine kurze Wartezeit hat.
uint8_t debounce(DigitalIn myIn)  
{
    #define LEVEL_CHECKS 8
    #define MAX_LOOPS 30                // stoppt das Überprüfen des Prellen nach max. MAX_LOOPS Durchläufen
    unsigned char port_buffer;
    unsigned char debounceCounter = 0;
    uint8_t loopCounter = 0;
    
    do
    {
        port_buffer = myIn;
        wait_us(100);
        loopCounter++;
        if(myIn == port_buffer)
          debounceCounter++;    // mindestens 'LEVEL_CHECKS' Abtastungen in Folge: gleicher Pegel
        else
          debounceCounter = 0;      
    }
    while ((debounceCounter <= LEVEL_CHECKS) && (loopCounter <= MAX_LOOPS));
    return loopCounter;
}

// ISR
void cntUp() { // Start stop watch
    debounce(diUp);
    runFlag = true;
}

void cntDown() { // Stopp stop watch
    debounce(diDown); 
    runFlag = false; 
    updateLcd = true;   
}    

void cntReset() { // reset stop watch
    debounce(diCenter); 
    hSec = 0;
    updateLcd = true; 
}

void count10msec(void) {
    if (runFlag) {
        hSec++; 
        if (hSec%10 == 0)   // update every 100 msec
            updateLcd = true;
    }  
}

// main program
int main() {
    uint32_t tempHsec=0;
    uint8_t sec=0;
    uint16_t min=0;
    C12832_LCD lcd;
    lcd.cls();
    lcd.locate(0,0);
    lcd.printf("BULME 5ABELI Stopuhr");
    iiUp.rise(&cntUp);
    iiDown.rise(&cntDown);
    iiCenter.rise(&cntReset);
    myTimer.attach(&count10msec, 0.01); // Hunderstel-Sec
    
    while(1) { 
        if (updateLcd) {
            updateLcd = false;
            lcd.locate(0,10);
            tempHsec = hSec;
            min = tempHsec/(100*60);
            sec = tempHsec/100 - min*60;
            lcd.printf("%02u:%02u:%02u", min, sec, tempHsec%100);
        }
    }
}