Este es el codigo del programa
#include "P16F84a.INC"
LIST P = 16F84a
__config _XT_OSC & _WDT_OFF & _PWRTE_ON
RADIX HEX
TMR0_OPT EQU 0X01
CONTA0 EQU 0x20
SALIDA1 EQU 0X21
SALIDA2 EQU 0X22
NSALIDAS EQU 0X32 ;numero de salidas
TIEMPO EQU 0X35 ;numero de segundos
TEMPO1 EQU 0X0E
ORG 0
goto inicio
inicio bcf STATUS,RP1
bsf STATUS,RP0 ;seleccion banco 1
clrf TRISB ;definir puerta B como salidas
movlw b'00000001'
movwf TRISA
movlw b'00000111' ;mover siete a registros TMR0 y OPTION
movwf TMR0_OPT ;para indicar predivisor 256
bcf STATUS,RP0
movlw 0X03 ;NUMERO DE SALIDA
movwf NSALIDAS
movlw b'11111111'
movwf PORTA
movwf PORTB
call DELAYS
clrf PORTA
clrf PORTB
PULSADOR btfss PORTA,0 ;pulsador on
goto $-1 ;no, volver a verificar
movlw 0x05 ;si, carga cinco en W retardo de 60us
movwf CONTA0 ;carga cinco en CONTA0
decfsz CONTA0,1 ;decrementa hasta cero
goto $-1 ;no, vuelve a decrementar CONTA0
btfsc SALIDA1,0 ;si, salida 1 ya se activo?
goto OUT2 ;si, ver salida 2
bsf PORTB,0 ;no, salida 1 en ON
bsf SALIDA1,0 ;flag de salida 1 a ON
call DELAYS ;llamar tiempo
bcf PORTB,0 ;apargar salida 1
movlw 0X01
subwf NSALIDAS,0 ;resto Nº salida programada - 1 = W
btfsc STATUS,Z ;Nº de salida es 1 W=0
clrf SALIDA1
goto PULSADOR
OUT2 btfsc SALIDA1,1
goto OUT3
bsf PORTB,1
bsf SALIDA1,1
call DELAYS
bcf PORTB,1
movlw 0X02
subwf NSALIDAS,0 ;resto 1 - Nº salida programada = W
btfsc STATUS,Z ;Nº de salida es 1 W=0
clrf SALIDA1
goto PULSADOR
OUT3 btfsc SALIDA1,2
goto OUT4
bsf PORTB,2
bsf SALIDA1,2
call DELAYS
bcf PORTB,2
movlw 0X03
subwf NSALIDAS,0 ;resto 1 - Nº salida programada = W
btfsc STATUS,Z ;Nº de salida es 1 W=0
clrf SALIDA1
goto PULSADOR
OUT4 btfss SALIDA1,3
goto PULSADOR
bsf PORTB,3
bsf SALIDA1,3
call DELAYS
bcf PORTB,3
movlw 0X04
subwf NSALIDAS,0 ;resto 1 - Nº salida programada = W
btfsc STATUS,Z ;Nº de salida es 1 W=0
clrf SALIDA1
goto PULSADOR
DELAYS movlw 0X01 ;NUMERO DE SEGUNDOS
movwf TIEMPO
DELAY btfsc PORTA,0 ;pulsador on
movlw 0X64
movwf TEMPO1
VOLVER bcf INTCON,2
movlw 0XD9
movwf TMR0_OPT
btfss INTCON,2
goto $-1
decfsz TEMPO1,F
goto VOLVER
decfsz TIEMPO,1
goto DELAY
return ;volver al programa segun la pila
end