Quelqu'un peut m'expliquer ce qu'il ne va pas ???

j'ai construit un boitier permettant par le biais d'une prise DB9, d'enregistrer chaque donnée qui arrive dans une case mémoire . lorsque je le désire j'appui sur BP2 qui doit afficher a l'écran les données de la premiere trame, puis la 2eme ...etc... , et la il se pose DEUX problèmes... si je laisse comme suit, rien ne s'affiche à l'écran, l'interruption bloque tout, je sais que c'est l'interuption car quand je l'enleve les deux boutons fonctionne... mais si je détache le "#int_RDA()" et le reste de l'interruption (je veux dire qu'il y a quelque chose entre les deux ! ) elle ne bloque plus rien ... ! Donc est ce que je peux les laisser détachées ?
Deuxième problème en admettant que l'interruption ne bloque rien... j'envoi par le biais de l'ordi un "d" , je devrait voir à l'écran son code en décimal (voir mon printf) , mais au lieu de ca il m'afiche un "0", si je rappui un "-5" etc etc.. du caca quoi !!
Qu'est ce que j'ai fai de mal ?
Toutes les suggestions sont les bienvenues !!

Programme :
Code:
#include "C:\Documents and Settings\pc\Bureau\GOUDET PROJET 2008\lcd test\test.h"
#include <LCD628.C>
#use rs232(baud=2400,parity=N,xmit=PIN_B2,rcv=PIN_B1,bits=8)

//================================================== ================================
#define BP1 input(pin_B0)
#define BP2 input(pin_B5)
//=======================
int x=0,y=0;
int d[50];
//=======================

#int_rda //reception de la liaison serie en interruption
void RDA_isr()
 {
if(RCIF)
	{
	d[x]=getc(); // enregistrer la donnée dans d[x]
	y=x; // égalité
	x++; // incrémentation
	}
 }

/* definition des fonctions ================================================== ====*/

void affi_bienvenue(); //affichage mode manuel

/* definitions des fonctions ================================================== ===*/


void affi_bienvenue()
{
printf(displays,"\f Banc Test 2008 ");
printf(displays,"\n Goudet--Lourds \n");
delay_ms(2000);
printf(displays,"\f Entreprise ");
printf(displays,"\n Flash Elek \n");
delay_ms(2000);
printf(displays,"\f Responsable ");
printf(displays,"\n Jean Gougeron \n");
delay_ms(2000);
printf(displays,"\f");
}


 
//================================================== ===============================
void main()
{

setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1); // Quartz 4MHz
setup_timer_1(T1_DISABLED); // pas de timer T1
setup_timer_2(T2_DISABLED,0,1);// pas de timer T2
setup_comparator(NC_NC_NC_NC); // comparateur pas utilisés
setup_vref(FALSE); // pas de tension de référence (automatique avec CCS C)
lcd_init(); // initialisation LCD
enable_interrupts(GLOBAL);
enable_interrupts(INT_RDA);




while(true)
	{
	if (BP1==0) // si appui sur le bouton BP1
		{
		affi_bienvenue();
		}

	if (BP2==0) // si appui sur le bouton BP2

		{
		delay_ms(1500); // plus de 1.5 secondes
		if (!BP2)

			{
			x=0; // on réinitialise y,x en faisant clignoter
			y=0; // " réinisialisation " à l'écran 3 fois
			printf(displays,"\freinisialisation");
			printf(displays,"\n en cours... ");
			delay_ms(500);
			printf(displays,"\f");
			delay_ms(500);
			printf(displays,"\freinisialisation");
			printf(displays,"\n en cours... ");
			delay_ms(500);
			printf(displays,"\f");
			delay_ms(500);
			printf(displays,"\freinisialisation");
			printf(displays,"\n en cours... ");
			delay_ms(500);
			printf(displays,"\f");
			}
	
		else // sinon
			{
			printf(displays,"\f"); // on efface l'écran
			printf(displays,"%d",d[y]); // on affiche le caractère dans buffer[y]
			y++; // puis on incrémente y
			}
	
		}
	
	}
}