Are you polling the BUSY flag (or its equivalent) before sending the next command to the LCD?
To save I/O pins, most of my projects connect via a write-only '595 shift register. Since I can't read the BUSY flag, I have to add delays after each character to ensure I don't overrun the slow LCD controller.