;****************************************CABEZERA*************************************************************
List P=16F877A
INCLUDE P16F877A.inc
RADIX HEX
__CONFIG _WDT_OFF&_PWRTE_ON&_XT_OSC&_LVP_OFF&_CP_OFF
;****************************************DECLARAR VARIABLES**************************************************
CBLOCK 0X20
PDel0
PDel1
PDel2
ENDC
;**************************************VECTORES**********************************
ORG 0
GOTO CONFIGURACION
ORG 5
;****************************************CONFIGURACION INICIAL**********************************************
CONFIGURACION
BSF STATUS,RP0
BCF STATUS,RP1
CLRF TRISB
MOVLW 0XFF
MOVWF TRISC
;CLRF TRISC
MOVLW B'10000000'
MOVWF SSPSTAT
MOVLW .9
MOVWF SSPADD
BCF STATUS,RP0 ; TE CAMBIAS AL BANCO 0
MOVLW B'00101000'
MOVWF SSPCON
CLRF PORTB
GOTO PRINCIPAL
;*******************************************DELAY ENTRE DATO Y DATO*****************************************+++++
;500MS
DEMORA movlw .239 ; 1 set numero de repeticion (B)
movwf PDel0 ; 1 |
PLoop1 movlw .232 ; 1 set numero de repeticion (A)
movwf PDel1 ; 1 |
PLoop2 clrwdt ; 1 clear watchdog
PDelL1 goto PDelL2 ; 2 ciclos delay
PDelL2 goto PDelL3 ; 2 ciclos delay
PDelL3 clrwdt ; 1 ciclo delay
decfsz PDel1, 1 ; 1 + (1) es el tiempo 0 ? (A)
goto PLoop2 ; 2 no, loop
decfsz PDel0, 1 ; 1 + (1) es el tiempo 0 ? (B)
goto PLoop1 ; 2 no, loop
PDelL4 goto PDelL5 ; 2 ciclos delay
PDelL5 goto PDelL6 ; 2 ciclos delay
PDelL6 goto PDelL7 ; 2 ciclos delay
PDelL7 clrwdt ; 1 ciclo delay
return ; 2+2 Fin.
;****************************************INICIALIZA I2C*****************
S_START
BCF PIR1,SSPIF ; CON ACK
BSF STATUS,RP0
BSF SSPCON2,SEN
BCF STATUS,RP0
START_W
BTFSS PIR1,SSPIF
GOTO START_W
RETURN
;***************************************DETIENE I2C**************************
S_STOP
BCF PIR1,SSPIF
BSF STATUS,RP0
BSF SSPCON2,PEN
BCF STATUS,RP0
STOP_W
BTFSS PIR1,SSPIF
GOTO STOP_W
RETURN
;****************************************ENVIA DATO******************************
S_BYTE
BCF PIR1,SSPIF
MOVWF SSPBUF
SEND_B
BTFSS PIR1,SSPIF
GOTO SEND_B
RETURN
;******************************************RECIVED DATO***************************
R_BYTE
BCF PIR1,SSPIF ;PARA GRABAR
BSF STATUS,RP0
BSF SSPCON2,RCEN
BCF STATUS,RP0
READ_W
BTFSS PIR1,SSPIF
GOTO READ_W
BCF PIR1,SSPIF
BSF STATUS,RP0
BCF SSPCON2,ACKDT
BSF SSPCON2,ACKEN
BCF STATUS,RP0
ACK_W
BTFSS PIR1,SSPIF
GOTO ACK_W
CALL DEMORA
MOVF SSPBUF,W
MOVWF PORTB
RETURN
;*******************************************PRINCIPAL************************************
PRINCIPAL
ESCRIBIR
CALL S_START ;start
MOVLW B'10101100' ; byte identificador a W ULTIMO BIT INDICA SI GRABA O LEE Y LOS ULTIMOS BITS DE LA DIRECCION ALTA (1 A1 A2 A3 B2 B1 BO R\W) VER DATASHEET
CALL S_BYTE ; envio de byte en W, que es identificador
;MOVLW .0 ; direccion alta
;CALL S_BYTE ; envio de direccion alta PARA MEMORIAS MAYORES A 16K
MOVLW .1 ; direccion baja
CALL S_BYTE ; envio de direccion baja
MOVLW 0XAA ; dato a grabar en posicion 000h
CALL S_BYTE ; envio de dato a grabar
CALL S_STOP ; stop, si deseas, mandas mas datos antes de parar
CALL DEMORA
LEER
CALL S_START ;start
MOVLW B'10101101' ; byte identificador a W ULTIMO BIT INDICA SI GRABA O LEE Y LOS ULTIMOS BITS DE LA DIRECCION ALTA (1 A1 A2 A3 B2 B1 BO R\W) VER DATASHEET
CALL S_BYTE ; envio de byte en W, que es identificador
;MOVLW .0 ; direccion alta
;CALL S_BYTE ; envio de direccion alta
MOVLW .1 ; direccion baja
CALL S_BYTE ; envio de direccion baja
CALL R_BYTE
BCF PORTB,0
CALL S_STOP
SLEEP
END