Problem with displaying characters on LCD
You have a fundamental problem with how you have coded the LCD controller busy flag check routine.

Referencing the HD44780 character mode LCD data sheet found at Sparkfun there is this timing sequence chart:



You will note that it is necessary to have the E pin high to be able to see the DB7 busy bit. In your code you pulse the E pin but the wait 1msec before even looking at the DB7. By the time you look any valid data is gone. You want to sample DB7 while the E is still high.

The typical way I code an LCD driver is to make low low level routines to support WriteCmd, ReadSts, WriteDat and ReadDat. Then the LCD busy check is a loop that calls the ReadSts inside a loop and checks the readback D7 value each read.

Another thing to be aware of is that the best time to do the LCD busy check is just BEFORE you intend to do a transaction to the LCD. This way you can get a small performance boost because your code can go off to do other things after the last write to LCD controller.