RI0 = 0;
if (RI0=1)
{ ...

wie soll da RI0 jemals 1 sein, wenn du es vorher auf 0 setzt? Außerdem ist in C der Vergleich ==

sast

edit:
Versuche es doch erst mal ohne Interrupt mit

Code:
sfr  SBUF = 0x99;
sbit RI   = 0x98;

char nb_getkey ()  
{
   char c;
   int i;

   while(!RI && i++<100);
   if(RI)
   {
      c = SBUF;
      RI = 0;
   }
   else
      c = '\3';
   return (c);
}
char b_getkey ()  
{
   char c;

   while (!RI);
   c = SBUF;
   RI = 0;
   return (c);
}
und Aufruf von b_getkey() oder nb_getkey() in der while(1){}. Ich bin mir nicht mehr sicher, ob du nicht auch EA=1 setzen musst. Ist schon mind. 4 Jahre her, dass ich was mit dem F300 gemacht hatte. Ich hoffe die defines stimmen, ansonsten anpassen.

Und das print würde ich aus der Interruptroutine nehmen.