//Irani de Oliveira Silva

#include <stdio.h>
#include "pico/stdlib.h"  
#include "hardware/gpio.h"  
#include "hardware/pwm.h"

// Define as conexões dos LEDs
#define LED_RED_PIN 13
#define LED_GREEN_PIN 11
#define LED_BLUE_PIN 12

// Define os pinos das linhas e colunas do teclado matricial
#define ROWS 4
#define COLS 4
uint8_t row_pins[ROWS] = {9, 8, 7, 6};
uint8_t col_pins[COLS] = {5, 4, 3, 2};

// Mapeamento do teclado matricial
char keys[ROWS][COLS] = {
    {'1', '2', '3', 'A'},
    {'4', '5', '6', 'B'},
    {'7', '8', '9', 'C'},
    {'*', '0', '#', 'D'}
};

// Função para configurar os pinos GPIO
void setup_gpio() {
    // Configura os pinos dos LEDs como saída
    gpio_init(LED_RED_PIN);
    gpio_set_dir(LED_RED_PIN, GPIO_OUT);

    gpio_init(LED_GREEN_PIN);
    gpio_set_dir(LED_GREEN_PIN, GPIO_OUT);

    gpio_init(LED_BLUE_PIN);
    gpio_set_dir(LED_BLUE_PIN, GPIO_OUT);

    // Configura os pinos das linhas como saída
    for (int i = 0; i < ROWS; i++) {
        gpio_init(row_pins[i]);
        gpio_set_dir(row_pins[i], GPIO_OUT);
        gpio_put(row_pins[i], 0);
    }

    // Configura os pinos das colunas como entrada com pull-up
    for (int i = 0; i < COLS; i++) {
        gpio_init(col_pins[i]);
        gpio_set_dir(col_pins[i], GPIO_IN);
        gpio_pull_up(col_pins[i]);
    }
}

// Função para verificar qual tecla foi pressionada
char get_keypad_input() {
    for (int row = 0; row < ROWS; row++) {
        // Ativa a linha atual
        gpio_put(row_pins[row], 1);

        for (int col = 0; col < COLS; col++) {
            if (!gpio_get(col_pins[col])) { // Verifica se a coluna está em nível baixo
                // Aguarda o debouncing
                sleep_ms(20);
                while (!gpio_get(col_pins[col])); // Aguarda o botão ser solto

                // Desativa a linha atual
                gpio_put(row_pins[row], 0);
                return keys[row][col];
            }
        }

        // Desativa a linha atual
        gpio_put(row_pins[row], 0);

            }
    return '\0'; // Retorna '\0' se nenhuma tecla for pressionada
}

// Função principal
int main() {
    //stdio_init_all();
    setup_gpio();

    while (1) {
        char key = get_keypad_input();
        printf(key);
        
        // Apaga todos os LEDs
        gpio_put(LED_RED_PIN, 0);
        gpio_put(LED_GREEN_PIN, 0);
        gpio_put(LED_BLUE_PIN, 0);

        switch (key) {
            case '1': case '4': case '7': case '*':
                gpio_put(LED_RED_PIN, 1); // Acende o LED vermelho
                break;

            case '2': case '5': case '8': case '0':
                gpio_put(LED_GREEN_PIN, 1); // Acende o LED verde
                break;

            case '3': case '6': case '9': case '#':
                gpio_put(LED_BLUE_PIN, 1); // Acende o LED azul
                break;

            case 'A': case 'B': case 'C': case 'D':
                // Nenhum LED aceso
                break;

            default:
                // Nenhuma ação
                break;
        }

        sleep_ms(100); // Pequeno atraso para evitar múltiplas leituras
    }
}