				__config  _CP_OFF & _XT_OSC & _WDT_OFF & _PWRTE_ON & _LVP_OFF & _BODEN_OFF

				#include "p16f876.inc"  

				DATA_EE_ADDR			EQU         H'20'
				DATA_EE_DATA			EQU         H'21'
				INDIRIZZO_INIZIALE		EQU         H'22'
				INDIRIZZO_FINALE		EQU         H'23'
				VALORE                  EQU         H'24'

				ORG		0x000		
INIZIO

				BSF    	STATUS,RP0     		 ;banco 1
				MOVLW	B'11111111'	   		 ;porta A come ingresso
				MOVWF	TRISA	      		 
				MOVLW	B'00000000'	  		 ;porta B come uscita
				MOVWF	TRISB
				MOVLW	B'11111111'	  		 ;porta C come ingresso
				MOVWF	TRISC	   	  		 
				MOVLW   0X006 		  		 ;tutti gli ingressi digitali
				MOVWF   ADCON1        		
				BCF     STATUS,RP0    		 ;banco 0

 
				MOVLW   D'0'
			 	MOVWF   INDIRIZZO_INIZIALE
				MOVLW   D'32'
				MOVWF   INDIRIZZO_FINALE
				MOVLW   D'128'
				MOVWF   VALORE				
				CALL    RAMPA_CRESCENTE


				MOVLW   D'33'
			 	MOVWF   INDIRIZZO_INIZIALE
				MOVLW   D'95'
				MOVWF   INDIRIZZO_FINALE
				MOVLW   D'160'
				MOVWF   VALORE				
				CALL    RAMPA_DECRESCENTE


				MOVLW   D'96'
			 	MOVWF   INDIRIZZO_INIZIALE
				MOVLW   D'127'
				MOVWF   INDIRIZZO_FINALE
				MOVLW   D'96'
				MOVWF   VALORE				
				CALL    RAMPA_CRESCENTE

		
				MOVLW   D'128'				
			 	MOVWF   INDIRIZZO_INIZIALE
				MOVLW   D'191'
				MOVWF   INDIRIZZO_FINALE
				MOVLW   D'160'
				MOVWF   VALORE				
				CALL    LIVELLO

	
				MOVLW   D'192'				
			 	MOVWF   INDIRIZZO_INIZIALE
				MOVLW   D'255'
				MOVWF   INDIRIZZO_FINALE
				MOVLW   D'96'
				MOVWF   VALORE				
				CALL    LIVELLO

				GOTO   	READ_EEPROM

RAMPA_DECRESCENTE
				INCF    INDIRIZZO_FINALE,F
RIPETI_2
				MOVF    INDIRIZZO_INIZIALE,W
				BCF 	STATUS,RP0 
				BSF 	STATUS,RP1
				MOVWF   DATA_EE_ADDR
				BCF     STATUS,RP1
				MOVF    VALORE,W
				BSF     STATUS,RP1
				MOVWF   DATA_EE_DATA
				CALL    WRITE_EEPROM
				BCF     STATUS,RP1
				BCF     STATUS,RP0
				DECF    VALORE,F
				INCF    INDIRIZZO_INIZIALE,F
				MOVF    INDIRIZZO_FINALE,W
				BCF     STATUS,Z
				SUBWF   INDIRIZZO_INIZIALE,W
				BTFSS   STATUS,Z
				GOTO    RIPETI_2
				RETLW   0
RAMPA_CRESCENTE
				INCF    INDIRIZZO_FINALE,F
RIPETI_1
				MOVF    INDIRIZZO_INIZIALE,W
				BCF 	STATUS,RP0 
				BSF 	STATUS,RP1
				MOVWF   DATA_EE_ADDR
				BCF     STATUS,RP1
				MOVF    VALORE,W
				BSF     STATUS,RP1
				MOVWF   DATA_EE_DATA
				CALL    WRITE_EEPROM
				BCF     STATUS,RP1
				BCF     STATUS,RP0
				INCF    VALORE,F
				INCF    INDIRIZZO_INIZIALE,F
				MOVF    INDIRIZZO_FINALE,W
				BCF     STATUS,Z
				SUBWF   INDIRIZZO_INIZIALE,W
				BTFSS   STATUS,Z
				GOTO    RIPETI_1
				RETLW   0
LIVELLO
				INCF    INDIRIZZO_FINALE,F
RIPETI
				MOVF    INDIRIZZO_INIZIALE,W
				BCF 	STATUS,RP0 
				BSF 	STATUS,RP1
				MOVWF   DATA_EE_ADDR
				BCF     STATUS,RP1
				MOVF    VALORE,W
				BSF     STATUS,RP1
				MOVWF   DATA_EE_DATA
				CALL    WRITE_EEPROM
				BCF     STATUS,RP1
				BCF     STATUS,RP0
				INCF    INDIRIZZO_INIZIALE,F
				MOVF    INDIRIZZO_FINALE,W
				BCF     STATUS,Z
				SUBWF   INDIRIZZO_INIZIALE,W
				BTFSS   STATUS,Z
				GOTO    RIPETI
				RETLW   0
WRITE_EEPROM

				BSF 	STATUS,RP1 
				BSF 	STATUS,RP0
				BTFSC 	EECON1,WR 
				GOTO 	$-1 
				BCF 	STATUS, RP0 
				MOVF 	DATA_EE_ADDR,W 
				MOVWF 	EEADR 
				MOVF 	DATA_EE_DATA,W 
				MOVWF	EEDATA 
				BSF 	STATUS,RP0 
				BCF 	EECON1,EEPGD 
				BSF 	EECON1,WREN 
				MOVLW 	H'55' 
				MOVWF 	EECON2 
				MOVLW 	H'AA'
				MOVWF 	EECON2 
				BSF 	EECON1,WR 			
				BCF 	EECON1,WREN 
				RETLW   0
				GOTO    WRITE_EEPROM
READ_EEPROM

				BSF 	STATUS,RP1         ;banco 2
				MOVF 	DATA_EE_ADDR,W     ;indirizzo cella eeprom
				MOVWF 	EEADR 		   	   ; 
				BSF 	STATUS,RP0		   ;banco 3 
				BCF 	EECON1,EEPGD 	   ;accesso a eeprom 
				BSF 	EECON1,RD 	       ;inizia la lettura
				BCF 	STATUS,RP0 		   ;banco 2
				MOVF 	EEDATA,W 		   ;legge il dato contenuto nella cella
				INCF 	DATA_EE_ADDR,F	   ;incrementa l'indirizzo della cella
				BCF 	STATUS,RP1 		   ;banco 0
				MOVWF 	PORTB			   ;pone il dato letto sulla porta B
				GOTO  	READ_EEPROM	       ;ricomincia daccapo
END
