#include <stdio.h>
#include "rom/gpio.h"
#include "driver/gpio.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#define Keypad_R1 15
#define Keypad_R2 2
#define Keypad_R3 0
#define Keypad_R4 4
#define Keypad_C1 16
#define Keypad_C2 17
#define Keypad_C3 5
#define Keypad_C4 18
#define NUM_ROWS 4
#define NUM_COLS 4
//Define os GPIOs para as linhas e colunas do keypad
uint8_t row_gpios[NUM_ROWS] = {Keypad_R1, Keypad_R2, Keypad_R3, Keypad_R4};
uint8_t col_gpios[NUM_COLS] = {Keypad_C1, Keypad_C2, Keypad_C3, Keypad_C4};
//Define o mapa de teclas do keypad
char keypad_layout[NUM_ROWS][NUM_COLS] = {
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
void app_main(void)
{
//configura os pinos gpios da linha do keypad
for(int i=0; i<NUM_ROWS; i++){
gpio_pad_select_gpio(row_gpios[i]);
gpio_set_direction(row_gpios[i], GPIO_MODE_OUTPUT);
gpio_set_level(row_gpios[i], 1);
}
//Configura os gpios de coluna da keypad em modo pullup
for(int i=0; i<NUM_COLS; i++){
gpio_pad_select_gpio(col_gpios[i]);
gpio_set_direction(col_gpios[i], GPIO_MODE_INPUT);
gpio_set_pull_mode(col_gpios[i], GPIO_PULLUP_ONLY);
}
while(1){
for(int r=0; r<NUM_ROWS; r++){
gpio_set_level(row_gpios[r],0);
vTaskDelay(1/portTICK_PERIOD_MS);
for(int c=0; c<NUM_COLS; c++){
if(gpio_get_level(col_gpios[c]) == 0){
printf("Tecla pressionada: %c\n", keypad_layout[r][c]);
while(gpio_get_level(col_gpios[c])==0){
vTaskDelay(10/ portTICK_PERIOD_MS);
}
}
}
gpio_set_level(row_gpios[r],1);
}
vTaskDelay(50/portTICK_PERIOD_MS);
}
}