Da du an verschiedenen Stellen Änderungen vornimmst, hat es wenig Sinn nur einen Teil des Codes zu posten. Leider kann ich nur theoretische Überlegungen anstellen, da mir die Hardware zum Testen fehlt. Aber wenn es ohne ISR ging dann muss es auch mit funktionieren.

Außerdem hatte ich dir ja weiter oben schon gesagt, dass du nicht vergessen sollst das RX_ready wieder auf 0 zu setzen wenn du putchar aufgerufen hast, sonst sendet der immer wieder the_char da RX_ready aus der ISR auf 1 gesetzt wurde.

Wenn du den restlichen Code noch so hast wie bisher, dann hast du auch 2 unabhängige Variablen the_char. Die in der ISR deklarierte ist nämlich eine andere als die globale. D.h. selbst wenn deine ISR mal funktioniert wirst du in the_char für das putchar nie was empfangenes drin haben. Verstehst du den Unterschied zwischen lokalen und globalen Variablen? Variablen die im normalen Programmablauf und in einer ISR verwendet werden müssen als volatile deklariert werden.

Pass das Programm mal an und reduziere die ISR auf das Setzen des RX_ready (wird auch im main() und in der ISR verwendet) und das RI0 rücksetzen und das SBUF0 in the_char Schreiben.

Die 3 Funktionen können auch erst mal weg. Da haben wir dann nur noch den relevanten Code und versuchen uns mal ranzutasten.
Ein Zeichen empfangen und zurücksenden mit RX-ISR

sast