
;************************** Registro especiales *******************************************

status		equ		03h
porta		equ		05h
portb		equ		06h
portc		equ		07h
portd		equ		08h
porte		equ		09h
intcon		equ		0bh
pir2		equ		0dh

trisa		equ		85h
trisb		equ		86h
trisc		equ		87h
trisd		equ		88h
trise		equ		89h
pie2		equ		8dh

eedata		equ		10ch
eeadr		equ		10dh

eecon1		equ		18ch
eecon2		equ		18dh

;************************ Registros de usuario ********************************************

conta		equ		20h
loop		equ		21h
loop1		equ		22h
respuesta	equ		23h

;*********************** Va a empezar el programa *****************************************

	list p = 16f877

	org	00
	goto	inicio

	org	04
	goto	inter

;************************* Rutina de atencin de interrupciones **************************

inter	bcf	status,6
	bcf	status,5		; banco 0
	btfsc	pir2,4			; pregunto si ya hubo interrupcin por finalizacin
					; de escritura en la EEPROM
	goto	guarda_s
	bcf	status,6
	bcf	status,5		; me paso al banco 0
	retfie				; de lo contrario retorno al programa

guarda_s
	bcf	pir2,4			; limpio la bandera de intterupcin		
	movlw	b'1'	
	movwf	respuesta		; cargo 
	retfie

;************************* Rutina de tiempo antirebote **************************

retar	movlw	d'180'
	movwf	loop
	movlw	d'200'
	movwf	loop1
	decfsz	loop1,1
	goto	$-1
	decfsz	loop,1
	goto	$-5
	return

;*********************** Rurina de configuracin para la escritura en la EEMPROM ***********

guardar	bsf	status,6		; me paso al banco de memoria 2
	bcf	status,5
	movlw	d'0'			
	movwf	eeadr			; especifico en parte de la memoria voy a guardar
					; en este caso en posicin 0x00H
	bcf	status,6		
	bcf	status,5		; banco 0
	movf	conta,0			; paso conta a w ya que conta es el valor a guardar
	bsf	status,6		; me paso al banco de memoria 2
	bcf	status,5
	movwf	eedata			; paso el dato a eedata
	bsf	status,5		; me paso al banco 3
 	bsf	eecon1,2		; permito la escritura en la eemprom

	movlw	55h
	movwf	eecon2	
	movlw	0xAA
	movwf	eecon2			; mando el comando de escritura

	bsf	eecon1,1		; empieza la escritura
	bcf	status,6
	bcf	status,5
	movf	respuesta,1		; paso el valor de escritura a w
	xorlw	d'1'			; lo comparo con 1
	btfss	status,2		; pregunto por el resultado lgico de la operacin
	goto	$-3			; vuelvo y repito esperando interrupcin
	clrf	respuesta		; limpio la bandera
	return


;********************** Empieza el programa ************************************************

inicio	bcf	status,6
	bsf	status,5		; banco 1
	movlw	b'11111111'
	movwf	trisa
	movwf	trisb
	movwf	trisd	
	movwf	trise			; puertos A,B,D,E como entradas digitales
	movlw	b'11110000'
	movwf	trisc			; configuro el puerto C
	movlw	b'00010000'
	movwf	pie2
	bcf	status,5		; banco 0
	movlw	b'11000000'
	movwf	intcon			; activo la interrupcin por escritura de la EEPROM
	clrf	portb
	clrf	conta
	clrf	portc
	clrf	respuesta

vuelve	btfss	portb,1
	goto	pulsa_2
	call	retar
	btfsc	portb,1
	goto	pulsa_2
	call	retar
	btfss	portb,1			; rutina que pregunta por los dos pulsadores
	goto	$-1
	incf	conta,1
	goto	vuelve

pulsa_2
	btfss	portb,2
	goto	vuelve
	call	retar
	btfsc	portb,2
	goto	vuelve
	call	retar
	call	guardar
	goto	vuelve
	end