#include "pico/stdlib.h"
const int colunas = 4;
const int linhas = 4;
const uint8_t coluna_pins[] = {4, 3, 2, 28};
const uint8_t linha_pins[] = {8, 7, 6, 5};
const uint8_t buzzer_pin = 10;
const char mapa_tecla [4][4] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
void iniciar(){
//Inicializando as colunas do teclado matricial
int i;
for(i = 0; i < colunas; i++){
gpio_init(coluna_pins[i]);
gpio_set_dir(coluna_pins[i], GPIO_IN);
gpio_pull_down(coluna_pins[i]);
}
//Inicializando as linhas do teclado matricial
for(i = 0; i < linhas; i++){
gpio_init(linha_pins[i]);
gpio_set_dir(linha_pins[i], GPIO_OUT);
gpio_put(linha_pins[i], 0);
}
//Inicializando o pino do buzzer
gpio_init(buzzer_pin);
gpio_set_dir(buzzer_pin, GPIO_OUT);
}
//Função para manipulação do buzzer
void toca_buzzer(uint16_t FREGUENCIA, uint16_t DURACAO){
uint32_t atraso = 1000000 / (2 * FREGUENCIA);
uint32_t ciclos = (FREGUENCIA * DURACAO) / 1000;
uint16_t i;
for (i = 0; i < ciclos; i++) {
gpio_put(buzzer_pin, 1);
sleep_us(atraso);
gpio_put(buzzer_pin, 0);
sleep_us(atraso);
}
}
char leitura_teclado(){
for(int i = 0; i < linhas; i++){
gpio_put(linha_pins[i], 1);
for(int j = 0; j < colunas; j++){
if(gpio_get(coluna_pins[j])){
gpio_put(linha_pins[i], 0);
return mapa_tecla[i][j];
}
}
gpio_put(linha_pins[i], 0);
}
return '\0';
}
int main()
{
char operado;
uint8_t i;
uint16_t freguencia, duracao;
iniciar();
while(true){
operado = leitura_teclado();
switch (operado)
{
case 'A':
freguencia = 1000;
duracao = 1000;
toca_buzzer(freguencia, duracao);
sleep_ms(1000);
break;
case 'B':
freguencia = 500;
duracao = 500;
toca_buzzer(freguencia, duracao);
sleep_ms(1000);
break;
case 'C':
freguencia = 1000;
duracao = 500;
toca_buzzer(freguencia, duracao);
sleep_ms(1000);
break;
case 'D':
freguencia = 600;
duracao = 500;
toca_buzzer(freguencia, duracao);
sleep_ms(1000);
break;
default:
sleep_ms(100);
break;
}
}
return 0;
}