Hola oman.
kbhit() se usa cuando quieres saber si en el bufffer de recepcion de hardware hay un dato, cuando usas interrupcion, el hard te levanta la indicacion de interrupcion cuando hay data en el buffer, por lo que preguntar nuevamente es redundante, mejor dicho no es necesario.
El return dentro de la funcion de interrupcion no es necesario ya que el compilador realiza el procedimiento con los registros necesarios por ti, mejor dicho no es necesario.
cuando haces uso de pausas por soft: delay_ms(2000) te hara que pierdas datos recibidos por el puerto serie, mejor usa un indicador de que hay dato para enviar por USART, por ejemplo usa una variale tipo int1, en la funcion de interrupcion colocala a 1, y en el bucle principal pregunta si esta a 1 para que muestres en LCD al mismo tiempo que la colocas a 0 para que no este enviando a cada momento.
espero te sea util.
saludos