Hola golupic, aquí te dejo un programita que realicé para los 16F628A, en si mismo el programa no es muy distinto a lo que quedaría si lo adaptamos a un 16F877, las diferencias solo estarían en la parte de configuración del micro.
Espero te sea de ayuda, un saludo.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; Control de los motores para el movimiendo de los carros de la fresadora
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
LIST P = 16F628A
INCLUDE <P16F628A.INC>
ERRORLEVEL -302
;............................
__CONFIG _BODEN_OFF&_BOREN_OFF&_CP_OFF&_DATA_CP_OFF&_PWRTE_ON&_WDT_ON&_LVP_OFF&_MCLRE_ON&_HS_OSC
#DEFINE PWM FLAG,0
#DEFINE LED1 PORTA,2
#DEFINE LED2 PORTA,3
#DEFINE DIRECC PORTB,1
PASO EQU .32
SALIDA EQU .33
FLAG EQU .34
;............................
ORG 0
goto INICIO
ORG 4
goto PULSO
;............................
TABLA
movf PASO,W
addwf PCL,F
nop
retlw B'11100000' ;1
retlw B'11000000' ;2
retlw B'11010000' ;3
retlw B'10010000' ;4
retlw B'10110000' ;5
retlw B'00110000' ;6
retlw B'01110000' ;7
retlw B'01100000' ;8
;............................
PULSO
clrwdt
btfss INTCON,INTF
goto TIEMPO
movlw .130
movwf TMR1H
clrf TMR1L
bsf PWM
bcf INTCON,INTF ;Se borra el flag de la interrupción usada BIT1 , int. en RB0
;............................
btfsc DIRECC
goto DERECHA
bsf LED1
bcf LED2
incf PASO,F
movlw .9
subwf PASO,W
btfss STATUS,Z
goto NO1
movlw .1
movwf PASO
NO1
call TABLA
movwf SALIDA
clrf PORTB
iorwf PORTB,F
goto SAL1
DERECHA
bcf LED1
bsf LED2
decfsz PASO,F
goto NO2
movlw .8
movwf PASO
NO2
call TABLA
movwf SALIDA
clrf PORTB
iorwf PORTB,F
;............................
SAL1
retfie
;............................
TIEMPO
btfsc PWM
goto APAGA
movlw H'CF'
movwf TMR1L
movlw H'FF'
movwf TMR1H
movf SALIDA,W
andwf PORTB,F
bsf PWM
goto SAL2
APAGA
movlw H'E2'
movwf TMR1L
movlw H'FF'
movwf TMR1H
movlw B'11110000'
movwf PORTB
bcf PWM
SAL2
bcf LED1
bcf LED2
bcf PIR1,TMR1IF ;Se borra el flag de la interrupción usada BIT1 , int. en RB0
retfie
;............................
SACAR
clrf PORTB
movf SALIDA,W
iorwf PORTB,F
return
;............................
INICIO ;Inicio del programa principal
clrwdt
clrf PORTA
movlw B'11110000'
movwf PORTB
movlw .7
movwf CMCON
bcf STATUS,RP1
bsf STATUS,RP0
movlw B'11011000'
movwf OPTION_REG
movlw B'11110011'
movwf TRISA
movlw B'00001111'
movwf TRISB
bcf STATUS,RP0
movlw B'11010000'
movwf INTCON
clrf TMR1L
movlw .130
movwf TMR1H
bsf STATUS,RP0
movlw B'00000001'
movwf PIE1
bcf STATUS,RP0
movlw B'00000001'
movwf T1CON
movlw .1
movwf PASO
call TABLA
movwf SALIDA
call SACAR
bsf PWM
RET
nop
goto RET
;............................
end