LIST p=16f877a ;list directive to define processor
#include <p16f877a.inc> ;processor specific definitions
__config _CP_OFF & _XT_OSC & _WDT_OFF & _PWRTE_ON & _LVP_OFF & _BODEN_OFF
ERRORLEVEL -302 ;suppress "not in bank 0" message
ERRORLEVEL -203 ;suppress message
ERRORLEVEL -305 ;suppress message
ERRORLEVEL -205 ;suppress message
temp_1 equ 20h
temp_2 equ 21h
;************************ RESET Y VERCTORES INT *******************************
org 00h
goto Inicio ;Reset vector 0
org 0x05 ;Interrupcion vector
Inicio ;------------------------ INICIALIZA MICROPOCESADOR ---------------------------
;Inicializa puertos
IniPorts
clrf PORTA
clrf PORTB ;Outputs low
clrf PORTC
clrf PORTD ; /
clrf PORTE ; /
bsf STATUS,RP0 ;Selecciona Bank 1
movlw 0x06
movwf ADCON1
clrf TRISA
clrf TRISB
clrf TRISC
clrf TRISD
MOVLW b'11101111' ;ojo que TRISE tambien actua sobre puerto D y
movwf TRISE ; es analógico
bcf STATUS,RP0 ;Selecciona Bank 0
Main
clrf PORTA ;inicio puerto A
call demora80ms ; espera antirrebote
btfss PORTE,0 ;pin 0 a +?
goto $-1 ;aun no, volvemos a la instrucción anterior
bsf PORTA,0 ; si, activa led 0
call demora80ms
btfss PORTE,0
goto $-1
bsf PORTA,1
call demora80ms
btfss PORTE,0
goto $-1
bsf PORTA,2
call demora80ms
btfss PORTE,0
goto $-1
bsf PORTA,3
call demora80ms ; espera
btfss PORTE,0 ; y testeo para volver a empezar
goto $-1
goto Main
; Demora 80ms a 4mhz
demora80ms movlw 0xFF
movwf temp_1
movlw .105
movwf temp_2
decfsz temp_1,f
goto $-1
clrwdt
decfsz temp_2,f
goto $-4
return
end
He puesto 80ms porque no tengo pulsadores a mano y tuve que pulsar con un cablecito
Si ves que es demasiado, baja el .105 de la demora a .27 (20ms).
Obviamente se puede reducir código con un contador y comparando resultados pero
para esta aplicación no lo veo necesario liarse tanto.