D:\ACCESO\ACCESO.ASM ;Programa para el control de acceso a un sistema X ;mediante la introducción de una clave a través de un teclado ;matricial. ;Es posible cambiar la clave de acceso y guardarla en la EEPROM ;La velocidad de operación del PIC es Fosc = 4 MHz ; ; ELABORO: ; GUSTAVO VELAZQUEZ G. ; Febrero de 2008 ; ;*************************************************************** list p=16f877 include "p16f877.inc" ROTA TEMP TECLA DIGITOS DIR equ equ equ equ equ 0x20 0x21 0x22 0x23 0x24 cblock 0x30 DIG1, DIG2, DIG3, DIG4 DIG5, DIG6, DIG7 endc ;................................. org 0x00 goto Inicio org 0x05 Inicio clrf PORTA clrf PORTC bsf STATUS, RP0 movlw 0x06 movwf ADCON1 movlw B'110000' movwf TRISA movlw B'111' movwf TRISE movlw B'11111000' movwf TRISC movlw B'11010111' movwf OPTION_REG bcf STATUS, RP0 LecturaEEPROM movlw 0x30 movwf FSR clrf DIR Leer movf DIR, W bsf STATUS, movwf EEADR bsf STATUS, bcf EECON1, bsf EECON1, bcf STATUS, movf EEDATA, bcf STATUS, ;Banco 0 RP1 ;Banco 2 RP0 EEPGD RD RP0 W RP1 ;Banco 3 ;Banco 2 ;Banco 0 1 D:\ACCESO\ACCESO.ASM movwf incf incf movf xorlw btfss goto INDF FSR, F DIR, F DIR, W D'7' STATUS, Z Leer ;Se prepara la revisión del teclado clrf movlw movwf Escaneo movlw movwf Escan movf movwf movf iorlw movwf comf DIGITOS 0x30 FSR ;Inicia la revisión del teclado B'11111110' ROTA ROTA, W PORTA PORTE, W B'11111000' TEMP TEMP, F btfsc STATUS, Z goto Rotacion ElimReb call Retardo movf PORTE, W xorlw 0x07 btfsc STATUS, Z goto ElimReb movf PORTE, W xorlw 0x07 btfss STATUS, Z goto $-3 call Retardo movf PORTE, W xorlw 0x07 btfss STATUS, Z goto $-4 DeterminaTecla comf ROTA, W call Renglon movwf TECLA movf TEMP, W call Columna addwf TECLA, F movf TECLA, W xorlw D'10' btfsc STATUS, Z goto CambioClave Gato? movf TECLA, W xorlw D'12' btfsc STATUS, Z goto Cancelar RevisionClave movf TECLA, W ;Ejemplo: W = B'00000110' ; W = B'11111110' ; TEMP = B'11111110' ; TEMP = B'00000001' ;El valor de TEMP solo puede ser ;1, 2 o 4 ;Ninguna tecla oprimida? ;No, ninguna oprimida ;Si, alguna está siendo oprimida ;por lo que se elimina el rebote ;del botón pulsador ;Se determina el valor de la tecla ;que ha sido pulsada ;Se revisa ;si ;no se oprimió el asterisco? ;Sí se oprimio ;No se oprimio, se revisa ;si ;no se oprimio el gato? ;Sí se oprimió, va a cancelar ;No se oprimió, se revisa si el valor 2 D:\ACCESO\ACCESO.ASM xorwf btfss goto incf incf movf xorlw btfss goto goto INDF, W ;de la tecla pulsada corresponde al dígito STATUS, Z ;que debe ser, de acuerdo a la clave de acceso Alarma ;Si no corresponde, va a la alarma FSR, F ;Si es correcto, se incrementa el apuntador DIGITOS, F ;y el contador de digitos o pulsaciones del teclado DIGITOS, W ;Si se han hecho siete D'7' ;pulsaciones correctas STATUS, Z ;va a activar o iniciar el sistema Escan ;Si aún no se completa la clave, va a revisar el teclado ActivarSistema Rotacion bsf rlf btfsc goto goto STATUS, C ROTA, F ROTA, 4 Escan Escaneo CambioClave bsf clrf movlw movwf PORTC, 2 DIGITOS 0x30 FSR Escaneo1 movlw movwf Escan1 movf movwf movf iorlw movwf comf ;Se hace ;la rotación del "cero" ;Se hicieron ya 4 rotaciones? ;No ;Sí B'11111110' ROTA ROTA, W PORTA PORTE, W B'11111000' TEMP TEMP, F btfsc STATUS, Z goto Rotacion1 ElimReb1 call Retardo movf PORTE, W xorlw 0x07 btfsc STATUS, Z goto ElimReb1 movf PORTE, W xorlw 0x07 btfss STATUS, Z goto $-3 call Retardo movf PORTE, W xorlw 0x07 btfss STATUS, Z goto $-4 DeterminaTecla1 comf ROTA, W call Renglon movwf TECLA movf TEMP, W call Columna addwf TECLA, F movf TECLA, W ;Ejemplo: W = B'00000110' ; W = B'11111110' ; TEMP = B'11111110' ; TEMP = B'00000001' ;El valor de TEMP solo puede ser ;1, 2 o 4 ;Ninguna tecla oprimida? ;No, ninguna oprimida ;Si, alguna está oprimida ;Se revisa 3 D:\ACCESO\ACCESO.ASM xorlw D'10' btfsc STATUS, Z goto Cancelar Gato1? movf TECLA, W xorlw D'12' btfsc STATUS, Z goto Cancelar AlmacenaDigitos movf TECLA, W movwf INDF incf FSR, F incf DIGITOS, F movf DIGITOS, W xorlw D'7' btfss STATUS, Z goto Escan1 goto Guardar Rotacion1 bsf rlf btfsc goto goto STATUS, C ROTA, F ROTA, 4 Escan1 Escaneo1 Guardar movlw movwf btfsc goto call btfsc goto btfss goto call btfss goto B'11110111' PORTA PORTE, 2 $-1 Retardo PORTE, 2 $-2 PORTE, 2 $-1 Retardo PORTE, 2 $-2 ;si ;no se oprimio el asterisco? ;Sí se oprimió, va a cancelar el cambio de clave ;No, se oprimió, se revisa ;si ;no se oprimió el gato? ;Sí se oprimió, va a cancelar ;Se hace ;la rotación del "cero" ;Se hicieron ya 4 rotaciones? ;No ;Sí EscribirEEPROM movlw 0x30 movwf FSR clrf DIR Escrib movf DIR, W bsf STATUS, RP1 movwf EEADR bcf STATUS, RP1 movf INDF, W bsf STATUS, RP1 movwf EEDATA bsf STATUS, RP0 bcf EECON1, EEPGD bsf EECON1, WREN movlw 0x55 movwf EECON2 movlw 0xAA movwf EECON2 bsf EECON1, WR bcf EECON1,WREN ;BAnco 2 ;Banco 0 ;Banco 2 ;Banco 3 4 D:\ACCESO\ACCESO.ASM btfsc goto bcf bcf incf incf movf xorlw btfss goto EECON1, $-1 STATUS, STATUS, FSR, F DIR, F DIR, W D'7' STATUS, Escrib WR RP0 RP1 ;Banco 0 Z clrf DIGITOS movlw 0x30 movwf FSR bcf PORTC, 2 goto Escaneo ;................................................... ActivarSistema bsf PORTC, 1 goto $ Alarma bsf goto Cancelar movlw movwf Cance bsf call call bcf call call decfsz goto goto PORTC, 0 $ D'5' TEMP PORTC, 2 Retardo Retardo PORTC, 2 Retardo Retardo TEMP, F Cance LecturaEEPROM ;......................................... Retardo ;100 ms aprox. movlw D'61' movwf TMR0 bcf INTCON, T0IF btfss INTCON, T0IF goto $-1 movlw D'61' movwf TMR0 bcf INTCON, T0IF btfss INTCON, T0IF goto $-1 return ;.............................. Renglon addwf PCL, F nop retlw D'0' retlw D'3' nop retlw D'6' 5 D:\ACCESO\ACCESO.ASM nop nop nop retlw D'9' Columna addwf PCL, F nop retlw D'1' retlw D'2' nop retlw D'3' ;....................... end 6