LIST p=16F877A
INCLUDE <P16F877A.INC>
DATA_EE_ADDR EQU 0X20
DATA_EE_DATA EQU 0X21
comparador EQU 0x22
ORG 0X00
BSF STATUS,RP0
clrf TRISB
BCF STATUS,RP0
movlw 0xFF
movwf PORTB ;comenzar con todo el puertoB encendido
call Retardo_50ms
clrf DATA_EE_ADDR
movlw 0xAA
movwf comparador
movwf DATA_EE_DATA ;mandar a grabar el valor 0xAA en la posición 0 de la EEPROM
CALL Escribe_Eeprom
CALL Lee_Eeprom
xorwf comparador,W ; si comparador(0xAA) es igual a W(valor leido) entonces la XOR dará 0
movwf PORTB ;Mostrar en el puertoB el resultado de la XOR. Si todo el puertob está en cero hemos grabado y leido exitosamente. Sino algún pin del puertob estará en 1.
goto $ ;loop eterno acá
Escribe_Eeprom
BSF STATUS,RP1
BSF STATUS,RP0
BTFSC EECON1,WR
GOTO $-1
BCF STATUS,RP1
BCF STATUS,RP0
MOVF DATA_EE_ADDR,W
BSF STATUS,RP1
MOVWF EEADR
BCF STATUS,RP1
MOVF DATA_EE_DATA,W
BSF STATUS,RP1
MOVWF EEDATA
BSF STATUS,RP0
BCF EECON1,EEPGD
BSF EECON1,WREN
BCF INTCON,GIE
MOVLW 55h
MOVWF EECON2
MOVLW 0xAA
MOVWF EECON2
BSF EECON1,WR
BSF INTCON,GIE
BTFSC EECON1,WR ;Esperar a que finalice la escritura....
GOTO $-1
BCF EECON1,WREN
BCF STATUS,RP1
BCF STATUS,RP0
RETURN
Lee_Eeprom
BCF STATUS,RP1
BCF STATUS,RP0
MOVF DATA_EE_ADDR,W
BSF STATUS,RP1
MOVWF EEADR
BSF STATUS,RP0
BSF EECON1,EEPGD
BSF EECON1,RD
BCF STATUS,RP0
MOVF EEDATA,W
BCF STATUS,RP1
BCF STATUS,RP0
RETURN
INCLUDE <Retardos.inc>
END