1 - use the appropriate I2C address for the device based on the hardware pin state
2) Slave Address
Slave Address is 2 types, it is determined by ADDR Terminal
ADDR = ‘H’ ( ADDR ≧ 0.7VCC ) → “1011100“
ADDR = 'L' ( ADDR ≦ 0.3VCC ) → “0100011“


2 - the device address for case 1 is $B8 and case 2 is $46 (use one of these values in cnt)
When you put the address as shown in your code, the leading bit is 0 and the address will be $5c or $23. This is definitely wrong.

3 - cnt remains the same for I2CWrite and I2CRead. the least significant bit is changed internally by the compiler depending on whether the command is a read or write