1' Slave - 16F88 - Internal 8Mhz
Code:
'------------------------------------------------------------------------------
'------------------------------------------------------------------------------
' Slave
'------------------------------------------------------------------------------
'------------------------------------------------------------------------------

@ device pic16f88, intrc_osc_noclkout	' system clock options
@ device pic16f88, wdt_on			' watchdog timer
@ device pic16f88, pwrt_on			' power-on timer
@ device pic16f88, mclr_off			' master clear options (internal)
@ device pic16f88, protect_off		' code protect off

'--- set device ---------------------------------------------------------------

DEFINE OSC 8
OSCCON = %01110001 '8mhz

'------------------------------------------------------------------------------

CMCON = 7
ADCON1 = 0 ' Disable A/D converter
ADCON0 = 0
ANSEL = 0 ' all analog pins to digital

'--- tris port config here (don't use SCL & SDA pins other than I2C) ----------

DEFINE I2C_HOLD 1

TRISB.1 = 1
TRISB.4 = 1

'--- Alias pins ---------------------------------------------------------------

SDADIR VAR TRISB.1
SCLDIR VAR TRISB.4

'--- Define here your variables and alias -------------------------------------

LEDT VAR PORTA.2
LEDL VAR PORTB.7
LEDM VAR PORTB.6
LEDR VAR PORTB.5
readcnt VAR BYTE
datain VAR BYTE
WrData VAR BYTE

'--- Define used register flags ------------------------------------------------

SSPIF               VAR PIR1.3    ' SSP (I2C) interrupt flag
SSPIE               VAR PIE1.3 
BF                  VAR SSPSTAT.0 ' SSP (I2C) Buffer Full
R_W                 VAR SSPSTAT.2 ' SSP (I2C) Read/Write
D_A                 VAR SSPSTAT.5 ' SSP (I2C) Data/Address
CKP                 VAR SSPCON.4  ' SSP (I2C) SCK Release Control
SSPEN               VAR SSPCON.5  ' SSP (I2C) Enable
SSPOV               VAR SSPCON.6  ' SSP (I2C) Receive Overflow Indicator
WCOL                VAR SSPCON.7  ' SSP (I2C) Write Collision Detect
STAT_BF             VAR SSPSTAT.0 ' SSP (I2C) Buffer Full
STAT_RW             VAR SSPSTAT.2 ' SSP (I2C) Read/Write
STAT_DA             VAR SSPSTAT.5 ' SSP (I2C) Data/Address
CKE                 VAR SSPSTAT.6 ' SSP (I2C) Data/Address

'--- Rx Buffer defintion ------------------------------------------------------

RxBufferLEN         CON 1       
RxBuffer            VAR BYTE[Rxbufferlen]
RxBufferIndex       VAR BYTE

'--- Tx Buffer defintion ------------------------------------------------------

TxBufferLEN         CON 1
TxBuffer            VAR BYTE[txbufferlen]
TxBufferIndex       VAR BYTE

'--- Define constants ---------------------------------------------------------

I2Caddress          CON $3 ' Make address = 3

'--- Initialize I2C slave mode ------------------------------------------------

SCLDIR = 1          ' SCL must be an input before enabling interrupts
SDADIR = 1   
SSPADD = I2Caddress ' Set our address
SSPCON = $36        ' Set to I2C slave with 7-bit address
SSPSTAT = 0
SSPIE = 1 
SSPIF = 0 
RxBufferIndex = 0
TxBufferIndex = 0

'--- Initialization Done! -----------------------------------------------------

GoTo main

'--- I2C subroutine  ----------------------------------------------------------

i2cslave:                                      ' I2C slave subroutine
          SSPIF = 0                            ' Clear interrupt flag
          IF R_W = 1 Then i2crd                ' Read data from us
          IF BF = 0 Then i2cexit               ' Nothing in buffer so exit
          IF D_A = 1 Then i2cwr                ' Data for us (not address)
          IF SSPBUF != I2Caddress Then i2cexit ' Clear the address from the buffer
          readcnt = 0                          ' Mark as first read
          GoTo i2cexit

i2cwr:                                ' I2C write data to us
       datain = SSPBUF                ' Put buffer data into array
       Rxbuffer[Rxbufferindex]=datain
       Rxbufferindex=rxbufferindex+1

       IF rxbufferindex=RxBufferLEN Then           ' end of buffer transfer 
          WrData=1
          rxbufferindex=0
       EndIF

       GoTo i2cexit

i2crd:                                      ' I2C read data from us
       IF D_A = 0 Then
          TxBufferIndex = 0
       EndIF

       While STAT_BF : Wend                        ' loop while buffer is full

       wcol = 0                                    ' clear collision flag
       SSPBUF = TxBuffer[TxBufferIndex]

       While wcol 
             wcol = 0
             SSPBUF = TxBuffer[TxBufferIndex]
       Wend

       CKP = 1                                     ' release clock, allowing read by master
       TxBufferIndex = TxBufferIndex + 1           ' increment index
       IF TxBufferIndex = TxBufferlen Then         ' all bytes have been tx
          TxBufferIndex = 0                           ' reset index            
       EndIF
             
i2cexit:
         Return

'--- End I2C subroutine  ------------------------------------------------------

Main:
      txbuffer = 12

      IF SSPIF = 1 Then
         GoSub i2cslave
      EndIF

      SSPOV = 0
      WCOL = 0

      Select Case RxBuffer[0]
             Case 6
                     High LEDT
             Case 8
                     Low LEDT
      End Select

      WrData=0  
      GoTo Main


'------------------------------------------------------------------------------

End

'------------------------------------------------------------------------------
'------------------------------------------------------------------------------