Yo te recomendaria usar GOTO y RETURN, quiz'a tenes un problema de stack al hacer las llamadas una y otra vez y no regresar.
ESTE SERIA EL PSEUDOCODIGO PARA EL ENUNCIADO, NO ASI PARA LO QUE POSTEASTE como ejemplo.
DIM BANDERA AS BYTE
inicio:
IF PORTA.0=0 THEN
DO
UNTIL PORTA.0=1
IF BANDERA=0 THEN
BANDERA=1
GOSUB PROG
ELSE
BANDERA=0
GOSUB APAG
ENDIF
ENDIF
GOTO INICIO:
APAG:
PORTB=0
RETURN
PROG:
PORTB=255
RETURN
END