El problema es que estas revisando el nivel... vos tenes que pensar que el micro es muchisimo mas rapido que vos, entonces cuando presionas el boton lo podes tener presionado por 500ms siendo o no exagerado( Y en simulación va mas lento xD). En esos 500ms paso por esta condicion:
btfss PORTA,PulsadorM1 ;Testeamos si esta a 1 logico(¿El Bit "PulsadorM1" del PuertoA esta en 1 Logico?)
call M1
unas x cantidad de veces, es por eso que ves que avanza por demas ( cuenta mucho mas ).
El circuito antirebote te proteje de que existan muchos pulsos en 1 y en 0 en tu entrada antes que se quede en el valor final hasta que se carga/descarga el capacitor. Con esto ya te aseguras que tengas o un 1 o un 0 y estes seguro que eso ocurra.
Pero queda arreglar el programa.
Se puede hacer de distintas formas, algunos micros ofrecen la posibilidad de detectar el flanco y producir una interrupcion. el PIC16F84A solo lo tiene en el RB0 para flanco ( RB4 a 7 son por nivel ) , pero vos necesitas 2. Asi mejor ver como hacerlo por software
Lo que se hacer yo para no limitar la velocidad del programa en no poder delays o quedarme esperando un evento es usar una variable que me guarde los datos del puerto. ( Digo puerto por que usualmente es mover los datos del PORT a esa variable )
Inicio
Se presiono el boton 1 ?
Voy a la funcion boton 1
Se presiono el boton 2 ?
Voy a la funcion boton 2
Estan ambos botones sueltos(ninguno presionado)?
Borro mi variable backuppuerto o cargo nuevamente con el valor puerto
Vuelvo al inicio
Funcion boton 1
Boton 1 presionado con anterioridad? ( pregunto por backuppuerto bit del boton 1 si esta en 0/1 como sea tu logica )
Return (Es decir vuelvo, por que ya fue presionado y ya paso por esta funcion)
Aca hago mi funcion del boton 1 // en caso que no paso
Pongo en 1 o 0 (segun la logica que uses) a backuppuerto para indicar que por aqui ya paso
Rerturn
En negrita los cambios a tu programa
Lo mismo para el boton 2, entonces cuando se ejecuta por 1era vez el programa del boton 1 activa una flag (bandera ) avisandome que ya paso por ahi. Entonces mi primera condicion es que no pase nuevamente por ahi si ya paso antes.
En el programa principal yo puse que si ambos botones NO estan presionados me borre las flags, esto significa que para que pueda volver a entrar ambos botones deberian estar a sueltos, sino podria haberlo hecho individualmente para cada boton y eso no afectaria si presionas ambos juntos etc. Entonces tanto como hacerlo con ambos o individualmente cuando pasa por el punto ese del programa principal me resetea mis banderas si se cumple la condicion permitiendo que pueda entrar nuevamente.
Otros lo que hacen es preguntar si se presiono, llamar a la funcion y quedarse esperando en un loop para siempre preguntando si se solto el boton, tu programa principal quedaria de la misma manera y el del switch
Boton 1:
Se solto el boton? (si se solto salto )
Vuelvo a boton 1
Programa del boton 1
Return
Cambios a tu programa en negrita. Cabe recalcar que en este programa mientras no soltes el boton no va a salir de ahi, asi que si presionas el otro boton no va a haber diferencia.
La decision de cual programa elegir depende de como queres que funcione ante las distintas posiblidades que ocurran, una de las cosas que siempre tenes que tener en cuenta es cubrir cualquier posibilidad que pueda ocurrir y que responda de acuerdo a lo que queres. ( que presionen ambos botones, que tenga presionado 1 y luego presione el otro sin soltar el primero etc) si cumple tus condiciones del programa entonces esta bien.
No le pego mucho al inglés por eso no se me ocurrió ver el Datasheet del PIC16F84A, pero después de lo que me dijo KILLERJC lo empecé a ver con el traductor al lado.. xD, me ha costado pero de apoco he ido aclarando mis dudas en esto de la programación.
No es por desanimarte pero todo esta en ingles, yo tambien comence asi buscando palabritas que no entendia y hoy no tengo ningun problema en leer algo en ingles, Pero sea el datasheet que sea estan en ingles o en aleman o chino, pero lo mas comun es el ingles. Y muchos de los problemas suelen resolverse solo leyendo el datasheet del micro
. Creo haber renegado por los cambios en los por Rb4:7 que habia que leer el port obligatoriamente, no recuerdo si era eso, pero estaba en el datasheet y lo pase por alto xD. Incluso en el datasheet siempre te ayudan con formulas para el calculo de los registros y los pasos de inicializacion del modulo. Y tambien muchos ejemplos estan en ingles