If I had to debug it I'd use a scope to see the signals.
With it you exactly see the signals on the bus...you are able to detect software problems as well as hardware problems.

Hardware problems still may be:
* Missing or wrong value external pullup (soldering error?)
* wrong timing, maybe caused by too high external capacitance... or too early starting communication after reset/power up
* wrong signal levels (check whether they meet both microcontroller as well as display specifications)
* power supply issues ( level, ringing, slowly rising, overshot...missing capacitors...)

I recommend to use the hardware periferal instead of bit banging
And I recommend to use reliable library (the microC one should be) instead of building your own.
Don't trust random internet code.