implement button press/release with double check using fall/rise & timeout

Dependencies:   mbed

Committer:
mintisan
Date:
Sun Aug 28 09:01:44 2016 +0000
Revision:
3:e25965edbbe7
Parent:
2:d68f26154551
Child:
4:4086e27c299e
version2s: interrupt key without jitter

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mintisan 0:6a3454713c54 1 #include "mbed.h"
mintisan 0:6a3454713c54 2
mintisan 2:d68f26154551 3 //------------------------------------
mintisan 3:e25965edbbe7 4 // USER_KEY-PB_3 / USER_BUTTON-PC_13
mintisan 2:d68f26154551 5 //------------------------------------
mintisan 2:d68f26154551 6 InterruptIn mybutton(PB_3);
mintisan 2:d68f26154551 7 //------------------------------------
mintisan 2:d68f26154551 8 // LED1-PA5
mintisan 2:d68f26154551 9 //------------------------------------
mintisan 0:6a3454713c54 10 DigitalOut myled(PA_5);
mintisan 2:d68f26154551 11 //------------------------------------
mintisan 2:d68f26154551 12 // Hyperterminal configuration
mintisan 2:d68f26154551 13 // 9600 bauds, 8-bit data, no parity
mintisan 2:d68f26154551 14 // SERIAL_TX-PA2, SERIAL_RX-PA3
mintisan 2:d68f26154551 15 //------------------------------------
mintisan 2:d68f26154551 16 Serial pc(PA_2, PA_3);
mintisan 2:d68f26154551 17
mintisan 3:e25965edbbe7 18 // http://www.amobbs.com/thread-4308630-1-1.html
mintisan 3:e25965edbbe7 19 Timeout flipper;
mintisan 3:e25965edbbe7 20
mintisan 2:d68f26154551 21 #define entry() pc.printf("func:%s\n", __func__)
mintisan 2:d68f26154551 22
mintisan 3:e25965edbbe7 23 #define error() pc.printf("Error! func:%s, line: %d\n", __func__, __LINE__)
mintisan 3:e25965edbbe7 24
mintisan 3:e25965edbbe7 25 enum{OFF=0,ON=1};
mintisan 3:e25965edbbe7 26 enum{PRESS= 0, RELEASE = 1, UNKNOWN};
mintisan 3:e25965edbbe7 27 uint8_t flag_status = UNKNOWN;
mintisan 3:e25965edbbe7 28
mintisan 3:e25965edbbe7 29 void double_check(void)
mintisan 3:e25965edbbe7 30 {
mintisan 3:e25965edbbe7 31 //entry();
mintisan 3:e25965edbbe7 32 pc.printf("before = %d, now= %d\n",flag_status,mybutton.read());
mintisan 3:e25965edbbe7 33 switch(flag_status){
mintisan 3:e25965edbbe7 34 case PRESS:
mintisan 3:e25965edbbe7 35 if(mybutton.read() == PRESS){
mintisan 3:e25965edbbe7 36 myled = ON;
mintisan 3:e25965edbbe7 37 pc.printf("Pressed\n");
mintisan 3:e25965edbbe7 38 }
mintisan 3:e25965edbbe7 39 break;
mintisan 3:e25965edbbe7 40 case RELEASE:
mintisan 3:e25965edbbe7 41 if(mybutton.read() == RELEASE){
mintisan 3:e25965edbbe7 42 myled = OFF;
mintisan 3:e25965edbbe7 43 pc.printf("Released\n");
mintisan 3:e25965edbbe7 44 }
mintisan 3:e25965edbbe7 45 break;
mintisan 3:e25965edbbe7 46 default:
mintisan 3:e25965edbbe7 47 error();
mintisan 3:e25965edbbe7 48 break;
mintisan 3:e25965edbbe7 49 }
mintisan 3:e25965edbbe7 50 }
mintisan 3:e25965edbbe7 51
mintisan 2:d68f26154551 52 void pressed(void)
mintisan 2:d68f26154551 53 {
mintisan 3:e25965edbbe7 54 //entry();
mintisan 3:e25965edbbe7 55 if(myled.read()!=ON){
mintisan 3:e25965edbbe7 56 flag_status = PRESS;
mintisan 3:e25965edbbe7 57 //pc.printf("mykey=%d\n",mybutton.read());
mintisan 3:e25965edbbe7 58 flipper.attach(&double_check, 0.01); //10ms
mintisan 3:e25965edbbe7 59 }
mintisan 2:d68f26154551 60 }
mintisan 2:d68f26154551 61
mintisan 2:d68f26154551 62 void released(void)
mintisan 2:d68f26154551 63 {
mintisan 3:e25965edbbe7 64 //entry();
mintisan 3:e25965edbbe7 65 if(myled.read()!=OFF){
mintisan 3:e25965edbbe7 66 flag_status = RELEASE;
mintisan 3:e25965edbbe7 67 //pc.printf("mykey=%d\n",int(mybutton));
mintisan 3:e25965edbbe7 68 flipper.attach(&double_check, 0.01); //10ms
mintisan 3:e25965edbbe7 69 }
mintisan 2:d68f26154551 70 }
mintisan 0:6a3454713c54 71
mintisan 3:e25965edbbe7 72
mintisan 3:e25965edbbe7 73
mintisan 0:6a3454713c54 74 int main(void)
mintisan 0:6a3454713c54 75 {
mintisan 2:d68f26154551 76 mybutton.fall(&pressed);
mintisan 2:d68f26154551 77 mybutton.rise(&released);
mintisan 0:6a3454713c54 78 while(1) {
mintisan 0:6a3454713c54 79 }
mintisan 0:6a3454713c54 80 }