For Arch or Xadow M0, use on-board button to provide multifunction.

Dependencies:   mbed

Committer:
yihui
Date:
Tue Jan 13 12:46:12 2015 +0000
Revision:
0:0d08d0b3c7ed
initial

Who changed what in which revision?

UserRevisionLine numberNew contents of line
yihui 0:0d08d0b3c7ed 1 // For Arch and Xadow M0, use on-board button for normal input function rather than reset function
yihui 0:0d08d0b3c7ed 2 // single click - LED1 on
yihui 0:0d08d0b3c7ed 3 // double click - LED2 on
yihui 0:0d08d0b3c7ed 4 // long click - LED1 and LED2 on, and then the board will restart
yihui 0:0d08d0b3c7ed 5 //
yihui 0:0d08d0b3c7ed 6 // Note: To enter ISP mode, press the button and then power on (power-on reset)
yihui 0:0d08d0b3c7ed 7
yihui 0:0d08d0b3c7ed 8 #include "mbed.h"
yihui 0:0d08d0b3c7ed 9 #include "pinmap.h"
yihui 0:0d08d0b3c7ed 10
yihui 0:0d08d0b3c7ed 11 #define BUTTON_DOWN 0
yihui 0:0d08d0b3c7ed 12
yihui 0:0d08d0b3c7ed 13 InterruptIn button(P0_1); // on-board button of Arch or Xadow M0
yihui 0:0d08d0b3c7ed 14 BusOut leds(LED1, LED2);
yihui 0:0d08d0b3c7ed 15
yihui 0:0d08d0b3c7ed 16 uint8_t button_down_event = 0;
yihui 0:0d08d0b3c7ed 17
yihui 0:0d08d0b3c7ed 18 void button_callback()
yihui 0:0d08d0b3c7ed 19 {
yihui 0:0d08d0b3c7ed 20 button_down_event = 1; // set button down event flag
yihui 0:0d08d0b3c7ed 21 }
yihui 0:0d08d0b3c7ed 22
yihui 0:0d08d0b3c7ed 23 int button_detect()
yihui 0:0d08d0b3c7ed 24 {
yihui 0:0d08d0b3c7ed 25 int t = 0;
yihui 0:0d08d0b3c7ed 26
yihui 0:0d08d0b3c7ed 27 while (1) {
yihui 0:0d08d0b3c7ed 28 if (button.read() != BUTTON_DOWN) {
yihui 0:0d08d0b3c7ed 29 if (t < 30) {
yihui 0:0d08d0b3c7ed 30 return 0; // for anti shake
yihui 0:0d08d0b3c7ed 31 } else {
yihui 0:0d08d0b3c7ed 32 break;
yihui 0:0d08d0b3c7ed 33 }
yihui 0:0d08d0b3c7ed 34 }
yihui 0:0d08d0b3c7ed 35
yihui 0:0d08d0b3c7ed 36 if (t > 3000) { // More than 3 seconds
yihui 0:0d08d0b3c7ed 37 return -1; // long click
yihui 0:0d08d0b3c7ed 38 }
yihui 0:0d08d0b3c7ed 39
yihui 0:0d08d0b3c7ed 40 t++;
yihui 0:0d08d0b3c7ed 41 wait_ms(1);
yihui 0:0d08d0b3c7ed 42 }
yihui 0:0d08d0b3c7ed 43
yihui 0:0d08d0b3c7ed 44 if (t > 4000) { // More than 0.4 seconds
yihui 0:0d08d0b3c7ed 45 return 1; // single click
yihui 0:0d08d0b3c7ed 46 }
yihui 0:0d08d0b3c7ed 47
yihui 0:0d08d0b3c7ed 48 while (true) {
yihui 0:0d08d0b3c7ed 49 if (button.read() == BUTTON_DOWN) {
yihui 0:0d08d0b3c7ed 50 wait_ms(1);
yihui 0:0d08d0b3c7ed 51 if (button.read() == BUTTON_DOWN) {
yihui 0:0d08d0b3c7ed 52 return 2; // double click
yihui 0:0d08d0b3c7ed 53 }
yihui 0:0d08d0b3c7ed 54
yihui 0:0d08d0b3c7ed 55 t += 10;
yihui 0:0d08d0b3c7ed 56 }
yihui 0:0d08d0b3c7ed 57
yihui 0:0d08d0b3c7ed 58 if (t > 400) {
yihui 0:0d08d0b3c7ed 59 return 1; // The interval of double click supposes to be less than 0.4 seconds, so it's single click
yihui 0:0d08d0b3c7ed 60 }
yihui 0:0d08d0b3c7ed 61
yihui 0:0d08d0b3c7ed 62 t++;
yihui 0:0d08d0b3c7ed 63 wait_ms(1);
yihui 0:0d08d0b3c7ed 64 }
yihui 0:0d08d0b3c7ed 65 }
yihui 0:0d08d0b3c7ed 66
yihui 0:0d08d0b3c7ed 67
yihui 0:0d08d0b3c7ed 68 int main() {
yihui 0:0d08d0b3c7ed 69 // start
yihui 0:0d08d0b3c7ed 70 leds = 1;
yihui 0:0d08d0b3c7ed 71 wait(0.2);
yihui 0:0d08d0b3c7ed 72 leds = 3;
yihui 0:0d08d0b3c7ed 73 wait(0.2);
yihui 0:0d08d0b3c7ed 74 leds = 2;
yihui 0:0d08d0b3c7ed 75 wait(0.2);
yihui 0:0d08d0b3c7ed 76 leds = 0;
yihui 0:0d08d0b3c7ed 77
yihui 0:0d08d0b3c7ed 78 pin_function(P0_0, 1); // use RESET pin as
yihui 0:0d08d0b3c7ed 79 button.fall(button_callback);
yihui 0:0d08d0b3c7ed 80
yihui 0:0d08d0b3c7ed 81 while(1) {
yihui 0:0d08d0b3c7ed 82 if (button_down_event != 0) {
yihui 0:0d08d0b3c7ed 83 int clicks = button_detect();
yihui 0:0d08d0b3c7ed 84 if (clicks == 1) {
yihui 0:0d08d0b3c7ed 85 leds = 0x01;
yihui 0:0d08d0b3c7ed 86 } else if (clicks == 2) {
yihui 0:0d08d0b3c7ed 87 leds = 0x02;
yihui 0:0d08d0b3c7ed 88 } else if (clicks == -1) { // long press
yihui 0:0d08d0b3c7ed 89 leds = 0x03;
yihui 0:0d08d0b3c7ed 90 while (button.read() == BUTTON_DOWN) { } // wait until button is released. note: remove this line to boot into ISP mode after reset
yihui 0:0d08d0b3c7ed 91 NVIC_SystemReset(); // reset
yihui 0:0d08d0b3c7ed 92 }
yihui 0:0d08d0b3c7ed 93
yihui 0:0d08d0b3c7ed 94 wait(1);
yihui 0:0d08d0b3c7ed 95 leds = 0;
yihui 0:0d08d0b3c7ed 96
yihui 0:0d08d0b3c7ed 97 button_down_event = 0; // clear button down event flag
yihui 0:0d08d0b3c7ed 98 }
yihui 0:0d08d0b3c7ed 99
yihui 0:0d08d0b3c7ed 100 // sleep();
yihui 0:0d08d0b3c7ed 101 // or do something else
yihui 0:0d08d0b3c7ed 102 }
yihui 0:0d08d0b3c7ed 103 }