![](/media/cache/profiles/IvyS.JPG.50x50_q85.jpg)
Lab 2 Button Testing.
Fork of digitalInPolling_sample by
Diff: main.cpp
- Revision:
- 0:a66a8cb0012c
- Child:
- 1:4709af498799
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Mon Jan 23 13:53:49 2017 +0000 @@ -0,0 +1,65 @@ +#include "mbed.h" +#include "rtos.h" + +// Labs 2: Example program for polling an input +// -------------------------------------------- +// The program uses a thread to poll a digital input +// - The thread monitors the position of the button +// - When the button transitions up and down, a press event is signaled +// - Button bounce is guarded against +// A second thread checks for the press event and toggles the LED + +DigitalIn button(PTD0, PullUp); +DigitalOut led(LED_RED); + +Thread pollT ; // thread to poll +Thread flashT ; // thread to flash light +volatile int pressEvent = 0 ; // Variabe set by the polling thread + +enum buttonPos { up, down, bounce }; // Button positions +void polling() { + buttonPos pos = up ; + int bcounter = 0 ; + while (true) { + switch (pos) { + case up : + if (button == 1) { // now down + pressEvent = 1 ; // transition occurred + pos = down ; + } + break ; + case down : + if (button == 0) { // no longer down + bcounter = 3 ; // wait four cycles + pos = bounce ; + } + break ; + case bounce : + if (button == 1) { // down again - button has bounced + pos = down ; // no event + } else if (bcounter == 0) { + pos = up ; // delay passed - reset to up + } else { + bcounter-- ; // continue waiting + } + break ; + } + Thread::wait(30); + } +} + +// Toggle the LED every time the button is pressed +void flash() { + while(true) { + if (pressEvent) { + pressEvent = 0 ; // clear the event variable + led = !led ; + } + Thread::wait(100) ; + } +} + +int main() { + pollT.start(&polling) ; // start the polling thread running + flashT.start(&flash) ; // start the flashing thread running +} \ No newline at end of file