; ARCHIVO EEPROMF628.ASM
; VERSION PARA 16F628
; PROGRAMA PARA ESCRIBIR Y LEER DATOS EN LA EEPROM
; SE ESCRIBEN EN LAS DIRECCIONES DE EEPROM 00..20H
; LOS DATOS 10...30H
; LUEGO SE LEEN Y SE MUESTRAN EN LOS LEDS DEL PUERTO B,
; CON RETRASOS DE MEDIO SEGUNDO
; EN TOTAL SON 32 DATOS.
; IMPORTANTE RECORDAR: EN EL 16F628, LOS REGISTROS
; PARA ESCRIBIR EN LA EEPROM: EEDATA, EEADR, EECON Y EECON2
; ESTAN EN EL BANCO 1
; PERO EN EL 16F84 EEDATA Y EEADR ESTAN EN BANCO0
; Y EECON Y EECON2, ESTAN EN BANCO 1



; VERSION PARA OSCILADOR CRISTAL 4 MHZ

; CPU configuration
; 	(It's a 16F628, XT OSCILADOR
; 	watchdog timer off, power-up timer on)

	processor 16f628
	include	  <p16f628.inc> 

	__config _XT_OSC & _WDT_OFF & _PWRTE_OFF & _MCLRE_ON & _BODEN_OFF & _LVP_OFF 

BANCO0	MACRO	
BCF	STATUS,RP0
BCF	STATUS,RP1
ENDM
BANCO1	MACRO
BSF	STATUS,RP0
BCF	STATUS,RP1
ENDM


COUNT	EQU	H'20'
L	EQU	H'21'
M	EQU	H'22'			

		BANCO1
		CLRF	TRISB
		
escribe: 	movlw	H'20'		;son 32 datos para escribir
		movwf	COUNT
		movlw	H'10'
		movwf	EEDATA		;DATO =10H
		clrf	EEADR		;DIRECCION EEPROM=0
mallo:	call	EEWR		;ESCRIBE EN EEPROM
		incf	EEDATA
		incf	EEADR
		decfsz	COUNT
		goto	mallo
		
lee:	movlw	H'20'		;son 32 datos para leer
		movwf	COUNT
		clrf	EEADR		;DIRECCION INICIAL EEPROM=0
malli:		call	EERD		;LEE EN EEPROM, RESULTADO EN W
		BANCO0
		movwf	PORTB
		call	delay3
		BANCO1
		incf	EEADR
		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



;para usar esta subrutina, debe escribirse antes la dirección DE LA EEPROM
;en el registro EEADR (BANCO0) y el dato en el registro EEDATA (BANCO0)
;la rutina regresa una vez que el dato fue escrito en la localidad deseada.

EEWR:	BANCO1			;HABILITA EL BANCO 1
		
		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

;para usar esta subrutina, debe escribirse antes la dirección deseada
;en el registro EEADR (BANCO0). La rutina regresa con el dato en w.
EERD: 	BANCO1			
		BSF		EECON1,RD		;HABILITA EL BIT 0 (RD) DEL REGISTRO EECON1		
		MOVF	EEDATA,W		;TRANSFIERE EL DATO EN EEDATA A W,
		RETURN                                                                                            	                                           	;USANDO DIRECCIONAMIENTO INDIRECTO.



END
	

	



		

