#include "pico/stdlib.h"
#include "hardware/gpio.h"
#include "hardware/irq.h"
#include "pico/time.h"
const uint BUTTON_PIN = 16;
const uint LED_PINS[] = {2, 6, 10, 15};
volatile bool buttonPressed = false;
volatile bool counterRunning = false;
volatile uint32_t counterValue = 0;
void button_isr() {
if (gpio_get(BUTTON_PIN)) {
return;
}
sleep_ms(50);
if (!gpio_get(BUTTON_PIN)) {
buttonPressed = true;
}
}
int main() {
stdio_init_all();
for (int i = 0; i < sizeof(LED_PINS) / sizeof(LED_PINS[0]); ++i) {
gpio_init(LED_PINS[i]);
gpio_set_dir(LED_PINS[i], GPIO_OUT);
}
gpio_init(BUTTON_PIN);
gpio_set_dir(BUTTON_PIN, GPIO_IN);
gpio_set_pulls(BUTTON_PIN, true, false);
gpio_set_irq_enabled_with_callback(BUTTON_PIN, GPIO_IRQ_EDGE_FALL, true, &button_isr);
irq_set_enabled(PIO0_IRQ_0, true);
while (true) {
if (buttonPressed) {
counterRunning = !counterRunning;
buttonPressed = false;
}
if (counterRunning) {
for (int i = 0; i < sizeof(LED_PINS) / sizeof(LED_PINS[0]); ++i) {
gpio_put(LED_PINS[i], (counterValue >> i) & 1);
}
counterValue++;
sleep_ms(500);
} else {
for (int i = 0; i < sizeof(LED_PINS) / sizeof(LED_PINS[0]); ++i) {
gpio_put(LED_PINS[i], 0);
}
}
}
return 0;
}