// Tarefa Aula 15/01/2025
// Teclado com LED
#include <stdio.h>
#include "pico/stdlib.h"
// Definição do número de linhas e colunas
#define rows 4
#define cols 4
// Definição dos pinos GPIO para as linhas e colunas do teclado
const uint8_t ROW_PINS[] = {1, 2, 3, 4}; // Pinos GPIO para R1, R2, R3, R4
const uint8_t COL_PINS[] = {5, 6, 7, 8}; // Pinos GPIO para C1, C2, C3, C4
// Definição dos pinos GPIO para os LEDs
const uint8_t LED_RED_PIN = 9; // LED Vermelho
const uint8_t LED_GREEN_PIN = 10; // LED Verde
const uint8_t LED_BLUE_PIN = 11; // LED Azul
// Mapa das teclas do teclado matricial
const char KEY_MAP[4][4] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
// Inicializa os pinos do teclado e dos LEDs
void init() {
// Inicializa pinos do teclado
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); // 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]); // Resistor de pull-down
}
// Inicializa pinos dos LEDs
gpio_init(LED_RED_PIN);
gpio_set_dir(LED_RED_PIN, GPIO_OUT);
gpio_put(LED_RED_PIN, 0); // Apaga o LED Vermelho
gpio_init(LED_GREEN_PIN);
gpio_set_dir(LED_GREEN_PIN, GPIO_OUT);
gpio_put(LED_GREEN_PIN, 0); // Apaga o LED Verde
gpio_init(LED_BLUE_PIN);
gpio_set_dir(LED_BLUE_PIN, GPIO_OUT);
gpio_put(LED_BLUE_PIN, 0); // Apaga o LED Azul
}
// Lê o teclado matricial e retorna a tecla pressionada
char read_keypad() {
for (int row = 0; row < rows; row++) {
gpio_put(ROW_PINS[row], 1); // Ativa a linha atual
sleep_us(100); // Pequeno delay para estabilizar o sinal
for (int col = 0; col < cols; col++) {
if (gpio_get(COL_PINS[col])) {
gpio_put(ROW_PINS[row], 0); // Desativa a linha
return KEY_MAP[row][col];
}
}
gpio_put(ROW_PINS[row], 0); // Desativa a linha
}
return '\0'; // Retorna '\0' se nenhuma tecla foi pressionada
}
// Acende o LED apropriado com base na tecla pressionada
void control_led(char key) {
// Desliga 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;
// [Nao precisa de case A B C D] Caso para 'A', 'B', 'C', 'D' não acende nenhum LED
}
}
int main() {
stdio_init_all(); // Inicializa a entrada/saída padrão
init(); // Inicializa o teclado e os LEDs
printf("--- Pronto para receber entradas do usuário ---\n");
while (1) {
char key = read_keypad(); // Lê a tecla pressionada
if (key != '\0') {
printf("Tecla pressionada: [%c]\n", key); // Imprime a tecla pressionada
control_led(key); // Acende o LED correspondente
sleep_ms(250); // Delay para evitar múltiplas leituras da mesma tecla
}
}
return 0;
}