Mejor algo asi imagino:
bool SelectADC_Canal(unsigned char canal) {
if (ADCON0bits.GO == 1) { return ERROR;}
ADCON0 = (canal << 2) + 1;
return OK;
}
Me explico el porque...
Los unicos 2 bits que tenes son el 0 (ADON) y el 1 (GO/DONE),
Si estas cambiando de canales, estas usando el ADC, por lo tanto lo tendrias activo, es decir ADON siempre seria 1. No creo que quieras cambiar canal y tener el modulo del ADC apagado, no le veo sentido. Ya que seguramente lo actives en el comienzo y quede asi para siempre.
El bit GO/DONE te permite saber si hay una lectura en progreso, por lo tanto al estar en 1 significa que no deberias cambiar el canal, ya que esta procesandose una lectura. Si esta en 0 si, y al estar en 0, te interesa que siga en 0, por eso no me preocupo.
Si tenes la precaucion de cambiar el canal cuando el ADC no esta convirtiendo, entonces solo una instruccion necesitarias.