; File CHAPA4DIGITOS.ASM ; recibe información de teclado matricial de 16 teclas (4 renglones, 4 columnas) y ; compara el valor de 4 dígitos con la clave asignada (1234). activa el relevador ; si el usuario teclea la clave correcta. para cambiar la clave, modifique los datos ; de la tabla "clave" (ver fin del programa). ; Configuración del CPU ; 16F84, Oscilador cristal 4 Mhz, ; watchdog timer off, power-up timer on) ; incluye archivo p16f84.inc processor 16f84 include "p16f84.inc" __config _XT_OSC & _WDT_OFF & _PWRTE_ON #DEFINE BANCO0 BCF STATUS,RP0 #DEFINE BANCO1 BSF STATUS,RP0 I EQU H'1F' ;valor columna (RB0...RB3) J EQU H'20' ;contador 4 rotaciones K EQU H'21' ;valor renglón (RB4..RB7) L EQU H'22' ;variable subrutina delay M EQU H'23' ;variable subrutina delay N EQU H'24' ;variable para checar tecla liberada X EQU H'25' ;contador 4 caracteres de teclado Q1 EQU H'26' ;PRIMER CARACTER ASCII Q2 EQU H'27' ;SEGUNDO Q3 EQU H'28' ;TERCERO Q4 EQU H'29' ;CUARTO eight equ H'38' ;constantes usadas en LCD clear equ H'01' home equ H'03' cursor equ H'0F' renglon1 equ H'80' renglon2 equ H'C0' PUERTOS MACRO ;INICIALIZA PUERTOS BSF STATUS,RP0 ;ELIJE EL BANCO DE REGISTROS ESPECIALES 1 MOVLW H'F0' ;RB0..RB3=SALIDAS, RB4...RB7=ENTRADAS MOVWF TRISB BCF OPTION_REG,7 ;RB4...RB7 CON RESISTENCIAS DE PULL UP BCF STATUS,RP0 ;ELIGE EL BANCO 0 ENDM LCD MACRO ;INICIALIZA LCD BSF STATUS,RP0 ;ELIGE EL BANCO 1 MOVLW H'00' ;RB0..RB7 SON SALIDAS MOVWF TRISB MOVWF TRISA ;RA0..RA4 SON SALIDAS BCF STATUS,RP0 ;ELIGE EL BANCO 0 movlw eight ;envía 5 comandos call puco movlw clear call puco movlw home call puco movlw cursor call puco movlw renglon1 call puco ENDM ;AQUI INICIA EL PROGRAMA org 0 begin: LCD ;inicializa LCD movlw H'04' movwf X ;contador caracteres movlw H'26' movwf FSR ;inicializa FSR=26H apuntador de direccionamiento indirecto start: PUERTOS ;inicializa puertos A y B para uso de teclado vuelta1: movlw H'EF' ;listo para iniciar rotación movwf I movwf PORTB movlw D'4' movwf J ;contador de 4 corrimientos vuelta2: rrf I,f ;rotación de bits RB0..RB3 en puerto B movfw I movwf PORTB call delay ;50 ms movfw PORTB ;lee el puerto B iorlw H'0F' ;conserva solo los bits RB4...RB7 movwf K comf K,f btfss STATUS,2 ;si la lectura es 0, continúa goto teclazo ;si la lectura diferente de 0, teclazo decfsz J,f goto vuelta2 goto vuelta1 teclazo: movfw PORTB ;verifica que tecla haya sido liberada iorlw H'0F' movwf N comf N,f btfss STATUS,2 goto teclazo ;continúa en loop si tecla aún oprimida BANCO1 movlw H'00' movwf TRISB ;programa bits de puerto B como salidas BANCO0 comf I,f movfw I ;toma valor salida puerto B andlw H'0F' ;solo los bits RB0...RB3 movwf I ;regresa el valor a I movfw K ;lee localidad con contenido de rotación andlw H'F0' ;solo bits D4...D7 iorwf I,f ;suma I y K resultado en I movfw I ;suma I y K, resultado en W movwf PORTB ;escribe puerto B, CODIGO RENGLON COLUMNA ide: movlw D'17' ;pasa a la parte de identificación movwf K ;K = contador de caracteres en la tabla loop: decf K,f ;decrementa K movfw K ;transfiere a W call tabla subwf I,w ;regresa de la tabla con caracter btfss STATUS,2 ;si I=caracter, se va a etiqueta "found" goto loop found: movfw K movwf PORTB ;muestra en leds contenido de offset. movlw D'16' addwf K,w ;añade 16 localidades a offset call tabla ;trae valor ASCII en tabla movwf PORTB ;despliega en puerto B movwf I ;guarda caracter ASCII en I lcd: movlw H'00' ;inicia rutina escribir caracter en LCD BANCO1 ;BANCO 1 movlw H'00' movwf TRISB ;bits de puerto B, salidas BANCO0 ;BANCO 0 movfw I ;prepara caracter en W movwf INDF ;GUARDA EN BUFFER CON DIRECCIONAMIENTO INDIRECTO incf FSR ;incrementa apuntador en buffer call puda ;escribe caracter en LCD decfsz X ;decrementa contador de caracteres goto start ;va de nuevo a leer teclado movlw ' ' call puda ;último dato, escribe '*' en LCD compara movlw H'4' ;contador 4 caracteres movwf X movlw H'29' movwf FSR ;inicializa apuntador de buffer bucle: movfw X call clave ;trae valor de tabla clave a w subwf INDF ;compara (FSR) y w btfss STATUS,Z goto herror ;clave tiene error decf FSR decfsz X goto bucle abre movlw '+' call puda ;abre chapa movlw '+' call puda bsf PORTA,0 ;activa relevador call dalay ;1 segundo bcf PORTA,0 ;desactiva relevador call dalay goto yoyo herror movlw 'n' call puda movlw 'o' call puda call dalay yoyo goto begin puco: movwf PORTB ;escribe comando en puertoB call delay ;50 milisegundos movlw H'04' ;RS=0, EN=1 movwf PORTA call delay movlw H'00' ;RS=0, EN=0 movwf PORTA call delay movlw H'04' movwf PORTA call delay return puda: movwf PORTB ;escribe dato en puertoB call delay ;50 milisegundos movlw H'06' ;RS=1, EN=1 movwf PORTA call delay movlw H'02' ;RS=1, EN=0 movwf PORTA call delay movlw H'06' movwf PORTA call delay return delay: movlw D'50' ;50 milisegundos movwf M mallaM: movwf L mallaL: decfsz L,f goto mallaL decfsz M,f goto mallaM return deloy: movlw D'250' ;250 milisegundos movwf M mollaM: movwf L mollaL: decfsz L,f goto mollaL decfsz M,f goto mollaM return dalay call deloy ;1 segundo call deloy call deloy call deloy return tabla addwf PCL,f retlw H'11' ;'0'AQUI EMPIEZAN CODIGOS RENGLON COLUMNA retlw H'12' ;'1' retlw H'14' ;'2' retlw H'18' ;'3' retlw H'21' ;'4' retlw H'22' ;'5' retlw H'24' ;'6' retlw H'28' ;'7' retlw H'41' ;'8' retlw H'42' ;'9' retlw H'44' ;'A' retlw H'48' ;'B' retlw H'81' ;'C' retlw H'82' ;'D' retlw H'84' ;'E' retlw H'88' ;'F' retlw H'30' ;'0'AQUI EMPIEZAN CODIGOS ASCII retlw H'31' ;'1' retlw H'32' ;'2' retlw H'33' ;'3' retlw H'34' ;'4' retlw H'35' ;'5' retlw H'36' ;'6' retlw H'37' ;'7' retlw H'38' ;'8' retlw H'39' ;'9' retlw H'41' ;'A' retlw H'42' ;'B' retlw H'43' ;'C' retlw H'44' ;'D' retlw H'45' ;'E' retlw H'46' ;'F' clave addwf PCL,f retlw '*' retlw H'31' ;'1' retlw H'32' ;'2' retlw H'33' ;'3' retlw H'34' ;'4' end