HOLA A TODOS!!!
Gracias por su ayuda. Creo que en este hilo se muestran unas cuantas formas de alternar de uno a cero el pin de un puerto. Al final todas o casi todas la formas que me habeis comentado han funcionado, por lo tanto... mi programa es el que daba problema.
A parte de que me ayudasteis a extructurarlo, me llevasteis a hacer pruebas que no habia tenido en cuenta, me recordasteis la importancia de rsetear banderas y variables.... logré hacerlo funcionar.... poniendo un retardo de 50 ms.
Coloco aquí varias formas en las que funciono el "toggle_pin" o la "XOR del puerto" :
if ((Xok==1)&&(valor[0]<S0Y2)&&(valor[0]>S0Y1))//opcion 1
{
Xok=0;
D0^=1;
}
if ((Xok==1)&&(valor[0]<S0Y2)&&(valor[0]>S0Y1))//opcion2
{
Xok=0;
PORTD^=(0X01);
}
if ((Xok==1)&&(valor[0]<S0Y2)&&(valor[0]>S0Y1))//opcion 3
{
Xok=0;
output_toggle(PIN_D0);
}
if ((Xok==1)&&(valor[0]<S1Y2)&&(valor[0]>S1Y1))//opcion 4
{
Xok=0;
toggle1 = ~toggle1;
D1=toggle1;
}
if ((Xok==1)&&(valor[0]<S0Y2)&&(valor[0]>S0Y1))//opcion 5
{
Xok=0;
toggle = ~toggle;
if(toggle) D0=1;
else D0=0;
}
Ahora os dejo el código como lo tengo en estos momentos.Lo extructuraré más pero ahora el siguiente paso es controlar la comunicación rs232 pero para enviar datos y conseguir emitir un "pitido" para una pulsación válida en la touch. Sobre este tema preguntaré en el hilo "mil vueltas sobre una secilla comunicacion serie", nos vemos por alli. Gracias por la estimable gran ayuda!!!

Código:
#include <16f877.h>
#fuses HS,NOWDT,NOPROTECT,NOPUT,NOBROWNOUT,NOLVP,NOCPD,NOWRT
#use delay(clock=20000000)
#use RS232 (baud=38400, bits=8, parity=N, xmit=PIN_C6, rcv=PIN_C7)
//#use RS232 (baud=38400, xmit=PIN_C6, rcv=PIN_C7)
#use fast_io(A)
#use fast_io(B)
#use fast_io(C)
#use fast_io(D)
#use fast_io(E)
#byte PORTA = 0X05
#byte PORTB = 0X06
#byte PORTC = 0X07
#byte PORTD = 0X08
#byte PORTE = 0X09
#bit D0=PORTD.0
#bit D1=PORTD.1
#bit D2=PORTD.2
const int SX1=0X2B;//coordenadas max y min: X
const int SX2=0X61;
const int S0Y1=0X26;//coordenadas max y min: Y_TECLA S0
const int S0Y2=0x3C;
const int S1Y1=0X40;//coordenadas max y min: Y_TECLA S1
const int S1Y2=0x59;
const int S2Y1=0X5B;//coordenadas max y min: Y_TECLA S2
const int S2Y2=0x73;
int1 Xok=0;
int lectura=0;
int valor[4];
int i=0;
int1 flag=0;
#int_rda
void RDA_isr()
{
lectura=getc();
valor[i]=lectura;
i++;
if(i==4)
{
flag=1;
i=0;
}
}
/*void RDA_isr()
{
lectura=getc();
if(flag==0){
valor[i]=lectura;
i++;
if(i==4)
{
flag=1;
i=0;
}
}
} */
void main()
{
delay_ms(50);//incialización controlador
SET_TRIS_A (0xFF);
SET_TRIS_B (0x00);
SET_TRIS_C (0x80);
SET_TRIS_D (0X00);
setup_adc(ADC_OFF);
setup_spi(FALSE);
setup_psp(PSP_DISABLED);
/*for(i=0;i<4;i++)
{
valor[i]=0;
}*/
//flag=0;
//lectura=0x00;
PORTD=0X00;
PORTB=0X00;
enable_interrupts(INT_RDA);
enable_interrupts(GLOBAL);
while(true)
{
if(flag==1)
{
delay_ms(50);
flag=0;
if((valor[2]<(SX2))&&(valor[2]>(SX1)))//las X; las 3 teclas en este caso están alineadas verticalmente==>mismas coordenadas X
{
Xok=1;
}
if ((Xok==1)&&(valor[0]<S0Y2)&&(valor[0]>S0Y1))
{
Xok=0;
output_toggle(PIN_D0);
}
if ((Xok==1)&&(valor[0]<S1Y2)&&(valor[0]>S1Y1))
{
Xok=0;
output_toggle(PIN_D1);
}
if ((Xok==1)&&(valor[0]<S2Y2)&&(valor[0]>S2Y1))
{
Xok=0;
output_toggle(PIN_D2);
}
}//flag==1
}//while(1)
}//main()