By the way, I did manage to get the LCD to work by polling the busy flag. In class you said a TA had trouble doing this.

I think I might know what went wrong. If you poll the busy flag, you still need to insert a delay after it before polling it again. Otherwise you get stuck in an infinite loop. I was having trouble with this at first. That's why I bring it up as a possible source of error from the TA. However, I don't know how much more efficient checking the busy flag is in comparison to inserting a delay after every character (since the busy flag requires its own delay). However, it does save some typing time since you don't have to actually JSR to a delay routine after writing each individual nibble.