; ARCHIVO EEPROMF88.ASM
; VERSION PARA 16F88 CON BOOTLOADER TINY
; PROGRAMA PARA ESCRIBIR Y LEER DATOS EN LA EEPROM
; SE ESCRIBEN EN LAS DIRECCIONES DE EEPROM 00..1FH
; LOS DATOS 10H...2FH
; LUEGO SE LEEN DE LA MISMA EEPROM Y SE MUESTRAN 
; EN LOS LEDS DEL PUERTO B,
; CON RETRASOS DE MEDIO SEGUNDO
; EN TOTAL SON 32 DATOS.

	processor 16f88
	include	  <p16f88.inc>

;RESERVA LOCALIDADES PARA SUBRUTINA DE RETRASO

COUNT	EQU	H'20'
L	EQU	H'21'
M	EQU	H'22'

;DEFINE NOMBRE DE LOS BITS EN LOS PUERTOS A Y B

#DEFINE	RA0	PORTA,0
#DEFINE RA1	PORTA,1
#DEFINE RA2	PORTA,2
#DEFINE RA3	PORTA,3
#DEFINE RA4	PORTA,4
#DEFINE RB0	PORTB,0
#DEFINE RB1	PORTB,1
#DEFINE RB2	PORTB,2
#DEFINE RB3	PORTB,3
#DEFINE RB4	PORTB,4
#DEFINE RB5	PORTB,5
#DEFINE RB6	PORTB,6
#DEFINE RB7	PORTB,7

;MACROS PARA LA SELECCION DE LOS BANCOS DE REGISTROS

BANCO0	MACRO
	BCF	STATUS,RP0
	BCF	STATUS,RP1
	ENDM
BANCO1	MACRO
	BSF	STATUS,RP0
	BCF	STATUS,RP1
	ENDM
BANCO2	MACRO
	BCF	STATUS,RP0
	BSF	STATUS,RP1
	ENDM
BANCO3	MACRO
	BSF	STATUS,RP0
	BSF	STATUS,RP1
	ENDM

;MACRO PARA INICIALIZACION DE PUERTOS PARA 16F88

PUERTOS MACRO
	BANCO0
	BCF	RCSTA,SPEN	;DESHABILITA UART
	BANCO1
	movlw	7
	movwf	CMCON		;DESHABILITA COMPARADORES ANALOGICOS
	CLRF	CVRCON		;DESHABILITA VOLTAJE DE REFERENCIA
	CLRF	ANSEL		;DESHABILITA CONVERTIDORES
	MOVLW	H'1E'				
	MOVWF	TRISA		;RA0=SALIDA,RA1...RA4=ENTRADAS
	CLRF	TRISB		;RB0...RB7=SALIDAS
	BANCO0			 			
	CLRF	PORTB		;LEDS APAGADOS
	BCF	RA0		;DESHABILITA RELEVADOR
	ENDM

		ORG 0
		CLRF PCLATH
		GOTO INICIO

		ORG 3			;ORIGEN DEL PROGRAMA EN LA DIRECCION 0
INICIO:		PUERTOS			;MACRO PARA INICIALIZAR LOS PUERTOS DE 16F88
		BANCO0			
escribe: 	movlw	H'20'		;son 32 datos para escribir
		movwf	COUNT
		movlw	H'10'
		BANCO2
		movwf	EEDATA		;DATO =10H
		clrf	EEADR		;DIRECCION EEPROM=0
		BANCO0
mallo:		call	EEWR		;ESCRIBE EN EEPROM
		BANCO2
		incf	EEDATA
		incf	EEADR
		BANCO0
		decfsz	COUNT
		goto	mallo
		
lee:		movlw	H'20'		;son 32 datos para leer
		movwf	COUNT
		BANCO2
		clrf	EEADR		;DIRECCION INICIAL EEPROM=0
malli:		call	EERD		;LEE EN EEPROM, RESULTADO EN W
		BANCO0
		movwf	PORTB
		call	delay3
		BANCO2
		incf	EEADR
		BANCO0
		decfsz	COUNT		
		goto	malli
		sleep

;aquí inician las subrutinas de retraso

delay		movlw	D'25'		;10 milisegundos
		movwf	M
malla3		movwf	L
malla2		decfsz	L,f
		goto	malla2	
		decfsz	M,f
		goto	malla3
		return	
delay2		movlw	D'250'		;250 milisegundos
		movwf	M
malla5		movwf	L
malla4		decfsz	L,f
		goto	malla4	
		decfsz	M,f
		goto	malla5
		return
delay3		call	delay2		;1 segundo
		call	delay2
		call	delay2
		return

;subrutina para leer dato de EEPROM 16F88
;para usar esta subrutina, debe escribirse antes la dirección deseada
;en el registro EEADR (BANCO2). La rutina regresa con el dato en w.
	
EERD: 	BANCO3
BCF	EECON1,EEPGD		;APUNTA HACIA EEPROM DE DATOS		
BSF	EECON1,RD		;HABILITA EL BIT 0 (RD) DEL REGISTRO EECON1		
	BANCO2
MOVF	EEDATA,W		;TRANSFIERE EL DATO EN EEDATA A W,
	RETURN 
     
;subrutina para escribir dato en EEPROM 16F88
;para usar esta subrutina, debe escribirse antes la dirección DE LA EEPROM
;en el registro EEADR (BANCO2) y el dato en el registro EEDATA (BANCO2)
;la rutina regresa una vez que el dato fue escrito en la localidad deseada.

EEWR:	BANCO3			;HABILITA EL BANCO 3
	BCF	EECON1,EEPGD	;APUNTA HACIA EEPROM DE DATOS		
	BSF	EECON1,WREN	;HABILITA ESCRITURA EN EEPROM
	BCF     		INTCON, GIE     	;DESHABILITA INTERRUPCIONES    
	MOVLW	H'55'		;PREPARA SECUENCIA DE SEGURIDAD
	MOVWF	EECON2		;ESCRIBE PRIMER DATO DE SECUENCIA
	MOVLW	H'AA'		;SEGUNDO DATO
	MOVWF	EECON2		;ESCRIBE SEGUNDO DATO DE SECUENCIA
	BSF	EECON1,WR	;INICIA CICLO DE ESCRITURA
EW:	BTFSC   EECON1,WR       ;MALLA PARA ESPERAR AL FINAL DEL CICLO
        GOTO    EW              ;SI WR=1, CICLO DE ESCRITURA AUN NO TERMINA
	BCF     EECON1, WREN    ;DESHABILITA ESCRITURA
	BSF    	INTCON, GIE     ;HABILITA INTERRUPCIONES     		
	RETURN

	END