#include <stdio.h>
#include "pico/stdlib.h"
#include "pico/cyw43_arch.h"


//Definiçao dos pinos do teclado matricial
#define ROWS 4
#define COLS 4

//Atualização dos pinos de acordo com as novas conexões
const uint8_t row_pins[ROWS] = {8, 7, 6, 5};//Pinos conectados às linhas R1, R2, R3 e R4
const uint8_t col_pins[COLS] = {4, 3, 2, 9};//Pinos conectados às linhas C1, C2, C3 e C4

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

//Função para inicializar os pinos do teclado
void keypad_init() {
  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 as linhas como saída em nível baixo
  }

  for (int i = 0; i < COLS; i++) {
    gpio_init(col_pins[i]);
    gpio_set_dir(col_pins[i], GPIO_IN);
    gpio_pull_down(col_pins[i]);//Configuras as colunas como entradas com pull-down
  }
}

//Função para ler o teclado matricial
char read_keypad() {
  for (int row = 0; row < ROWS; row++) {
    gpio_put(row_pins[row], true);//Ativa a linha atual
    for (int col = 0; col < COLS; col++) {
      if (gpio_get(col_pins[col])) { //Verifica se a coluna atual está em nível alto
        gpio_put(row_pins[row], false); //Desativa a linha atual
        return key_map[row][col];   //Retorna a tecla pressionada
      }
    }
    gpio_put(row_pins[row], 0); //Desativa a linha atual
  }
  return '\0';//Retorna nulo se nenhuma tecla foi pressionada
}

int main() {
  stdio_init_all();
  keypad_init(); //Inicializa o teclado matricial
  //char key = 'b';

  while (true) {
    //printf("Hello, Wokwi!\n");
    char key = read_keypad(); //Lê o teclado
    if (key != '\0') { //Verifica se uma tecla foi pressionada
      printf("Tecla pressionada: %c\n", key);//Imprime a tecla pressionada
      sleep_ms(500);//Aguarda para evitar múltiplas leituras da mesma tecla
    }else{}
  }

  return 0;
}