Te voy a dar una guia, luego vos haces el programa. Vamos a hacer 3 subrutinas (+ 1 de delay). El loop principal va a ser de esta forma:
PRINCIPAL
CALL BOTON1TEST
CALL BOTON2TEST
CALL PARPADEAR
CALL DELAY
GOTO PRINCIPAL
BOTON1TEST y BOTON2TEST son iguales, lo que vas a hacer aca es revisar si se presiono el boton, si lo hizo entonces procedes a invertir el bit de un registro que vamos a llamar REGBITS supongamos... Algo asi:
BOTON1TEST:
Esta presionado el boton del LED1 ?
No esta presionado entonces salgo
Si esta presionado -> Invierto el bit 0 de REGBITS
VuelvoPara BOTON2TEST vas a invertir el bit1 de REGBITS, y vas a preguntar por el boton del LED2.
Finalmente PARPADEAR. Este es donde vamos a hacer parpadear o no nuestro led.
PARPADEAR:
MOVF REGBITS, W
XORWF PORTB
RETURN
------------------------------------------------------------------
En fin es simple, las primeras subrutinas solo observan los pulsadores y cambian los bits que luego van a invertir o no la salida de los leds.
Parpadear hace una XOR del registro que modificaron los botones con el puerto B, si los bits estan en 0 no van a invertir y van a quedar como estaban. SI tiene un 1 van a empezar a parpadear.
Problemas que podes tener:
- Al presionar deja de parpadear, pero esto no significa que se apague, esto lo vas a ver en la simulacion, esto puede solucionarse obviamente en la subrutina de PARPADEAR.
- Debido al delay "grande" dentro del loop principal, te vas a encontrar que si presionas el boton poco tiempo o que lo presiones mientras el micro esta haciendo el delay, es como si no lo hubieras presionado. Esto se puede solucionar reduciendo el delay y preguntando en PARPADEAR cuando entro X veces, suponete que tenes un parpadeo cada 1s originalmente, entonces en ves de un delay de 1s, haces uno de 100ms, para que no parpadee cada 100ms, contas hasta 10 dentro de PARPADEAR, y cuando llegue a 10 ejecutas el codigo y reiniciar tu contador a 0. El efecto visual es el mismo, cada 1s se apagaria y se encenderia pero se accede a las subrutinas mucho mas rapido.
- De acceder mucho mas rapido, implica que si tu presion del boton es demasiado largo ( que ocupe al menos 1 delay de tiempo) puede entrar 2 o mas veces a la subrutina del boton, entonces hay que aplicarle una "proteccion" para que no entre varias veces. Aca no se puede poner un loop esperando que suelte el boton, ya que de hacer eso, significa que no va a ejecutar PARPADEAR ni el DELAY, mientras tengas presionado el boton y es un problema.