que tal mi problema es el siguiente llevo mas de 8 meses intentado hacer una cerradura electronica yo se que van a decir que porque no utilizo el buscador pero no eh encontrado como la quiero ps siempre le ponen un menu al comienzo. estoy intentadola hacer con el pic16f877a yo no manejo el lenguaje c pero me difiendo , mi primo no maneja el lenguaje c si no el lenguaje asembler en estos meses hemos intentado pero a mi siempre me sale un error con el ccs y al le salen 2 errores en el mplab a el no le queda tiempo por cuestiones de trabajo le dejos dejo los codigos en c y en assembler para que lo miren cuando les quede tiempo ya que se que ustedes mantienen muy ocupados con sus trabajos y estudios de la espero que me puedan colaborar y decirme que errores estoy cometiendo de antemano muchas gracias saludos
LENGUAJE EN ASM (MPLAB)
LENGUAJE EN C (CCS)
LENGUAJE EN ASM (MPLAB)
Código:
;**********************************************************
;** **
;** Llave electrónica con alarma para **
;** apertura de puerta **
;** **
;** **
;** **
;**********************************************************
T_RELE EQU 20H ;CONTROLA EL TIEMPO QUE EL RELE ACCIONA EL MARCO DE LA PUERTA
PCL EQU 02H
STATUS EQU 03H
PORTA EQU 05H
DATO EQU 06H ;PUERTO B
KEYB EQU 07H
TRISA EQU 05H
TRISB EQU 06H
TRISC EQU 07H
PUNTAB EQU 20H
INTENTO EQU 21H
TECLA EQU 22H
CUENTA1 EQU 23H
CUENTA2 EQU 24H
CUENTA3 EQU 25H
COD1 EQU 26H
COD2 EQU 27H
COD3 EQU 28H
COD4 EQU 29H
CUENTA4 EQU 2AH
COD1A EQU 2BH
COD2A EQU 2CH
COD3A EQU 2DH
COD4A EQU 2EH
CODWRITE EQU 2FH
EEADR EQU 10DH
EECON1 EQU 18CH
EECON2 EQU 18DH
EEDATA EQU 10CH
INTCON EQU 0BH
PIR2 EQU 0DH
PIE2 EQU 8DH
F EQU 1
W EQU 0
#DEFINE EN 05H,2
#DEFINE RW 05H,1
#DEFINE RS 05H,0
#DEFINE ALA 05H,3
#DEFINE PORTERO 05H,5
ORG 00H
GOTO INICIO
ORG 04H
BCF PIR2,4
RETFIE
TABLA MOVWF PCL
MEN_1 RETLW 'I'
RETLW 'N'
RETLW 'T'
RETLW 'R'
RETLW 'O'
RETLW 'D'
RETLW 'U'
RETLW 'Z'
RETLW 'C'
RETLW 'A'
MEN_5 RETLW ' '
RETLW 'C'
RETLW 'L'
RETLW 'A'
RETLW 'V'
RETLW 'E'
RETLW 00H
MEN_2 RETLW 'P'
RETLW 'U'
RETLW 'E'
RETLW 'D'
RETLW 'E'
RETLW ' '
RETLW 'P'
RETLW 'A'
RETLW 'S'
RETLW 'A'
RETLW 'R'
RETLW 00H
MEN_3 RETLW 'C'
RETLW 'L'
RETLW 'A'
RETLW 'V'
RETLW 'E'
RETLW ' '
RETLW 'I'
RETLW 'N'
RETLW 'C'
RETLW 'O'
RETLW 'R'
RETLW 'R'
RETLW 'E'
RETLW 'C'
RETLW 'T'
RETLW 'A'
RETLW 00H
MEN_4 RETLW 'C'
RETLW 'A'
RETLW 'M'
RETLW 'B'
RETLW 'I'
RETLW 'O'
RETLW ' '
RETLW 'D'
RETLW 'E'
RETLW 00H
MEN_6 RETLW ' '
RETLW 'A'
RETLW 'N'
RETLW 'T'
RETLW 'I'
RETLW 'G'
RETLW 'U'
RETLW 'A'
RETLW 00H
MEN_7 RETLW 'N'
RETLW 'U'
RETLW 'E'
RETLW 'V'
RETLW 'A'
RETLW 00H
MEN_8 RETLW 'V'
RETLW 'E'
RETLW 'R'
RETLW 'I'
RETLW 'F'
RETLW 'I'
RETLW 'Q'
RETLW 'U'
RETLW 'E'
RETLW 00H
MEN_9 RETLW ' '
RETLW 'C'
RETLW 'A'
RETLW 'M'
RETLW 'B'
RETLW 'I'
RETLW 'A'
RETLW 'D'
RETLW 'A'
RETLW 00H
MEN_10 RETLW 'L'
RETLW 'A'
RETLW ' '
RETLW 'C'
RETLW 'L'
RETLW 'A'
RETLW 'V'
RETLW 'E'
RETLW ' '
RETLW 'D'
RETLW 'E'
RETLW 'B'
RETLW 'E'
RETLW 00H
MEN_11 RETLW 'T'
RETLW 'E'
RETLW 'N'
RETLW 'E'
RETLW 'R'
RETLW ' '
RETLW '4'
RETLW ' '
RETLW 'D'
RETLW 'I'
RETLW 'G'
RETLW 'I'
RETLW 'T'
RETLW 'O'
RETLW 'S'
RETLW 00H
MEN_12 RETLW 'I'
RETLW 'N'
RETLW 'T'
RETLW 'E'
RETLW 'N'
RETLW 'T'
RETLW 'E'
RETLW 'L'
RETLW 'O'
RETLW 00H
MEN_13 RETLW 'D'
RETLW 'E'
RETLW ' '
RETLW 'N'
RETLW 'U'
RETLW 'E'
RETLW 'V'
RETLW 'O'
RETLW 00H
INICIO CLRF DATO
CLRF KEYB
CLRF PORTA
BSF STATUS,5
MOVLW 06H
MOVWF 9FH
CLRF DATO
BCF EN
BCF RW
BCF RS
BCF ALA
BCF PORTERO
MOVLW 0F0H
MOVWF KEYB
BCF STATUS,5
BCF PIR2,4
MOVLW 03H
MOVWF INTENTO
CALL INITLCD
CALL INITLCD
PRINCI CALL CLEARL
MOVLW 00H
CALL SITUCU
MOVLW MEN_1
CALL ESCMEN
MOVLW 44H
CALL SITUCU
ECOD12 CALL SUELKEY
CALL ESPEKEY
MOVWF COD1
SUBLW 'B'
BTFSC STATUS,2
GOTO ECOD12
MOVF COD1,W
SUBLW 'A'
BTFSC STATUS,2
GOTO INCOR
MOVF COD1,W
SUBLW 'C'
BTFSC STATUS,2
GOTO CAMBIOC
MOVF COD1,W
SUBLW 'D'
BTFSC STATUS,2
GOTO ECOD12
MOVLW '*'
CALL WRITEL
ECOD22 CALL SUELKEY
CALL ESPEKEY
MOVWF COD2
SUBLW 'B'
BTFSC STATUS,2
GOTO ECOD1
MOVF COD2,W
SUBLW 'A'
BTFSC STATUS,2
GOTO INCOR
MOVF COD2,W
SUBLW 'C'
BTFSC STATUS,2
GOTO CAMBIOC
MOVF COD2,W
SUBLW 'D'
BTFSC STATUS,2
GOTO ECOD22
MOVLW '*'
CALL WRITEL
ECOD32 CALL SUELKEY
CALL ESPEKEY
MOVWF COD3
SUBLW 'B'
BTFSC STATUS,2
GOTO ECOD2
MOVF COD3,W
SUBLW 'A'
BTFSC STATUS,2
GOTO INCOR
MOVF COD3,W
SUBLW 'C'
BTFSC STATUS,2
GOTO CAMBIOC
MOVF COD3,W
SUBLW 'D'
BTFSC STATUS,2
GOTO ECOD32
MOVLW '*'
CALL WRITEL
ECOD42 CALL SUELKEY
CALL ESPEKEY
MOVWF COD4
SUBLW 'B'
BTFSC STATUS,2
GOTO ECOD3
MOVF COD4,W
SUBLW 'A'
BTFSC STATUS,2
GOTO INCOR
MOVF COD4,W
SUBLW 'C'
BTFSC STATUS,2
GOTO CAMBIOC
MOVF COD4,W
SUBLW 'D'
BTFSC STATUS,2
GOTO ECOD42
MOVLW '*'
CALL WRITEL
CALL SUELKEY
FINCOD CALL ESPEKEY
MOVWF TECLA
SUBLW 'A'
BTFSC STATUS,2
GOTO FINCOD2
MOVF TECLA,W
SUBLW 'B'
BTFSC STATUS,2
GOTO ECOD4
MOVF TECLA,W
SUBLW 'C'
BTFSC STATUS,2
GOTO CAMBIOC
GOTO FINCOD
FINCOD2 MOVLW 00H
CALL LEECOD
SUBWF COD1
BTFSS STATUS,2
GOTO INCOR
MOVLW 01H
CALL LEECOD
SUBWF COD2
BTFSS STATUS,2
GOTO INCOR
MOVLW 02H
CALL LEECOD
SUBWF COD3
BTFSS STATUS,2
GOTO INCOR
MOVLW 03H
CALL LEECOD
SUBWF COD4
BTFSS STATUS,2
GOTO INCOR
CALL CLEARL ;CLAVE CORRECTA
MOVLW 02H
CALL SITUCU
MOVLW MEN_2
CALL ESCMEN
MOVLW 03H
MOVWF INTENTO
BSF PORTERO
MOVLW T_RELE
CALL DELAY
BCF PORTERO
MOVLW 10H
CALL DELAY
GOTO PRINCI
INCOR MOVLW 0CH
CALL COMANDO
CALL CLEARL
MOVLW MEN_3
CALL ESCMEN
DECFSZ INTENTO,F
GOTO INCOR2
GOTO ALARMA
INCOR2 MOVLW 20H
CALL DELAY
GOTO PRINCI
ECOD1 MOVLW 44H
CALL SITUCU
MOVLW ' '
CALL WRITEL
MOVLW 44H
CALL SITUCU
GOTO ECOD12
ECOD2 MOVLW 45H
CALL SITUCU
MOVLW ' '
CALL WRITEL
MOVLW 45H
CALL SITUCU
GOTO ECOD22
ECOD3 MOVLW 46H
CALL SITUCU
MOVLW ' '
CALL WRITEL
MOVLW 46H
CALL SITUCU
GOTO ECOD32
ECOD4 MOVLW 47H
CALL SITUCU
MOVLW ' '
CALL WRITEL
MOVLW 47H
CALL SITUCU
GOTO ECOD42
ALARMA MOVLW 1EH
MOVWF TECLA
ALARMA4 MOVLW 03H
MOVWF INTENTO
MOVLW 00FH
MOVWF CUENTA1
MOVLW 030H
MOVWF CUENTA2
ALARMA1 MOVLW 20H
MOVWF CUENTA4
DECF CUENTA1,F
BTFSC STATUS,2
GOTO ALARMA2
ALARMA3 BSF ALA
CALL FRECU
BCF ALA
CALL FRECU
DECFSZ CUENTA4,F
GOTO ALARMA3
GOTO ALARMA1
ALARMA2 MOVLW 01H
CALL DELAY
DECFSZ TECLA,F
GOTO ALARMA4
GOTO PRINCI
FRECU MOVF CUENTA1,W
MOVWF CUENTA3
FRECU2 DECFSZ CUENTA3,F
GOTO FRECU2
DECFSZ CUENTA2,F
GOTO FRECU
MOVLW 030H
MOVWF CUENTA2
RETURN
CAMBIOC CALL CLEARL
MOVLW MEN_4
CALL ESCMEN
MOVLW MEN_5
CALL ESCMEN
MOVLW 20H
CALL DELAY
CALL CLEARL
MOVLW MEN_5
CALL ESCMEN
MOVLW MEN_6
CALL ESCMEN
CALL SUELKEY
MOVLW 44H
CALL SITUCU
CALL COGECOD
MOVLW 00H
CALL LEECOD
SUBWF COD1
BTFSS STATUS,2
GOTO INCORE
MOVLW 01H
CALL LEECOD
SUBWF COD2
BTFSS STATUS,2
GOTO INCORE
MOVLW 02H
CALL LEECOD
SUBWF COD3
BTFSS STATUS,2
GOTO INCORE
MOVLW 03H
CALL LEECOD
SUBWF COD4
BTFSS STATUS,2
GOTO INCORE
MOVLW 03H
MOVWF INTENTO
NUEVACL CALL CLEARL
MOVLW 02H
CALL SITUCU
MOVLW MEN_7
CALL ESCMEN
MOVLW MEN_5
CALL ESCMEN
MOVLW 44H
CALL SITUCU
CALL SUELKEY
CALL COGECOD
MOVF COD1,W
BTFSC STATUS,2
GOTO INCOREC
MOVWF COD1A
MOVF COD2,W
BTFSC STATUS,2
GOTO INCOREC
MOVWF COD2A
MOVF COD3,W
BTFSC STATUS,2
GOTO INCOREC
MOVWF COD3A
MOVF COD4,W
BTFSC STATUS,2
GOTO INCOREC
MOVWF COD4A
CALL CLEARL ;VERIFIQUE CLAVE
MOVLW MEN_8
CALL ESCMEN
MOVLW MEN_5
CALL ESCMEN
MOVLW 44H
CALL SITUCU
CALL SUELKEY
CALL COGECOD
MOVF COD1,W
SUBWF COD1A,W
BTFSS STATUS,2
GOTO NOVERI
MOVF COD2,W
SUBWF COD2A,W
BTFSS STATUS,2
GOTO NOVERI
MOVF COD3,W
SUBWF COD3A,W
BTFSS STATUS,2
GOTO NOVERI
MOVF COD4,W
SUBWF COD4A,W
BTFSS STATUS,2
GOTO NOVERI
CALL CLEARL ;CLAVE CAMBIADA
MOVLW MEN_5
CALL ESCMEN
MOVLW MEN_9
CALL ESCMEN
MOVF COD1,W
MOVWF CODWRITE
MOVLW 00H
CALL EEWRITE
MOVF COD2,W
MOVWF CODWRITE
MOVLW 01H
CALL EEWRITE
MOVF COD3,W
MOVWF CODWRITE
MOVLW 02H
CALL EEWRITE
MOVF COD4,W
MOVWF CODWRITE
MOVLW 03H
CALL EEWRITE
MOVLW 20H
CALL DELAY
GOTO PRINCI
NOVERI CALL CLEARL
MOVLW 03H
CALL SITUCU
MOVLW MEN_12
CALL ESCMEN
MOVLW 43H
CALL SITUCU
MOVLW MEN_13
CALL ESCMEN
MOVLW 20H
CALL DELAY
GOTO NUEVACL
INCOREC CALL CLEARL ;LA CLAVE DEBE TENER 4 DIGITOS
MOVLW MEN_10
CALL ESCMEN
MOVLW 40H
CALL SITUCU
MOVLW MEN_11
CALL ESCMEN
MOVLW 20H
CALL DELAY
GOTO PRINCI
INCORE DECF INTENTO,F
BTFSC STATUS,2
GOTO ALARMA
CALL CLEARL
MOVLW MEN_3
CALL ESCMEN
MOVLW 20H
CALL DELAY
CALL SUELKEY
GOTO PRINCI
;-----------------------------------------------------------------
COGECOD CLRF COD1
CLRF COD2
CLRF COD3
CLRF COD4
ECOD12C CALL SUELKEY
CALL ESPEKEY
MOVWF COD1
SUBLW 'B'
BTFSC STATUS,2
GOTO ECOD12C
MOVF COD1,W
SUBLW 'A'
BTFSC STATUS,2
RETURN
MOVF COD1,W
SUBLW 'C'
BTFSC STATUS,2
GOTO ECOD12C
MOVF COD1,W
SUBLW 'D'
BTFSC STATUS,2
GOTO ECOD12C
MOVLW '*'
CALL WRITEL
ECOD22C CALL SUELKEY
CALL ESPEKEY
MOVWF COD2
SUBLW 'B'
BTFSC STATUS,2
GOTO ECOD1C
MOVF COD2,W
SUBLW 'A'
BTFSC STATUS,2
RETURN
MOVF COD2,W
SUBLW 'C'
BTFSC STATUS,2
GOTO ECOD22C
MOVF COD2,W
SUBLW 'D'
BTFSC STATUS,2
GOTO ECOD22C
MOVLW '*'
CALL WRITEL
ECOD32C CALL SUELKEY
CALL ESPEKEY
MOVWF COD3
SUBLW 'B'
BTFSC STATUS,2
GOTO ECOD2C
MOVF COD3,W
SUBLW 'A'
BTFSC STATUS,2
RETURN
MOVF COD3,W
SUBLW 'C'
BTFSC STATUS,2
GOTO ECOD32C
MOVF COD3,W
SUBLW 'D'
BTFSC STATUS,2
GOTO ECOD32C
MOVLW '*'
CALL WRITEL
ECOD42C CALL SUELKEY
CALL ESPEKEY
MOVWF COD4
SUBLW 'B'
BTFSC STATUS,2
GOTO ECOD3C
MOVF COD4,W
SUBLW 'A'
BTFSC STATUS,2
GOTO RETU4
MOVF COD4,W
SUBLW 'C'
BTFSC STATUS,2
GOTO ECOD42C
MOVF COD4,W
SUBLW 'D'
BTFSC STATUS,2
GOTO ECOD42C
MOVLW '*'
CALL WRITEL
CALL SUELKEY
FINCODC CALL ESPEKEY
MOVWF TECLA
SUBLW 'A'
BTFSC STATUS,2
RETURN ;YA TENGO EL CÓDIGO
MOVF TECLA,W
SUBLW 'B'
BTFSC STATUS,2
GOTO ECOD4C
GOTO FINCODC
ECOD1C MOVLW 44H
CALL SITUCU
MOVLW ' '
CALL WRITEL
MOVLW 44H
CALL SITUCU
CLRF COD2
GOTO ECOD12C
ECOD2C MOVLW 45H
CALL SITUCU
MOVLW ' '
CALL WRITEL
MOVLW 45H
CALL SITUCU
CLRF COD3
GOTO ECOD22C
ECOD3C MOVLW 46H
CALL SITUCU
MOVLW ' '
CALL WRITEL
MOVLW 46H
CALL SITUCU
CLRF COD4
GOTO ECOD32C
ECOD4C MOVLW 47H
CALL SITUCU
MOVLW ' '
CALL WRITEL
MOVLW 47H
CALL SITUCU
GOTO ECOD42C
RETU4 CLRF COD4
RETURN
;-----------------------------------------------------------------
; LEECOD: SUBRUTINA QUE LEE EL REGISTRO DE LA EEPROM
; INDICADO POR EL ACUMULADOR Y LO DEVUELVE EN
; ACUMULADOR
LEECOD BSF STATUS,6
BCF STATUS,5
MOVWF EEADR
BSF STATUS,5
BCF EECON1,7
BSF EECON1,0
BCF STATUS,5
MOVF EEDATA,W
BCF STATUS,6
RETURN
;----------------------------------------------------------------
;-----------------------------------------------------------------
; EEWRITE: SUBRUTINA QUE ESCRIBE EN LA EEPRON DE DATOS
; PASAR LA DIRECCION DE LA EEPRON A ESCRIBIR EN W Y EL DATO A ESCRIBIR EN CODWRITE
EEWRITE BSF STATUS,6
BCF STATUS,5
MOVWF EEADR
BCF STATUS,6
MOVF CODWRITE,W
BSF STATUS,6
MOVWF EEDATA
BSF STATUS,5
BCF EECON1,7
BSF EECON1,2
BCF INTCON,7
MOVLW 55H
MOVWF EECON2
MOVLW 0AAH
MOVWF EECON2
BSF EECON1,1
BSF INTCON,7
BCF STATUS,5
BCF STATUS,6
EEWRIT BTFSS PIR2,4
GOTO EEWRIT
BSF STATUS,5
BSF STATUS,6
BCF EECON1,2
BCF STATUS,5
BCF STATUS,6
BCF PIR2,4
RETURN
;----------------------------------------------------------
; GETKEY: Subrutina que devuelve el valor pulsado en
; un teclado hexadecimal en código ascii en W
;COL1: 0 COL2: 1 COL3: 2 COL4: 3
;ROW1: 4 ROW2: 5 ROW3: 6 ROW4: 7
GETKEY MOVLW 0FH
MOVWF KEYB
NOP
MOVF KEYB,W
MOVWF TECLA
CALL REBOTE
MOVF KEYB,W
SUBWF TECLA,F
BTFSS STATUS,2
GOTO GETKEY
SUBLW 0FH
BTFSS STATUS,2
GOTO HAYTECL
RETLW 0FH
HAYTECL BTFSC KEYB,4
GOTO ROW1
BTFSC KEYB,5
GOTO ROW2
BTFSC KEYB,6
GOTO ROW3
BTFSC KEYB,7
GOTO ROW4
RETLW 0FH
ROW1 MOVLW 01H
MOVWF KEYB
NOP
BTFSC KEYB,4
RETLW 31H ;TECLA=1
MOVLW 02H
MOVWF KEYB
NOP
BTFSC KEYB,4
RETLW 32H ;TECLA=2
MOVLW 04H
MOVWF KEYB
NOP
BTFSC KEYB,4
RETLW 33H ;TECLA=3
MOVLW 08H
MOVWF KEYB
NOP
BTFSC KEYB,4
RETLW 'A' ;TECLA=A
RETLW 0FH
ROW2 MOVLW 01H
MOVWF KEYB
NOP
BTFSC KEYB,5
RETLW 34H ;TECLA=4
MOVLW 02H
MOVWF KEYB
NOP
BTFSC KEYB,5
RETLW 35H ;TECLA=5
MOVLW 04H
MOVWF KEYB
NOP
BTFSC KEYB,5
RETLW 36H ;TECLA=6
MOVLW 08H
MOVWF KEYB
NOP
BTFSC KEYB,5
RETLW 'B' ;TECLA=B
RETLW 0FH
ROW3 MOVLW 01H
MOVWF KEYB
NOP
BTFSC KEYB,6
RETLW 37H ;TECLA=7
MOVLW 02H
MOVWF KEYB
NOP
BTFSC KEYB,6
RETLW 38H ;TECLA=8
MOVLW 04H
MOVWF KEYB
NOP
BTFSC KEYB,6
RETLW 39H ;TECLA=9
MOVLW 08H
MOVWF KEYB
NOP
BTFSC KEYB,6
RETLW 'C' ;TECLA=C
RETLW 0FH
ROW4 MOVLW 01H
MOVWF KEYB
NOP
BTFSC KEYB,7
RETLW '*' ;TECLA=*
MOVLW 02H
MOVWF KEYB
NOP
BTFSC KEYB,7
RETLW 30H ;TECLA=0
MOVLW 04H
MOVWF KEYB
NOP
BTFSC KEYB,7
RETLW '#' ;TECLA=#
MOVLW 08H
MOVWF KEYB
NOP
BTFSC KEYB,7
RETLW 'D' ;TECLA=D
RETLW 0FH
;----------------------------------------------------------------
;-----------------------------------------------------------
; SUELKEY: SUBRUTINA QUE ESPERA A QUE SE SUELTE
; LA TECLA PULSADA
SUELKEY CALL GETKEY
SUBLW 0FH
BTFSC STATUS,2
RETURN
GOTO SUELKEY
;-----------------------------------------------------------
;---------------------------------------------------------------------
; ESPEKEY: SUBRUTINA QUE ESPERA A QUE SE PULSE UNA TECLA
; DEVUELVE EL VALOR EN W Y TECLA
ESPEKEY CALL GETKEY
MOVWF TECLA
SUBLW 0FH
BTFSC STATUS,2
GOTO ESPEKEY
MOVF TECLA,W
RETURN
;----------------------------------------------------------------------
;--------------------------------------------------------------------------------------------
; ESCMEN: SUBRUTINA QUE ESCRIBE UN MENSAJE EN EL LCD,
; PASAR INICIO DE TABLA EN ACUMULADOR
ESCMEN MOVWF PUNTAB
ESCMEN2 CALL TABLA
ADDLW 00H
BTFSC STATUS,2
RETURN
CALL WRITEL
INCF PUNTAB,F
MOVF PUNTAB,W
GOTO ESCMEN2
;-------------------------------------------------------------------------------------------
;-------------------------------------------------------------------------------------------
; WAITLCD: SUBRUTINA DE ESPERA AL LCD
WAITLCD BSF STATUS,5
MOVLW 0FFH
MOVWF DATO
BCF STATUS,5
BSF EN
BCF RS
BSF RW
MOVLW 0FFH
MOVWF DATO
WAITLC BTFSC DATO,7
GOTO WAITLC
BCF EN
BCF RW
BCF DATO,7
BSF STATUS,5
CLRF DATO
BCF STATUS,5
RETURN
;--------------------------------------------------------------------------------------------
;--------------------------------------------------------------------------------------------
; INITLCD: SUBRUTINA DE INICIALIZACIÓN DEL LCD
INITLCD MOVLW 38H ;00111000
CALL COMANDO ;INTERFACE 8 BIT, 2 LINEAS
MOVLW 0CH ;00001100
CALL COMANDO ;DISPLAY A ON, NO MUESTRA CURSOR, NO PARPADEO
MOVLW 06H ;00000110
CALL COMANDO ;MUEVE CURSOR A LA DCHA DESPUES D ESCRIBIR, NO MUEVE VENTANA
RETURN
;-------------------------------------------------------------------------------------------
;-------------------------------------------------------------------------------------------
; CLEARL: SUBRUTINA QUE BORRA EL LCD Y LLEVA EL CURSOR AL LADO IZQUIERDO DEL
; DISPLAY
CLEARL MOVLW 01H
CALL COMANDO ;BORRADO
RETURN
;--------------------------------------------------------------------------------------------
;--------------------------------------------------------------------------------------------
; WRITEL: SUBRUTINA QUE ESCRIBE EN EL LCD EL CARACTER DEL ACUMULADOR
WRITEL BSF EN
BSF RS
BCF RW
MOVWF DATO
BCF EN
CALL WAITLCD
RETURN
;---------------------------------------------------------------------------------------------
;---------------------------------------------------------------------------------------------
; COMANDO: SUBRUTINA QUE ENVIA UN COMANDO AL LCD
COMANDO BSF EN
BCF RS
BCF RW
MOVWF DATO
BCF EN
CALL WAITLCD
RETURN
;---------------------------------------------------------------------------------------------
; SITUCU: SUBRUTINA QUE SITUA EL CURSOR EN LA DIRECCION INDICADA POR EL ACUMULADOR
SITUCU IORLW 80H
CALL COMANDO
RETURN
;----------------------------------------------------------------------------------------------
;=====================================================================
;*********** DELAY ***********
;---------------------------------------------------------------------
;SUBRUTINA DE RETARDO SEGÚN EL VALOR DEL ACUMULADOR
;MODIFICA LOS SIGUIENTES REGISTROS
; CUENTA1
; CUENTA2
; CUENTA3
DELAY MOVWF CUENTA1
DELAY3 MOVLW 0FFH
MOVWF CUENTA2
DELAY2 MOVLW 0FFH
MOVWF CUENTA3
DELAY1 DECFSZ CUENTA3,F
GOTO DELAY1
DECFSZ CUENTA2,F
GOTO DELAY2
DECFSZ CUENTA1,F
GOTO DELAY3
RETURN
;======================================================================
REBOTE MOVLW 0FFH
MOVWF CUENTA1
REBO DECFSZ CUENTA1,F
GOTO REBO
RETURN
ORG 2100H
DE 30H,30H,30H,30H
END
LENGUAJE EN C (CCS)
Código:
#include <16f877a.h>
#fuses hs,nowdt
#use delay(clock=11059200)
#include <lcd.c>
#define use_portb_kbd TRUE
#include <kbd.c>
#rom 0x2100={'1','2','3','4'}
void main()
{
int i;
char tecla=0;
char datos[4],clave[4];
lcd_init();
kbd_init();
port_b_pullups(true);
ciclo:
for(i=0;i<=4;i++) clave[i]=read_eeprom(i);
tecla=0;
while(tecla==0) tecla=kbd_getc();
lcd_putc("\fINTRODUCIR CLAVE\n");
tecla=0;
for(i=0;i<4;i++)
{
while(tecla==0) tecla=kbd_getc();
delay_ms(150);
datos[i]=tecla;
lcd_putc(" *");
tecla=0;
}
if (tecla=='#')
if((datos[0]==clave[0])&&(datos[1]==clave[1])&&(datos[2]==clave[2])&&(datos[3]==clave[3]))
{
lcd_putc("\fPUERTA ABIERTA");
output_high(pin_a0);
delay_ms(3000);
output_low(pin_a0);
}
else
{
lcd_putc("\fCLAVE ERRONEA");
delay_ms(3000);
}
goto ciclo;
}
if (tecla=='*')
{
lcd_putc("\f CLAVE ACTUAL\n");
tecla=0;
for(i=0;i<4;i++)
{
while(tecla==0) tecla=kbd_getc();
delay_ms(150);
datos[i]=tecla;
lcd_putc("*");
tecla=0;
}
if((datos[0]==clave[0])&&(datos[1]==clave[1])&&(datos[2]==clave[2])&&(datos[3]==clave[3]))
{
lcd_putc("\fNUEVA CLAVE\n");
for(i=0;i<4;i++)
{
while(tecla==0) tecla=kbd_getc();
delay_ms(150);
write_eeprom(i,tecla);
lcd_putc("*");
tecla=0;
}
lcd_putc("\fCLAVE MODIFICADA\n");
delay_ms(1000);
}
else
{
lcd_putc("\fCLAVE ERRONEA");
delay_ms(3000);
}
}
goto ciclo;
}