I'd suggest going over the initialization code again and the other functions, it looks like you're not doing it right.
For example, see the datasheet of some 2x16 or 4x16 displays using controllers compatible with hd44870 , they have all the steps explained and first thing I noticed is that usually a larger delay is required before actually sending data to lcd displays - you may be sending data too soon, and that data may be ignored by the lcd controller.
See page 18 and 19 in this datasheet :
http://savedonthe.net/download/708/lcd_2x16.html and same datasheet explains a few pages above what each command does and so on.
And if everything fails, test your lcd display with 8 bit mode and then work your way to 4bit.