I think that you have misunderstood the way that the TRISC register works, and how to drive the I2C bus.
The TRISC register enables or disables the outputs for port C. Each bit controls one pin. When bit 0 of TRISC is high, the RC0 is high impedance (i.e. and input) and bit 0 of PORTC can be read as an input.
When using I2C it is common to make the output bit low, and turn on and off the TRIS bit to make the line go up and down. The pull-up resistor makes the line go high when the TRIS bit is high, and the output pulls the line low when it is enabled by clearing the TRIS bit.
With the I2C bus there are two lines, clock and data, and so you need two bits to be turned on and off. The example you are working from has:-
#define SCL TRISB4 // I2C bus
#define SDA TRISB1 //
so that application uses bits 1 and 4 of port B, also known as RB1 and RB4
The defines have meant that he can write code like:-
which just means that the data line is driven low by the PIC.
You have written:
#define SCL TRISC // I2C bus
#define SDA TRISC //
which looks similar but makes no sense, because you have defined SCL and SDA, which are bits, as equal to the whole 8 bit port.
Your line
SDA = TRISC | 0x58; //0101 1000
This really shows that you haven't understood what is going on. You defined SDA to be TRISC. That is just a shorthand so that you can use "SDA" instead of "TRISC", which would be OK if "SDA" in this case wasn't a bit. However, you then go and use both "SDA" and "TRISC" in the same line, just making your code more difficult to read.
Also, the line means:-
Collect the contents of TRISC
OR it with 0b01011000
move the result to SDA (also known as TRISC)
So that is potentially setting 3 bits, not one. It also means that the line following the delay,
SCL = TRISC | 0x48; //0100 1000
does nothing as those bits are set already.
The I2C protocol calls for individual bits to be set and cleared, one at a time, with a pause between them.
If you wanted to use the TRIS byte like that, you would write:
TRISC = TRISC | 0x10;
to set a single bit, bit 4 in this example
or
TRISC = TRISC & 0xEF;
to clear a bit 4.
However,
TRISC4 = 1;
and
TRISC4 = 0;
are a lot easier to write and to understand.
You need to define SCL and SDA as the appropriate bits of the TRIS registers (TRISC3 and TRISC4, I think) and then put the rest of the code back to as the example, which looks like it works.