/*
Eugenio VIII Perdomo Tejeda - 1106962
Laboratorio de Sistema Digitales y Microprocesadores
P01_ARM_Lab_Intro_Subrutinas_V1.0 - Programado en C
*/
#include <stdio.h>
#include "pico/stdlib.h"
#include "pico/time.h" // Para usar `sleep_ms()`
#define LED_COUNT 8
#define BTN_PIN 27
const uint LED_PINS[LED_COUNT] = {26, 22, 21, 20, 19, 18, 17, 16};
// Secuencias de LEDs
uint8_t sequence0[][LED_COUNT] = {
{0, 1, 0, 1, 0, 1, 0, 1}, // Estado 1
{1, 0, 1, 0, 1, 0, 1, 0}, // Estado 2
{0, 1, 0, 1, 0, 1, 0, 1}, // Estado 3
{1, 0, 1, 0, 1, 0, 1, 0}, // Estado 4
{0, 1, 0, 1, 0, 1, 0, 1}, // Estado 5
{1, 0, 1, 0, 1, 0, 1, 0}, // Estado 6
{0, 1, 0, 1, 0, 1, 0, 1}, // Estado 7
{1, 0, 1, 0, 1, 0, 1, 0} // Estado 8
};
uint8_t sequence1[][LED_COUNT] = {
{1, 0, 0, 0, 0, 0, 0, 0}, // Estado 1
{0, 1, 0, 0, 0, 0, 0, 0}, // Estado 2
{0, 0, 1, 0, 0, 0, 0, 0}, // Estado 3
{0, 0, 0, 1, 0, 0, 0, 0}, // Estado 4
{0, 0, 0, 0, 1, 0, 0, 0}, // Estado 5
{0, 0, 0, 0, 0, 1, 0, 0}, // Estado 6
{0, 0, 0, 0, 0, 0, 1, 0}, // Estado 7
{0, 0, 0, 0, 0, 0, 0, 1} // Estado 8
};
uint8_t sequence2[][LED_COUNT] = {
{1, 0, 0, 0, 0, 0, 0, 1}, // Estado 1
{0, 1, 0, 0, 0, 0, 1, 0}, // Estado 2
{0, 0, 1, 0, 0, 1, 0, 0}, // Estado 3
{0, 0, 0, 1, 1, 0, 0, 0}, // Estado 4
{0, 0, 0, 1, 1, 0, 0, 0}, // Estado 5
{0, 0, 1, 0, 0, 1, 0, 0}, // Estado 6
{0, 1, 0, 0, 0, 0, 1, 0}, // Estado 7
{1, 0, 0, 0, 0, 0, 0, 1} // Estado 8
};
void setLEDs(uint8_t sequence[][LED_COUNT], uint8_t estado) {
for (int i = 0; i < LED_COUNT; ++i) {
gpio_put(LED_PINS[i], sequence[estado][i]);
}
}
int main() {
stdio_init_all();
// Inicializar GPIO para pines de LED
for (int i = 0; i < LED_COUNT; ++i) {
gpio_init(LED_PINS[i]);
gpio_set_dir(LED_PINS[i], GPIO_OUT);
}
gpio_init(BTN_PIN);
gpio_set_dir(BTN_PIN, GPIO_IN);
bool paused = false; // Variable para el estado de pausa
int estado = 0;
int secuencia = 0; // Variable para seleccionar la secuencia actual
while (true) {
// Leer estado del botón
bool button_state = gpio_get(BTN_PIN);
if (button_state) {
// Cambiar estado de pausa
paused = !paused;
// Añadir un pequeño retardo para evitar múltiples detecciones
sleep_ms(100);
}
// Si no estamos en pausa, mostrar secuencias de LED
if (!paused) {
switch (secuencia) {
case 0:
setLEDs(sequence0, estado);
sleep_ms(500); // Retardo para sequence0
break;
case 1:
setLEDs(sequence1, estado);
sleep_ms(300); // Retardo para sequence1
break;
case 2:
setLEDs(sequence2, estado);
sleep_ms(200); // Retardo para sequence2
break;
}
// Incrementar estado para cambiar al siguiente estado de la secuencia
estado = (estado + 1) % 8; // 8 estados en cada secuencia
// Cambiar a la siguiente secuencia después de mostrar todas las etapas de la actual
if (estado == 0) {
secuencia = (secuencia + 1) % 3; // Cambiar entre las 3 secuencias
}
} else {
// Si estamos en pausa, podrías optar por hacer algo específico aquí si es necesario
// por ejemplo, mantener los LEDs en un estado fijo.
// En este caso, podrías dejar el bloque vacío o añadir una función específica.
}
}
return 0;
}