; "**********************"
; "* Microprocesadores II *"
; "* Originally by *"
; "* Sr.Alex Erazo Ruiz *"
; "* PIC16F84A Version *"
; "* UNIVALLE *"
; "* Apr 2011 *"
; "**********************"
;PROGRAMA BASE PARA LA COMUNICACION I2C SE DEBE TENER EN
;CUENTA QUE ANTES DE ENVIAR EL I2C_ENVIABYTE( ENVIAR DATO )
;TENEMOS QUE HABER CARGADO EL DATO EN W
LIST P=16F84A
INCLUDE <P16F84A.INC>
ESTADO EQU 03H
PUERTAA EQU 05H
PUERTAB EQU 06H
F EQU 1
W EQU 0
C EQU 0
CBLOCK 0CH
I2C_CONTBITS
I2C_DATO
I2C_FLAGS
ENDC
#DEFINE I2C_LASTBYTE I2C_FLAGS,0
#DEFINE SCL PUERTAA,3
#DEFINE SDA PUERTAA,4
#DEFINE SLAVE B'10101010'
ORG 00
GOTO INICIO
ORG 05H
RETARDO4US NOP
NOP
NOP
NOP
RETURN
SDA_BAJO BSF ESTADO,5
BCF SDA
BCF ESTADO,5
BCF SDA
RETURN
SDA_ALTO BSF ESTADO,5
BCF SDA
BCF ESTADO,5
RETURN
SCL_BAJO BSF ESTADO,5
BCF SCL
BCF ESTADO,5
BCF SCL
RETURN
SCL_ALTO BSF ESTADO,5
BCF SCL
BCF ESTADO,5
RETURN
SCL_WAITALTO BTFSS SCL
GOTO SCL_WAITALTO
RETURN
;ENVIO CONDICION DE START
I2C_ENVIASTART CALL SDA_ALTO
CALL SCL_ALTO
CALL RETARDO4US
CALL SDA_BAJO
CALL RETARDO4US
CALL SCL_BAJO
CALL RETARDO4US
RETURN
;ENVIO CONDICION DE STOP
I2C_ENVIOSTOP CALL SDA_BAJO
CALL SCL_ALTO
CALL RETARDO4US
CALL SDA_ALTO
CALL RETARDO4US
RETURN
;ENVIAR DATO
I2C_ENVIABYTE MOVWF I2C_DATO
MOVLW 08H
MOVWF I2C_CONTBITS
I2C_ENVIABIT RLF I2C_DATO,F
BTFSC ESTADO,C
GOTO I2C_ENVIA1
I2C_ENVIA0 CALL SDA_BAJO
GOTO I2C_FLANCOSCL
I2C_ENVIA1 CALL SDA_ALTO
I2C_FLANCOSCL CALL SCL_ALTO
CALL RETARDO4US
CALL SCL_BAJO
CALL RETARDO4US
DECFSZ I2C_CONTBITS,F
GOTO I2C_ENVIABIT
CALL SDA_ALTO
CALL SCL_ALTO
CALL RETARDO4US
CALL SCL_BAJO
CALL RETARDO4US
RETURN
;READ
I2C_READBYTE MOVLW 08H
MOVWF I2C_CONTBITS
CALL SDA_ALTO
I2C_READBIT CALL SCL_ALTO
BCF ESTADO,C
BTFSC SDA
BSF ESTADO,C
RLF I2C_DATO,F
CALL SCL_BAJO
CALL RETARDO4US
DECFSZ I2C_CONTBITS,F
GOTO I2C_READBIT
BTFSS I2C_LASTBYTE
CALL SDA_BAJO
CALL SCL_ALTO
CALL RETARDO4US
CALL SCL_BAJO
CALL RETARDO4US
MOVF I2C_DATO,W
RETURN
END
espero haberles colaborado
el restoo es solo llamar a estas subrutinas ( I2C_ENVIASTART--I2C_ENVIABYTE--I2C_ENVIOSTOP )