Ok I've got a flashing cursor and can control the contrast via a trimpot but I can't see any text. I can however see the text for about half a second if I randomly disconnect and short the V1-V4 pins.
Here is the list of commands I've sent the display via I2C:
Power on:
//Sequence to trigger power on initialisation
VSS = 1;
delay(5); //power on for 0.1<trcc<10ms
VSS = 0;
delay(10); //power back on aftertoff>1ms
VSS = 1;
delay(85); //delay 40ms for power to stabilise
i2c_enable();
i2c_start();
i2c_sbyte(0x78); //(Slave address << 1 & RS bit)
i2c_sbyte(0x00); //(Control byte)
i2c_sbyte(0x0F); //(Power on)
i2c_stop();
i2c_disable();
Display 'abc' on line 1:
//Line 1 DDRAM address 00 - OF
//Line 2 DDRAM address 10 - 1F
//Line 3 DDRAM address 20 - 2F
/* Control Byte format: CO,RS,000000) Where CO = 0 (Last Control byte to be send)
CO = 1 (More control bytes to follow after each Data byte)*/
int result;
i2c_enable();
i2c_start();
i2c_sbyte(0x78); //Slave address of display 1 (3C << 1) & 0(R/W) (Slave address-7bits-(xxxxxxx,R/W)
i2c_sbyte(0x80); //Control byte = Interleave Control byte, data byte etc. RS = 0
i2c_sbyte(0x80); //Set DDRAM address to 0 for first character
//wait 27us
i2c_sbyte(0xC0); //Control byte to enable writing to DDRAM, more control bytes to follow RS = 1 CO = 1
i2c_sbyte(0x61); //write 'a' (0110 0001) to address 0
i2c_sbyte(0x80); //Control byte = Interleave Control byte, data byte etc. RS = 0
i2c_sbyte(0x81); //Set DDRAM address to 1 for first character
//wait 27us
i2c_sbyte(0xC0); //Control byte to enable writing to DDRAM, more control bytes to follow RS = 1 CO = 1
i2c_sbyte(0x62); //write 'b' (0110 0010) to address 1
i2c_sbyte(0x80); //Control byte = Interleave Control byte, data byte etc. RS = 0
i2c_sbyte(0x82); //Set DDRAM address to 1 for first character
//wait 27us
i2c_sbyte(0xC0); //Control byte to enable writing to DDRAM, more control bytes to follow RS = 1 CO = 1
i2c_sbyte(0x63); //write 'c' (0110 0010) to address 2
i2c_stop();
i2c_disable();