/* ==============================\
EmbarcaTech
Francisco Alexandro
⢀⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⢻⣿⡗⢶⣤⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣠⣄
⠀⢻⣇⠀⠈⠙⠳⣦⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣤⠶⠛⠋⣹⣿⡿
⠀⠀⠹⣆⠀⠀⠀⠀⠙⢷⣄⣀⣀⣀⣤⣤⣤⣄⣀⣴⠞⠋⠉⠀⠀⠀⢀⣿⡟⠁
⠀⠀⠀⠙⢷⡀⠀⠀⠀⠀⠉⠉⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⡾⠋⠀⠀
⠀⠀⠀⠀⠈⠻⡶⠂⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⣠⡾⠋⠀⠀⠀⠀
⠀⠀⠀⠀⠀⣼⠃⠀⢠⠒⣆⠀⠀⠀⠀⠀⠀⢠⢲⣄⠀⠀⠀⢻⣆⠀⠀⠀⠀⠀
⠀⠀⠀⠀⢰⡏⠀⠀⠈⠛⠋⠀⢀⣀⡀⠀⠀⠘⠛⠃⠀⠀⠀⠈⣿⡀⠀⠀⠀⠀
⠀⠀⠀⠀⣾⡟⠛⢳⠀⠀⠀⠀⠀⣉⣀⠀⠀⠀⠀⣰⢛⠙⣶⠀⢹⣇⠀⠀⠀⠀
⠀⠀⠀⠀⢿⡗⠛⠋⠀⠀⠀⠀⣾⠋⠀⢱⠀⠀⠀⠘⠲⠗⠋⠀⠈⣿⠀⠀⠀⠀
⠀⠀⠀⠀⠘⢷⡀⠀⠀⠀⠀⠀⠈⠓⠒⠋⠀⠀⠀⠀⠀⠀⠀⠀⠀⢻⡇⠀⠀⠀
⠀⠀⠀⠀⠀⠈⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⣧⠀⠀⠀
⠀⠀⠀⠀⠀⠈⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠉⠁⠀⠀⠀
| [Teclado Matricial com as telas certas]
=================================*/
#include <stdio.h>
#include "pico/stdlib.h"
#define ROWS 4
#define COLS 4
int pino_ativo = 0;
// Definindo os pinos das linhas e colunas
const uint8_t row_pins[4] = {9, 8, 7, 6};
const uint8_t col_pins[4] = {5, 4, 3, 2};
// Histórico das últimas teclas pressionadas
uint8_t history[4] = {0};
// Definindo as teclas
const char TECLAS[ROWS][COLS] = {
{ '1', '2', '3', 'A' },
{ '4', '5', '6', 'B' },
{ '7', '8', '9', 'C' },
{ '*', '0', '#', 'D' }
};
// Inicializando 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); // saída
gpio_put(row_pins[i], 0); // Inicializa a linha em baixo
}
for (int i = 0; i < COLS; i++) {
gpio_init(col_pins[i]);
gpio_set_dir(col_pins[i], GPIO_IN);
// aqui estamos deixando a coluna sempre ligada
gpio_pull_up(col_pins[i]);
}
}
// resolvendo o bounce do teclado para leitura correta
bool debounce(uint pin) {
if (!gpio_get(pin)) {
sleep_ms(50); // Aguarda 50ms para estabilizar
return !gpio_get(pin); // Verifica novamente se o estado é estável
}
return false;
}
// Lendo os botões do teclado
char readKey() {
//static int history_index = 0; // Controla o índice do histórico
for (int row = 0; row < ROWS; row++) {
gpio_put(row_pins[row], 0);
for (int col = 0; col < COLS; col++) {
if (debounce(col_pins[col])) {
gpio_put(row_pins[row], 0);
return TECLAS[row][col];
}
}
gpio_put(row_pins[row], 1);
}
return '\0'; // Retorna nulo se nenhuma tecla foi pressionada
}
int main() {
stdio_init_all();
keypad_init();
char tecla = '\0';
while (true) {
tecla = readKey();
if (tecla != '\0') {
printf("Tecla clicada: %c\n", tecla);
sleep_ms(200); // atraso para não duplicar o printf
}
}
return 0;
}