Stopuhr

14 Jan 2016

Stopuhr: min:sec:hsec am LCD Start: Joystik Up Stopp: Joystick Down Reset: Joistick Center (Sets vealue to 0 and restarts..)

  1. include "mbed.h"
  2. include "C12832_lcd.h"

InterruptIn iiUp(p15); DigitalIn diUp(p15); InterruptIn iiDown(p12); DigitalIn diDown(p12); Ticker myTimer; uint32_t hSec; bool runnFlag = 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) {

  1. define LEVEL_CHECKS 8
  2. 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(150); 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); hSec =0; runnFlag = true; }

void cntDown() { Start Stop watch debounce(diDown); runnFlag = false; updateLcd = true;

}

void count10msec(void) { if(runnFlag) { hSec++; if(hSec%10 == 0) update every 100 mSec updateLcd = true; } }

main program int main() { C12832_LCD lcd; lcd.cls(); lcd.locate(0,0); lcd.printf("BULME 5ABELI Stoppuhr"); iiUp.rise(&cntUp); iiDown.rise(&cntDown); myTimer.attach(&count10msec,0.01); hundertstel -Sec while(1) { if (updateLcd) { updateLcd = false; lcd.locate(0,10); lcd.printf("%u",hSec); } } }