una ayudita con esta cerradura electronica

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)

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;
 }
 
Atrás
Arriba