I2cSendByte movwf I2cTemp
bsf STATUS,C ;ensures Data isn't zero until 8 bits sent
OutLoop bcf SCL ;clock low
rlf I2cTemp,f ;move bit to carry flag
bcf SDA ;set data low
btfsc STATUS,C ;was bit 1
bsf SDA ;yes data high
call DelayHalf ;10 cycle delay
bsf SCL ;clock high
call DelayHalf
bcf STATUS,C ;ensure 0 shifted into temp
movfw I2cTemp ;data = 0x80
xorlw 0x80
btfss STATUS,Z
goto OutLoop ;no, keep going
;GetAck
bcf SCL ;pull clock low
bsf SDA ;release data
call DelayHalf
bsf SCL ;release clock
bcf STATUS,RP0 ;B0, look at port b
WaitSCL btfss SCL ;is clock stretched
goto WaitSCL ;yes, wait
call DelayHalf
bcf STATUS,Z ;return z=0 if NAck
btfss SDA
bsf STATUS,Z ;return z=1 if Ack
bsf STATUS,RP0
return ;in bank 1