Ted Lin
/
Nucleo_key_led_with_timeout
implement button press/release with double check using fall/rise & timeout
main.cpp
- Committer:
- mintisan
- Date:
- 2016-08-28
- Revision:
- 5:f89c9cfa6b38
- Parent:
- 4:4086e27c299e
- Child:
- 6:88ac8fb51ce5
File content as of revision 5:f89c9cfa6b38:
#include "mbed.h" //------------------------------------ // USER_KEY-PB_3 / USER_BUTTON-PC_13 //------------------------------------ InterruptIn mybutton(PB_3); //------------------------------------ // LED1-PA5 //------------------------------------ DigitalOut myled(PA_5); //------------------------------------ // Hyperterminal configuration // 9600 bauds, 8-bit data, no parity // SERIAL_TX-PA2, SERIAL_RX-PA3 //------------------------------------ Serial pc(PA_2, PA_3); // http://www.amobbs.com/thread-4308630-1-1.html Timeout flipper; #define entry() pc.printf("func:%s\n", __FUNCTION__) #define error() pc.printf("Error! func:%s, line: %d\n", __FUNCTION__, __LINE__) enum{OFF=0,ON=1}; enum{PRESS= 0, RELEASE = 1, UNKNOWN}; #define PRESS_JITTER_TIME 0.01 // 10ms #define RELEASE_JITTER_TIME 0.02 // 20ms uint8_t flag_status = UNKNOWN; void double_check(void) { //entry(); pc.printf("before = %d, now= %d\n",flag_status,mybutton.read()); switch(flag_status){ case PRESS: if(mybutton.read() == PRESS){ myled = ON; pc.printf("Pressed\n"); } break; case RELEASE: if(mybutton.read() == RELEASE){ myled = OFF; pc.printf("Released\n"); } break; default: error(); break; } } void pressed(void) { //entry(); if(myled.read()!=ON){ flag_status = PRESS; // double ckeck for press status flipper.attach(&double_check, PRESS_JITTER_TIME); } } void released(void) { //entry(); if(myled.read()!=OFF){ flag_status = RELEASE; // double check for releasse status flipper.attach(&double_check, RELEASE_JITTER_TIME); } } int main(void) { myled = OFF; mybutton.fall(&pressed); mybutton.rise(&released); while(1) { } }