Descarga la aplicación para disfrutar aún más
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
Compartir