Este código que te pongo es la correción del tuyo: ya lo prové en proteus y funcionó de perlas, con el unico problema q no escribe la primera letra, es por que en tu programa no haz inicializado correctamente el lcd, en el datasheet del LCD indica la forma de inicializarlo: mandas 3 veces 38h por el bus (rs, rw = 0) esperando algo de 15 o 40 ms entre cada una y antes de la 1ra vez también, pero no verifiques BF antes de ninguna y luego continuas trabajando; esto lo haces antes de hacer cualquier cosa con el lcd, te recomiendo lo hagas al empezar el programa.
Lo que estaba mal en tu programa es:
1. que al mandar cualquier instrucción o caracter al lcd debes 1º poner los valores en el bus y en rs y rw, luego mandas un pulso en E (chekea la correccion)
esto se aplica tanto para proteus como para la implementación física
2. cuando verificas BF, en proteus debes mandar el pulso E, y luego verificar; esto no se cumple en la realidad, para que funcione en la implementación debes setear E, leer BF (salvarlo), resetear E y luego verificar el valor que tenía BF (chekea la correccion)
Eso es todo lo que corregí en tu programa.
Salu2
BRAULIO