#include <stdio.h>
#include "pico/stdlib.h"
#include "hardware/clocks.h"
#define linhas 4 // Número de linhas do keypad
#define colunas 4 // Número de colunas do keypad
#define green 11
#define blue 12
#define red 13
// Configuração dos pinos GPIO usados para as linhas e colunas do keypad
unsigned int gpio_linhas[linhas] = {16, 17, 19, 20}; // Pinos GPIO conectados às linhas do keypad
unsigned int gpio_colunas[colunas] = {4, 8, 9, 28}; // Pinos GPIO conectados às colunas do keypad
// Mapeamento das teclas do keypad em forma de matriz
const char keymap[linhas][colunas] = {
{'1', '2', '3', 'A'}, // Primeira linha de teclas
{'4', '5', '6', 'B'}, // Segunda linha de teclas
{'7', '8', '9', 'C'}, // Terceira linha de teclas
{'*', '0', '#', 'D'} } ; // Quarta linha de teclas
// Função para inicializar os GPIOs do keypad
void keypad_init() {
gpio_init(blue);
gpio_set_dir(blue, GPIO_OUT);
gpio_init(green);
gpio_set_dir(green, GPIO_OUT);
gpio_init(red);
gpio_set_dir(red, GPIO_OUT);
// Configuração dos pinos das linhas como saída
for (int i = 0; i < linhas; i++) {
gpio_init(gpio_linhas[i]); // Inicializa o pino da linha
gpio_set_dir(gpio_linhas[i], GPIO_OUT); // Define o pino como saída
gpio_put(gpio_linhas[i], 1); } // Coloca a linha em estado inativo (nível lógico alto)
// Configuração dos pinos das colunas como entrada com resistor pull-up
for (int j = 0; j < colunas; j++) {
gpio_init(gpio_colunas[j]); // Inicializa o pino da coluna
gpio_set_dir(gpio_colunas[j], GPIO_IN); // Define o pino como entrada
gpio_pull_up(gpio_colunas[j]); } } // Ativa o resistor pull-up para manter o pino em nível alto
// Função para verificar qual tecla foi pressionada no keypad
char keypad_get_key() {
// Percorre cada linha
for (int i = 0; i < linhas; i++) {
gpio_put(gpio_linhas[i], 0); // Ativa a linha atual (nível lógico baixo)
// Verifica cada coluna para ver se alguma tecla está pressionada
for (int j = 0; j < colunas; j++) {
if (gpio_get(gpio_colunas[j]) == 0) { // Se a coluna está em nível lógico baixo, uma tecla foi pressionada
while (gpio_get(gpio_colunas[j]) == 0); // Aguarda a tecla ser liberada (evita múltiplas leituras)
gpio_put(gpio_linhas[i], 1); // Desativa a linha atual (retorna para nível lógico alto)
return keymap[i][j]; } } // Retorna o caractere correspondente à tecla pressionada
gpio_put(gpio_linhas[i], 1); }// Desativa a linha atual (retorna para nível lógico alto)
return '\0'; } // Retorna '\0' se nenhuma tecla foi pressionada
// Função principal do programa
int main() {
stdio_init_all(); // Inicializa a saída serial para depuração (printf)
// Inicializa o keypad configurando os GPIOs
keypad_init();
printf("Keypad iniciado. Pressione uma tecla...\n");
printf("Pressione 2 para ligar o led verde\n");
printf("Pressione 3 para ligar o led azul\n");
printf("Pressione 5 para ligar o led vermehlo\n");
printf("Pressione 6 para ligar todos os leds\n");
// Loop infinito para leitura das teclas
while (1) {
char key = keypad_get_key(); // Verifica se alguma tecla foi pressionada
if (key != '\0') { // Se uma tecla foi pressionada
printf("Tecla pressionada: %c\n", key); //Exibe a tecla pressionada no monitor serial
if(key =='2') {
gpio_put(green, 1);
gpio_put(blue, 0);
gpio_put(red, 0); }
else if(key == '3'){
gpio_put(blue, 1);
gpio_put(green, 0);
gpio_put(red, 0); }
else if(key == '5') {
gpio_put(blue, 0);
gpio_put(green, 0);
gpio_put(red, 1); }
else if(key == '6') {
gpio_put(blue, 1);
gpio_put(green, 1);
gpio_put(red, 1); }
// pisca todos os leds
// função secreta 1
else if (key == '8') {
int i = 5;
while (i <= 5, i--) {
gpio_put(blue, 1);
gpio_put(green, 1);
gpio_put(red, 1);
sleep_ms(200);
gpio_put(blue, 0);
gpio_put(green, 0);
gpio_put(red, 0);
sleep_ms(200); }}
// pisca todos os leds
// função secreta 2
else if (key == '9') {
int i = 5;
while (i <= 5, i--) {
gpio_put(green, 1);
gpio_put(blue, 0);
gpio_put(red, 0);
sleep_ms(250);
gpio_put(green, 0);
gpio_put(blue, 1);
sleep_ms(250);
gpio_put(blue, 0);
gpio_put(red, 1);
sleep_ms(250);
gpio_put(red, 0); }}
//desliga todos os leds
else if (key == '0') {
sleep_ms(20);
gpio_put(blue, 0);
gpio_put(green, 0);
gpio_put(red, 0); }
else if (key == '#'){
printf("Botão pressionado. \n");
int j=5;
while (j<=5, j--) {
sleep_ms(100); } } }
// Bipe de 5 segundos
// Aguarda 100 mili segundos
sleep_ms(100); } // Pausa de 100 ms
return 0; } // Este ponto nunca será alcançado