verwende doch bitte erstmal die [c o d e] - tags für den quellcode, macht das ganze übersichtlicher

dann zu folgenden zeilen ein paar fragen

PORTC = ~empfang; //wird nicht ausgeführt

wie kommst du auf die aussage ?

PORTC = ~'D'; //verharrt hier während des delay

WELCHES delay ?

also nur mal so vom programmablauf, du setzt PORTC auf 0 oder 'E', ein interrupt kommt, logischerweise springt die anzeige sofort auf 'D' ... dann kommst du in deine if-abfrage, zeigst das empfangene byte für ein paar µS an und löscht es dann sogleich wieder mit

PORTC = ~empfang;

nimm einfach mal alles was du mit PORTC machst raus und belasse es mal bei der if abfrage mit

PORTC = ~a;