PIC 16F874A - eerpom password write/read

mmo515

Dec 4, 2024
1
Joined
Dec 4, 2024
Messages
1
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 '#';
        }
    }
}
 

ahsrabrifat

Jan 18, 2025
76
Joined
Jan 18, 2025
Messages
76
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 '#';
        }
    }
}
Add a small delay in the keypad scanning routine. Keypad debouncing may cause problems. If keys are bouncing, they might register multiple incorrect values.
__delay_ms(100);
 
Top