#include <stdio.h>
#include "pico/stdlib.h"
#include "hardware/pwm.h"
#include "hardware/clocks.h"
#define buzzer 21
#define LINHAS 4
#define COLUNAS 4
const uint8_t _linhas[LINHAS] = {8,7,6,5};
const uint8_t _colunas[COLUNAS] = {4,3,2,1};
const char KEYS [LINHAS][COLUNAS] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
void start_gpio(){
for(int i = 0; i < LINHAS; i++){
gpio_init(_linhas[i]);
gpio_set_dir(_linhas[i], GPIO_OUT);
gpio_put(_linhas[i], 1);
}
for(int j = 0; j < COLUNAS; j++){
gpio_init(_colunas[j]);
gpio_set_dir(_colunas[j], GPIO_IN);
gpio_pull_up(_colunas[j]);
}
}
//PWM PARA ALTERAR FREQUENCIA HZ DO BUZZER
void buzzer_frequencia(uint pin, uint frequencia) {
uint slice_num = pwm_gpio_to_slice_num(pin);
gpio_set_function(pin, GPIO_FUNC_PWM);
pwm_config config = pwm_get_default_config();
pwm_config_set_clkdiv(&config, clock_get_hz(clk_sys) / (frequencia * 4096));
pwm_init(slice_num, &config, true);
pwm_set_gpio_level(pin, 0);
}
//Iniciar buzzer
void init_buzzer(uint pin, uint frequencia, uint duracao) {
buzzer_frequencia(pin, frequencia);
pwm_set_gpio_level(pin, 32768);
sleep_ms(duracao);
pwm_set_gpio_level(pin, 0);
}
//Tecla Pressionada
char keypad_leitura(){
for(int x = 0; x < LINHAS; x++){
gpio_put(_linhas[x], 0);
for(int z = 0; z < COLUNAS; z++){
if(gpio_get(_colunas[z]) == 0){
while(gpio_get(_colunas[z]) == 0);
gpio_put(_linhas[x], 1);
return KEYS[x][z];
}
}
gpio_put(_linhas[x], 1);
}
return 0;
}
void teclado_opcao(char key){
if(key == 'A'){
init_buzzer(buzzer, 2500, 500);
}
else if(key == 'B'){
init_buzzer(buzzer, 5000, 500);
sleep_ms(100);
init_buzzer(buzzer, 1000, 500);
}
else if(key == 'C'){
init_buzzer(buzzer, 7500, 500);
sleep_ms(100);
init_buzzer(buzzer, 5000, 500);
sleep_ms(100);
init_buzzer(buzzer, 1000, 500);
}
else if(key == 'D'){
init_buzzer(buzzer, 10000, 500);
sleep_ms(100);
init_buzzer(buzzer, 8000, 500);
sleep_ms(100);
init_buzzer(buzzer, 4000, 500);
sleep_ms(100);
init_buzzer(buzzer, 1000, 500);
}
}
int main(){
start_gpio();
while(true){
char key = keypad_leitura(); //Lendo Tecla Presionada
if(key){
teclado_opcao(key); //Passa tecla lida para a função
}
sleep_ms(1000);
}
return 0;
}