#include <stdio.h>
#include <ctype.h>
#include "pico/stdlib.h"
// Definição dos pinos do teclado matricial
#define ROWS 4
#define COLS 4
#define led_green 11
#define led_red 12
// Definição dos pinos dos segmentos do display
const uint8_t segment_pins[] = {5, 6, 4, 2, 3, 0, 1};
const uint8_t display_pins[] = {9, 8};
// Atualização dos pinos de acordo com as novas conexões
const uint8_t row_pins[ROWS] = {28, 27, 26, 22}; // Pinos conectados às linhas R1, R2, R3, R4
const uint8_t col_pins[COLS] = {21, 20, 19, 18}; // Pinos conectados às colunas C1, C2, C3, C4
// Mapa de teclas do teclado matricial
const char key_map[ROWS][COLS] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
// Função para inicializar os pinos do teclado
void keypad_init() {
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 linhas como saídas em nível baixo
}
for (int i = 0; i < COLS; i++) {
gpio_init(col_pins[i]);
gpio_set_dir(col_pins[i], GPIO_IN);
gpio_pull_down(col_pins[i]); // Configura as colunas como entradas com pull-down
}
}
// Função para ler o teclado matricial
char read_keypad() {
for (int row = 0; row < ROWS; row++) {
gpio_put(row_pins[row], 1); // Ativa a linha atual
for (int col = 0; col < COLS; col++) {
if (gpio_get(col_pins[col])) { // Verifica se a coluna atual está em nível alto
gpio_put(row_pins[row], 0); // Desativa a linha atual
return key_map[row][col]; // Retorna a tecla pressionada
}
}
gpio_put(row_pins[row], 0); // Desativa a linha atual
}
return '\0'; // Retorna nulo se nenhu,a tecla for pressionada
}
// Mapeamento dos dígitos para os segmentos do display
const uint8_t digits[10][7] = {
{1, 1, 1, 1, 1, 1, 0}, // 0
{0, 1, 1, 0, 0, 0, 0}, // 1
{1, 1, 0, 1, 1, 0, 1}, // 2
{1, 1, 1, 1, 0, 0, 1}, // 3
{0, 1, 1, 0, 0, 1, 1}, // 4
{1, 0, 1, 1, 0, 1, 1}, // 5
{1, 0, 1, 1, 1, 1, 1}, // 6
{1, 1, 1, 0, 0, 0, 0}, // 7
{1, 1, 1, 1, 1, 1, 1}, // 8
{1, 1, 1, 0, 0, 1, 1} // 9
};
// Função para configurar todos os pinos como saída
void setup() {
for (int i = 0; i < 7; i++) {
gpio_init(segment_pins[i]);
gpio_set_dir(segment_pins[i], GPIO_OUT);
}
for (int i = 0; i < 2; i++) {
gpio_init(display_pins[i]);
gpio_set_dir(display_pins[i], GPIO_OUT);
gpio_put(display_pins[i], 0); // Desativa inicialmente os displays
}
}
// Função para exibir um dígito no display específico
void show_digit(uint8_t display, uint8_t digit) {
// Desativa ambos displays
gpio_put(display_pins[0], 0);
gpio_put(display_pins[1], 0);
// Ativa os segmentos correspondentes ao dígito
for (int i = 0; i < 7; i++) {
gpio_put(segment_pins[i], digits[digit][i]);
}
// Ativa o display desejado
gpio_put(display_pins[display], 1);
}
/*
// Definição dos pinos dos segmentos do display
const uint8_t segment_pins[] = {5, 6, 4, 2, 3, 0, 1};
const uint8_t display_pins[] = {9, 8};
// Mapeamento dos dígitos para os segmentos do display
const uint8_t digits[10][7] = {
{1, 1, 1, 1, 1, 1, 0}, // 0
{0, 1, 1, 0, 0, 0, 0}, // 1
{1, 1, 0, 1, 1, 0, 1}, // 2
{1, 1, 1, 1, 0, 0, 1}, // 3
{0, 1, 1, 0, 0, 1, 1}, // 4
{1, 0, 1, 1, 0, 1, 1}, // 5
{1, 0, 1, 1, 1, 1, 1}, // 6
{1, 1, 1, 0, 0, 0, 0}, // 7
{1, 1, 1, 1, 1, 1, 1}, // 8
{1, 1, 1, 0, 0, 1, 1} // 9
};
// Função para configurar todos os pinos como saída
void setup() {
for (int i = 0; i < 7; i++) {
gpio_init(segment_pins[i]);
gpio_set_dir(segment_pins[i], GPIO_OUT);
}
for (int i = 0; i < 2; i++) {
gpio_init(display_pins[i]);
gpio_set_dir(display_pins[i], GPIO_OUT);
gpio_put(display_pins[i], 0); // Desativa inicialmente os displays
}
}
// Função para exibir um dígito no display específico
void show_digit(uint8_t display, uint8_t digit) {
// Desativa ambos displays
gpio_put(display_pins[0], 0);
gpio_put(display_pins[1], 0);
// Ativa os segmentos correspondentes ao dígito
for (int i = 0; i < 7; i++) {
gpio_put(segment_pins[i], digits[digit][i]);
}
// Ativa o display desejado
gpio_put(display_pins[display], 1);
}
*/
int main() {
/*
stdio_init_all();
setup(); // Configura todos os pinos como saída
while(true) {
for (uint8_t numero = 0; numero < 100; numero++) { // Loop para contagem de 0 a 99
uint8_t dezenas = numero / 10; // Calcula o dígito das dezenas
uint8_t unidades = numero % 10; // Calcula o dígito das unidades
// Multiplexa rapidamente entre os displays
for (int j = 0; j < 20; j++) { // Ajuste o valor de j para controlar a velocidade de atualização
show_digit(0, dezenas); // Exibe o dígito das dezenas no primeiro display
sleep_ms(5); // Tempo de permanência no primeiro display
show_digit(1, unidades); // Exibe o dígito das unidade no segundo display
sleep_ms(5); // Tempo de permanência no psegundo display
}
sleep_ms(800); // Pausa de meio segundo entre incrementos
}
}*/
char password[4] = {'9', '5', '3', '8'};
char password_user[4];
uint8_t digit_password = 0;
uint8_t control_led_green = 0;
uint8_t control_led_red = 0;
uint8_t number_display = 0;
stdio_init_all();
setup(); // Configura todos os pinos como saída
keypad_init(); // Inicializa o teclado matricial
show_digit(1, 0); // Exibe o dígito das unidade no segundo display
gpio_init(led_green);
gpio_set_dir(led_green, GPIO_OUT);
gpio_init(led_red);
gpio_set_dir(led_red, GPIO_OUT);
while (true) {
if (control_led_red < 3) {
char key = read_keypad(); // Lê o teclado
if (key != '\0' && isdigit(key)) {
password_user[digit_password] = key;
//number_display = 1;
show_digit(1, key - '0'); // Exibe o dígito das unidade no segundo display
//printf("%d\n", digit_password);
//printf("Tecla pressionada: %c\n", key); // Imprime a tecla pressionada
digit_password++;
//printf("%d\n", digit_password);
if (digit_password == 4) {
for (int i = 0; i < 4; i++) {
if (password_user[i] == password[i]) {
control_led_green++;
//printf("%d\n", control_led_green);
if (control_led_green == 4) {
//printf("LED ACESSO\n");
gpio_put(led_green, true);
show_digit(1, 0); // Exibe o dígito das unidade no segundo display
control_led_green = 0;
control_led_red = 0;
digit_password = 0;
//printf("%d\n", digit_password);
//printf("%d\n", control_led_green);
}
}
}
/*if (control_led_green > 0 && control_led_green < 4) {
}*/
}
sleep_ms(500); // Aguarda para evitar múltiplas leituras da mesma tecla
} else if (digit_password == 4) {
show_digit(1, 0); // Exibe o dígito das unidade no segundo display
control_led_red++;
for (int i = 0; i < 5; i++) {
gpio_put(led_red, true);
sleep_ms(500);
gpio_put(led_red, false);
sleep_ms(500);
}
control_led_green = 0;
digit_password = 0;
printf("%d\n", control_led_red);
} /*else {
while (number_display) {
// Multiplexa rapidamente entre os displays
for (int j = 0; j < 50; j++) { // Ajuste o valor de j para controlar a velocidade de atualização
show_digit(0, 0); // Exibe o dígito das dezenas no primeiro display
sleep_ms(5); // Tempo de permanência no primeiro display
show_digit(1, key - '0'); // Exibe o dígito das unidade no segundo display
sleep_ms(5); // Tempo de permanência no psegundo display
}
sleep_ms(500); // Pausa de 800 milisegundos entre incrementos
number_display = 0;
}
}*/
} else {
gpio_put(display_pins[1], 0);
for (int i = 0; i < 20; i++) {
printf("%d\n", i);
sleep_ms(1000);
}
control_led_red = 0;
//gpio_put(display_pins[1], 1);
show_digit(1, 0); // Exibe o dígito das unidade no segundo display
}
}
return 0;
}
/*
digit++;
if (digit == 4) {
for (int i = 0; i < 4; i++)
{
if (password_user[i] == password[i]) {
control++;
}
}
digit = 0;
}
if (control == 4) {
printf("Ligar LED\n");
control = 0;
}
*/Loading
pi-pico-w
pi-pico-w