Hello i'm trying to do a programa that store a password in the eeprom and, i need to use it to unblock RD0 pin but when i try to simulate it using SumulIDE even i put the correctly password using the keyboard, and the lcd stuff to see the result, the lcd always show me wrong password someone can help me?
C:
// CONFIG
#pragma config FOSC = XT // Oscillator Selection
#pragma config WDTE = OFF // Watchdog Timer Enable
#pragma config PWRTE = OFF // Power-up Timer Enable
#pragma config BOREN = ON // Brown-out Reset Enable
#pragma config LVP = OFF // Low-Voltage Programming Enable
#pragma config CPD = OFF // Data EEPROM Memory Code Protection
#pragma config WRT = OFF // Flash Program Memory Write Enable
#pragma config CP = OFF // Flash Program Memory Code Protection
#include <xc.h>
#include <stdio.h>
#include <stdbool.h>
#include <string.h>
#define _XTAL_FREQ 4000000
// Definições do LCD
#define RS RA2
#define RW RA1
#define E RA0
#define RELAY_PIN RD0 // Pino para controle do LED verde
// Definições do teclado matricial 4x3
#define ROW1 RB0
#define ROW2 RB1
#define ROW3 RB2
#define ROW4 RB3
#define COL1 RB4
#define COL2 RB5
#define COL3 RB6
// Protótipos
void lcd_command(unsigned char command);
void lcd_putch(char data);
void lcd_puts(char *data);
void lcd_init(void);
void lcd_clear(void);
void lcd_set_cursor(unsigned char row, unsigned char column);
char keypad_read(void);
bool check_password(const char *input, const char *correctPass);
void led_blinking(void);
// Variáveis
unsigned char attempts = 0;
bool is_blocked = false;
__eeprom unsigned char defaultPass[] = "123"; // Senha padrão armazenada na EEPROM
char masterPass[] = "456"; // Senha mestra em RAM
void main(void) {
// Configuração inicial
TRISA = 0x00;
TRISB = 0xF0; // RB4-RB6 como entradas (colunas), RB0-RB3 como saídas (linhas)
TRISC = 0x00;
TRISD = 0x00; // Porta D como saída
ADCON1 = 0x06; // Configura portas como digitais
lcd_init();
lcd_clear();
lcd_puts("Digite a senha");
char input[4] = {0};
char eepromPass[4]; // Variável temporária para senha na EEPROM
unsigned char index = 0;
// Copiar senha da EEPROM para a RAM
for (unsigned char i = 0; i < 4; i++) {
eepromPass[i] = defaultPass[i];
}
while (1) {
if (!is_blocked) {
lcd_set_cursor(1, 0); // Define posição da linha para entrada da senha
char key = keypad_read();
if (key != '\0') {
lcd_putch('*'); // Exibe máscara
input[index++] = key;
if (index == 3) { // Senha completa
input[index] = '\0'; // Finaliza como string
if (check_password(input, eepromPass)) {
lcd_clear();
lcd_puts("Acesso Liberado");
RELAY_PIN = 1; // Liga o relé
__delay_ms(2000);
RELAY_PIN = 0;
index = 0;
attempts = 0; // Reseta tentativas após sucesso
lcd_clear();
lcd_puts("Digite a senha"); // Restaura mensagem inicial
} else {
attempts++;
lcd_clear();
lcd_puts("Senha Errada");
__delay_ms(10000);
lcd_clear();
lcd_puts("Digite a senha");
if (attempts >= 3) {
lcd_clear();
lcd_puts("Bloqueado!");
is_blocked = true; // Bloqueia após 3 erros
}
index = 0;
}
}
}
} else { // Estado bloqueado
lcd_clear();
lcd_puts("Senha mestra:");
index = 0;
while (1) { // Apenas aceita a senha mestra
lcd_set_cursor(1, 0); // Define posição para entrada da senha
char key = keypad_read();
if (key != '\0') {
lcd_putch('*'); // Exibe máscara
input[index++] = key;
if (index == 3) { // Senha mestra completa
input[index] = '\0'; // Finaliza como string
if (check_password(input, masterPass)) {
lcd_clear();
lcd_puts("Desbloqueado!");
led_blinking(); // Pisca o LED
is_blocked = false; // Desbloqueia
attempts = 0; // Reseta tentativas
__delay_ms(2000);
lcd_clear();
lcd_puts("Digite a senha"); // Restaura mensagem inicial
break;
} else {
lcd_clear();
lcd_puts("Senha Errada");
__delay_ms(2000);
lcd_clear();
lcd_puts("Senha mestra:");
index = 0;
}
}
}
}
}
}
}
// Funções auxiliares
bool check_password(const char *input, const char *correctPass) {
return strcmp(input, correctPass) == 0;
}
void lcd_command(unsigned char command) {
PORTC = command;
RS = 0;
RW = 0;
E = 1;
__delay_ms(1);
E = 0;
}
void lcd_putch(char data) {
PORTC = data;
RS = 1;
RW = 0;
E = 1;
__delay_ms(1);
E = 0;
}
void lcd_puts(char *data) {
while (*data) {
lcd_putch(*data++);
}
}
void lcd_init(void) {
lcd_command(0x38); // Modo 8 bits, 2 linhas, 5x7
__delay_ms(15);
lcd_command(0x0E); // Display ligado, cursor ligado
__delay_ms(15);
lcd_command(0x01); // Limpa display
__delay_ms(15);
}
void lcd_clear(void) {
lcd_command(0x01); // Limpa display
lcd_command(0x80); // Volta ao início
}
void lcd_set_cursor(unsigned char row, unsigned char column) {
unsigned char command;
if (row == 0)
command = 0x80 + column;
else
command = 0xC0 + column;
lcd_command(command);
}
void led_blinking(void) {
for (int i = 0; i < 100; i++) { // Pisca 5 vezes
RELAY_PIN = 1;
__delay_ms(5000);
RELAY_PIN = 0;
__delay_ms(5000);
}
}
char keypad_read(void) {
while (1) {
ROW1 = 1;
ROW2 = 0;
ROW3 = 0;
ROW4 = 0;
if (COL1) {
while (COL1);
return '1';
}
if (COL2) {
while (COL2);
return '2';
}
if (COL3) {
while (COL3);
return '3';
}
ROW1 = 0;
ROW2 = 1;
ROW3 = 0;
ROW4 = 0;
if (COL1) {
while (COL1);
return '4';
}
if (COL2) {
while (COL2);
return '5';
}
if (COL3) {
while (COL3);
return '6';
}
ROW1 = 0;
ROW2 = 0;
ROW3 = 1;
ROW4 = 0;
if (COL1) {
while (COL1);
return '7';
}
if (COL2) {
while (COL2);
return '8';
}
if (COL3) {
while (COL3);
return '9';
}
ROW1 = 0;
ROW2 = 0;
ROW3 = 0;
ROW4 = 1;
if (COL1) {
while (COL1);
return '*';
}
if (COL2) {
while (COL2);
return '0';
}
if (COL3) {
while (COL3);
return '#';
}
}
}