// Nome: Alberto C. O. Andrade
// Atividade do dia 14/01/2025
// Código em C que utiliza um teclado matricial de forma que:
// - Pressionando as teclas 1, 4, 7 e "*", acenda o LED vermelho;
// - Pressionando as teclas 2, 5, 8, e 0 , acenda o LED verde;
// - Pressionando as teclas 3, 6, 9 e "#", acenda o LED azul;
// - Pressionando as teclas A, B, C e D , nenhum LED deve acender.
#include "pico/stdlib.h"
#define rows 4 // Linhas
#define cols 4 // Colunas
const uint8_t ROW_PINS[] = {1, 2, 3, 4}; // Pinos GPIO para linhas
const uint8_t COL_PINS[] = {5, 6, 7, 8}; // Pinos GPIO para colunas
const uint8_t LED_RED_PIN = 13; // LED vermelho
const uint8_t LED_GREEN_PIN = 11; // LED verde
const uint8_t LED_BLUE_PIN = 12; // LED azul
// Mapa das teclas do keypad
const char KEY_MAP[4][4] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
void init() {
// Configura as 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 as 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]);
}
// Inicializa os LEDs como saída e apaga-os
gpio_init(LED_RED_PIN);
gpio_set_dir(LED_RED_PIN, GPIO_OUT);
gpio_put(LED_RED_PIN, 0);
gpio_init(LED_GREEN_PIN);
gpio_set_dir(LED_GREEN_PIN, GPIO_OUT);
gpio_put(LED_GREEN_PIN, 0);
gpio_init(LED_BLUE_PIN);
gpio_set_dir(LED_BLUE_PIN, GPIO_OUT);
gpio_put(LED_BLUE_PIN, 0);
}
char read_keypad() {
for (int row = 0; row < rows; row++) {
gpio_put(ROW_PINS[row], 1); // Ativa a linha
sleep_us(50); // Aguarda estabilização do sinal
for (int col = 0; col < cols; col++) {
if (!gpio_get(COL_PINS[col])) { // Verifica se a coluna está ativada (pull-up, sinal baixo)
gpio_put(ROW_PINS[row], 0); // Desativa a linha
return KEY_MAP[row][col]; // Retorna a tecla correspondente
}
}
gpio_put(ROW_PINS[row], 0); // Desativa a linha atual
}
return '\0'; // Retorna nulo se nenhuma tecla foi pressionada
}
void control_led(char key) {
// Apaga todos os LEDs
gpio_put(LED_RED_PIN, 0);
gpio_put(LED_GREEN_PIN, 0);
gpio_put(LED_BLUE_PIN, 0);
// Acende o LED correspondente à tecla pressionada
if (key == '1' || key == '4' || key == '7' || key == '*') {
gpio_put(LED_RED_PIN, 1); // Acende LED vermelho
} else if (key == '2' || key == '5' || key == '8' || key == '0') {
gpio_put(LED_GREEN_PIN, 1); // Acende LED verde
} else if (key == '3' || key == '6' || key == '9' || key == '#') {
gpio_put(LED_BLUE_PIN, 1); // Acende LED azul
}
}
int main() {
init(); // Inicializa os pinos e configurações
while (1) {
char key = read_keypad(); // Lê a tecla pressionada
if (key != '\0') { // Se uma tecla foi pressionada
control_led(key); // Controla os LEDs com base na tecla
sleep_ms(200); // Delay para evitar múltiplas leituras rápidas
} else {
// Se nenhuma tecla foi pressionada, apaga os LEDs
gpio_put(LED_RED_PIN, 0);
gpio_put(LED_GREEN_PIN, 0);
gpio_put(LED_BLUE_PIN, 0);
}
}
return 0;
}