Logo Studenta

ELECTRONICA AVANZADA PRÁCTICAS - Ivan Chio

¡Estudia con miles de materiales!

Vista previa del material en texto

Practica 1 
Haz un circuito con microcontrolador para le lectura de 
contraseñas numéricas a través de un teclado matricial 
utilizando lenguaje ensamblador 
ORG 0x0000 
 ; Definir variables 
 cont DB 0x00 ; Contador de 
intentos de ingreso de contraseña 
 led DB 0x00 ; Estado del LED (0 
apagado, 1 encendido) 
 pass DB 0x31,0x32,0x33,0x34 ; 
Contraseña (1234 en este caso) 
 
 ; Definir constantes 
 MAX_INTENTOS EQU 3 ; Máximo 
número de intentos de ingreso de 
contraseña 
 
 ; Inicio del programa 
 INICIO: 
 ; Solicitar ingreso de contraseña 
 MOV R0, #0 ; Reiniciar registro 
R0 
 MOV R1, #0 ; Reiniciar registro 
R1 
 MOV R2, #0 ; Reiniciar registro 
R2 
 MOV R3, #0 ; Reiniciar registro 
R3 
 LOOP: 
 ; Esperar hasta que se presione 
una tecla 
 LDRB R4, [GPIO_TECLADO] 
 CMP R4, #0xFF 
 BEQ LOOP 
 
 ; Leer tecla presionada 
 MOV R5, #0 
 ADD R5, R5, #1 
 LDRB R4, [GPIO_TECLADO] 
 CMP R4, #0xFE 
 BEQ KEY_1 
 CMP R4, #0xFD 
 BEQ KEY_2 
 CMP R4, #0xFB 
 BEQ KEY_3 
 CMP R4, #0xF7 
 BEQ KEY_4 
 CMP R4, #0xEF 
 BEQ KEY_5 
 CMP R4, #0xDF 
 BEQ KEY_6 
 CMP R4, #0xBF 
 BEQ KEY_7 
 CMP R4, #0x7F 
 BEQ KEY_8 
 B LOOP 
 
 KEY_1: 
 MOV R0, #1 
 B CONTINUE 
 KEY_2: 
 MOV R1, #2 
 B CONTINUE 
 KEY_3: 
 MOV R2, #3 
 B CONTINUE 
 KEY_4: 
 MOV R3, #4 
 B CONTINUE 
 KEY_5: 
 MOV R0, #5 
 B CONTINUE 
 KEY_6: 
 MOV R1, #6 
 B CONTINUE 
 KEY_7: 
 MOV R2, #7 
 B CONTINUE 
 KEY_8: 
 MOV R3, #8 
 B CONTINUE 
 
 ; Verificar contraseña 
 CONTINUE: 
 CMP R0, #0 
 BEQ NO_KEY_1 
 CMP R1, #0 
 BEQ NO_KEY_2 
 CMP R2, #0 
 BEQ NO_KEY_3 
 CMP R3, #0 
 BEQ NO_KEY_4 
 LDRB R4, [pass, R0] 
 CMP R4, #0xFF 
 BEQ FAIL 
 CMP R1, #1 
 BEQ CONTINUE_2 
 LDRB R4, [pass, R1] 
 CMP R4, #0xFF 
 BEQ FAIL 
 CMP R2, #2 
 BEQ CONTINUE_ 
ORG 0x0000 ; Dirección de inicio del 
programa 
 
 ; Configuración de los puertos 
PORTA EQU 0x05 ; Dirección del puerto A 
TRISA EQU 0x85 ; Dirección del registro 
de configuración del puerto A 
PORTB EQU 0x06 ; Dirección del puerto B 
TRISB EQU 0x86 ; Dirección del registro 
de configuración del puerto B 
 
; Constantes 
PASS_LENGTH EQU 4 ; Longitud de la 
contraseña 
CORRECT_PASS EQU 0x1234 ; 
Contraseña correcta 
 
 ; Variables 
pass_index RES 1 ; Índice de la 
contraseña actual 
pass_buffer RES PASS_LENGTH ; Buffer 
para almacenar la contraseña ingresada 
 
 ; Código principal 
RESET 
 ; Configuración de puertos 
 MOVLW 0x00 ; Valor para configurar 
los puertos como salidas 
 MOVWF TRISA ; Configuración del 
puerto A 
 MOVLW 0xFF ; Valor para configurar 
los puertos como entradas 
 MOVWF TRISB ; Configuración del 
puerto B 
 
 ; Configuración de interrupciones 
 BSF INTCON GIE ; Habilitar 
interrupciones globales 
 BSF INTCON INTE ; Habilitar 
interrupción externa 
 
 ; Configuración del teclado matricial 
 MOVLW 0x7F ; Activar pull-ups 
internos para RB7 
 MOVWF OPTION_REG 
 MOVLW 0x0F ; Configurar RB0-RB3 
