#include #include "pico/stdlib.h" #include #ifndef LED_DELAY_MS #define LED_DELAY_MS 250 #endif #define GPIO_15 15 #define GPIO_13 13 void pico_led_init(void) { #ifdef PICO_DEFAULT_LED_PIN gpio_init(PICO_DEFAULT_LED_PIN); gpio_set_dir(PICO_DEFAULT_LED_PIN, GPIO_OUT); #endif gpio_init(GPIO_15); gpio_set_dir(GPIO_15, GPIO_OUT); } void blink_led(void) { pico_led_init(); while (true) { gpio_put(GPIO_15, false); gpio_put(PICO_DEFAULT_LED_PIN, true); sleep_ms(LED_DELAY_MS); gpio_put(GPIO_15, true); gpio_put(PICO_DEFAULT_LED_PIN, false); sleep_ms(1000); } } enum button_state {OFF, ON}; typedef struct state state; struct state { int counter; int bs; bool can_incr; }; static state global_state = (state) { .counter = 0, .can_incr = true }; void incr_counter(state *s) { if (s != NULL) { if (s->can_incr) { s->counter++; s->can_incr = false; } } } void set_can_incr(state *s, bool v) { if (s != NULL) { s->can_incr = v; } } bool can_push(state *s) { if (s != NULL) return s->counter <= 10; return true; } int main() { gpio_init(GPIO_15); gpio_set_dir(GPIO_15, GPIO_OUT); gpio_init(GPIO_13); gpio_set_dir(GPIO_13, GPIO_IN); while (1) { // return low level when the button is pressed if (!gpio_get(GPIO_13)) { sleep_ms(20); // avoid "bounce" phenomenon (buffeting) if (!gpio_get(GPIO_13)) { incr_counter(&global_state); if (can_push(&global_state)) gpio_put(GPIO_15, true); continue; } } set_can_incr(&global_state, true); gpio_put(GPIO_15, false); } }