//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
}
}