como salidas y RB4-RB7 como entradas 
 MOVWF TRISB 
 
 ; Inicializar variables 
 CLRF pass_index 
 CLRF pass_buffer 
 
MAIN_LOOP 
 SLEEP ; Esperar a la interrupción 
 
; Rutina de interrupción 
INTERRUPT 
 ; Verificar que la interrupción proviene 
del teclado matricial 
 BTFSS INTCON INTF ; Si la interrupción 
no es por INT, salir 
 GOTO EXIT_INTERRUPT 
 MOVLW 0x00 ; Limpiar el flag de la 
interrupción 
 MOVWF INTCON 
 
 ; Leer la tecla presionada 
 MOVF PORTB, W 
 ANDLW 0xF0 ; Limpiar los bits de los 
pines RB0-RB3 
 IORLW 0x0F ; Poner en 1 los bits de los 
pines RB4-RB7 
 MOVWF pass_buffer + pass_index ; 
Guardar el valor en el buffer 
 INCF pass_index, F ; Incrementar el 
índice de la contraseña actual 
 
 ; Verificar si se ha ingresado la 
contraseña completa 
 MOVF pass_index, W 
 SUBWF PASS_LENGTH, W 
 BTFSS STATUS, Z ; Si la contraseña no 
está completa, salir 
 CALL CHECK_PASSWORD 
 
EXIT_INTERRUPT 
 RETFIE ; Salir de la interrupción 
 
CHECK_PASSWORD 
 ; Comparar la contraseña ingresada con 
la contraseña correcta 
 MOVLW HIGH(CORRECT_PASS) 
 MOVWF FSR 
 MOVLW LOW(CORRECT_PASS) 
 MOVWF FSR + 1 
 MOVLW PASS_LENGTH 
 MOVWF pass_index 
CHECK_LOOP 
 MOVF pass_buffer + 
 
; Configuración de pines 
PORTA equ 0x05 ; Dirección del registro 
PORTA 
TRISA equ 0x85 ; Dirección del registro 
TRISA 
PORTB equ 0x06 ; Dirección del registro 
PORTB 
TRISB equ 0x86 ; Dirección del registro 
TRISB 
 
; Definición de variables 
password db '1234' ; Contraseña 
keypad db 0 ; Variable para almacenar la 
tecla presionada 
key_count db 0 ; Contador de teclas 
presionadas 
input db 5 ; Número máximo de teclas 
que se pueden presionar 
buffer db 5 dup(0) ; Buffer para 
almacenar las teclas presionadas 
 
; Inicio del programa 
org 0x00 ; Dirección de inicio 
 
main: 
; Configurar los pines del teclado 
matricial como entrada 
movlw b'11110000' ; Configurar RB0-RB3 
como salida y RB4-RB7 como entrada 
movwf TRISB 
bsf STATUS, RP0 ; Seleccionar el banco de 
registros 1 
movlw b'00001111' ; Habilitar las 
resistencias pull-up en RB4-RB7 
movwf OPTION_REG 
bcf STATUS, RP0 ; Seleccionar el banco de 
registros 0 
 
; Configurar el pin del LED como salida 
bcf TRISA, 0 ; Configurar RA0 como salida 
 
; Ciclo principal 
loop: 
call read_key ; Leer una tecla del teclado 
matricial 
movwf keypad ; Almacenar la tecla 
presionada en la variable keypad 
inc key_count ; Incrementar el contador 
de teclas presionadas 
movf keypad, w ; Mover la tecla 
presionada al registro W 
movwf buffer + key_count - 1 ; 
Almacenar la tecla presionada en el 
buffer 
 
; Verificar si se ha presionado el número 
máximo de teclas 
movf key_count, w 
sublw input 
btfss STATUS, Z 
goto loop 
 
; Verificar si la contraseña es correcta 
movlw input 
movwf key_count ; Establecer el número 
de teclas a verificar 
movlw 0 ; Inicializar el índice del buffer 
movwf FSR ; Establecer el puntero del 
buffer al inicio 
password_check: 
movf buffer + FSR, w ; Mover una tecla 
del buffer al registro W 
xorlw password + FSR ; Verificar si la tecla 
es igual a la contraseña 
btfss STATUS, Z ; Saltar si las teclas no son 
iguales 
inc FSR ; Incrementar el puntero del 
buffer 
decfsz key_count, f ; Decrementar el 
número de teclas a verificar 
goto password_check 
 
; Encender el LED si la contraseña es 
correcta 
btfss STATUS, Z ; Saltar si la contraseña es 
incorrecta 
bsf PORTA, 0 ; Encender el LED 
goto loop 
 
; Subrutina para leer una tecla del teclado 
matricial 
read_key: 
bcf PORTB, 3 ; Configurar el pin RB3 
como salida 
bsf PORTB, 0 ; Configurar el pin RB0 como 
entrada 
bsf PORTB, 4 ; Habilitar la fila 1 
btfsc PORT

Continuar navegando