Hola AngelGris, creo que tu programa difiere al de bigluis en algo bien importante y es en la forma de esperar a que se pulse el botón en A0. En tu programa tienes: if (RA0 == 0) que básicamente es de la misma forma en que yo lo tengo en el mio: if( !input(PIN_A0));. Bigluis lo hace asi: while(input(PIN_A0)); en su código. Como bien sabes, si el programa se encuentra un if(), simplemente revisa si su condición es verdadera o falsa; bien sea que encuentre que la condición es verdadera o falsa, cumple con las instrucciones asociadas y el programa sigue corriendo normalmente. Mientras que si el programa se encuentra con una instrucción while(), se va a detener en ella y no va a ejecutar ninguna otra instrucción hasta que su condición sea verdadera y salga del ciclo while. Mi punto es que si al programa se le adicionaran más intrucciones y más adelante tuviese que estar revisando por ejemplo, la condicón de otras entradas diferentes a A0, no lo podría hacer ya que el programa se detendría en el primer ciclo while() que encontrase.
Hasta aqui, está muy bien tu código incluso mejor ya que al mio le falta insertarle un atirrebotes. En el código de ejemplo que pongo en el post #4 utilizo una bandera para evitar que vuelva a entrar a la instrucción de revisión del estado de A0, en caso de dejar presionada la tecla. Con esta bandera simplemente se pasa por alto la instrucción y el programa sigue corriendo normalmente en caso de que tuviese que cumplir con otras tareas. Tanto en tu programa, como en el de bigluis, hacen esto con una instrucción while() mientras se suelta el botón con las consecuencias que ya mencioné. En este último caso se que podría tratarse tan solo de algunos 'milisegundos' mientras se suelta el pulsador, pero en una aplicación con muchas funciones y cierto grado de complejidad unos 'milisegundos' pueden llegar ser una 'eternidad' y hacer que el programa no funcione apropiadamente.
Saludos!