2025-02-19 11:22:12 +01:00

97 lines
1.8 KiB
C

#include <stdio.h>
#include "pico/stdlib.h"
#include <stdlib.h>
#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);
}
}