Hola:
Claro que protón tambien tiene interrupciones, que sería de los compiladores sin estas opciones, no? Son estas:
ON INTERRUPT Execute a BASIC or ASSEMBLER subroutine using a SOFTWARE interrupt.
ON_INTERRUPT Execute an ASSEMBLER subroutine on a HARWARE interrupt.
ON_LOW_INTERRUPT Execute an ASSEMBLER subroutine when a LOW PRIORITY HARDWARE interrupt occurs
las dos primeras no son iguales, la una está con espacio y la otra unida con un guión bajo, son diferentes como se puede apreciar en la descripción.
Si no quieres utilizar interrupciones, se me ocurre que el bucle puede ser más corto, eso reduce el tiempo de ejecución, aunque sigo pensando que no haría falta el bucle, ya que puedes hacer lo siguiente:
Device = 16F84A
XTAL 4
TRISA.0=1
Dim i As Byte
inicio:
If PORTA.0=1 Then
GoSub Atras
EndIf
GoSub Adelante
GoTo inicio
Adelante:
'valores para mover el motor adelante
PORTB=%00000110:DelayMS 20
PORTB=%00000101:DelayMS 20
PORTB=%00001010:DelayMS 20
PORTB=%00001010:DelayMS 20
Return
Atras:
'valores para mover el motor atrás
PORTB=%00000110:DelayMS 20
PORTB=%00000101:DelayMS 20
PORTB=%00001010:DelayMS 20
PORTB=%00001010:DelayMS 20
Return
De esta forma, en mover los cuatro pasos tardará 80 ms y puede tranquilamente leer el estado del pin en el que tienes colocado el pulsante, obviamente, si pones menos tiempo entre paso y paso del motór, la lectura del pin en el que tienes el sensor o el pulsador será más rápido.
Lo que tienes que hacer es colocar los valores correctos para que el motor gire, ya que yo les copié igual y no se la secuencia correcta, pruébalo a ver que te parece y me cuentas.
Recuerda, el motór girará hacia atrás mientras tengas presionado el pulsador, si lo sueltas enseguida, solo se moverá cuatro pasos hacia atrás.