Stopuhr: min:sec:hsec am LCD
Start: Joystik Up
Stopp: Joystick Down
Reset: Joistick Center (Sets vealue to 0 and restarts..)
- include "mbed.h"
- 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)
{
- 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(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);
}
}
}
Stopuhr: min:sec:hsec am LCD Start: Joystik Up Stopp: Joystick Down Reset: Joistick Center (Sets vealue to 0 and restarts..)
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) {
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); } } }