Hola, POCHER,
Si asi es, solo se produce una interrupcion cuando rb4:rb7 son entradas la confuncion me vino porque en una version de mplab el simulador cometia este fallo, por lo tanto rectifico, puede tener por ejemplo rb4 y rb5 como entradas que disparan la interrupcion cuando cambian de estado y rb6 y rb7 como salidas haciendo cualquier cosa, que no disparan la interrupcion por cambio de estado.
En cuanto al ejemplo aqui va comentado
#INT_RB
RB_isr() { // selector de ON - OFF
cmd=swap(INPUT_B() & 0x30); // carga en la variable cmd el valor del puerto
// enmascarando los bits 4 y 5 que son las botoneras
// luego hace un swap para tener el valor lsb.
switch (cmd) {
case 1: // si es 1 set bandera ON
on=true;
break;
case 2: // si es 2 clear bandera ON
on=false;
break;
case 3: // si es 3 sale
break;
}
}
Ahora bien, ON es una variable del tipo short, entonces mi programa de funcionamiento esta en un while (on){}
por lo tanto lo que hago es poner en 1 o 0 la variable y de esta manera ejecuto o no una secuencia, no manejo niguna salida, de esta manera me evito de hacer polling en la secuencia del programa sobre los botones de comando y ademas como condiciona el while siempre termina la secuencia completa, es frio el dialogo y tambien no soy muy bueno explicando , je je no es lo mio la docencia, no te hagas problemas si no entiendes es por mi culpa.

Mi ejemplo tambien muestra como puedes individualizar que entrada cambio de 0 a 1 conviertiendolo en un valor para realizar una opracion determinada que es la pregunta del inicio de este post.
En el caso que mencionas del motor de dos sentidos , ni cuando uso PLC dejo de enclavar a travez de contactos auxiliares NC las bobinas de los contactores pues es la unica manera de que no te explote todo por el aire por mas seguro que sea tu programa.
un saludo
Ariel