LIST p=16f877a ;indicamos procesador que utilizamos
#include <p16f877a.inc> ;processor specific definitions
__config _CP_OFF & _XT_OSC & _WDT_OFF & _PWRTE_ON & _LVP_OFF & _BODEN_OFF
ERRORLEVEL -302 ;elimina mensaje de warning "not in bank 0"
ERRORLEVEL -203 ;elimina mensaje de warning
ERRORLEVEL -305 ;elimina mensaje de warning
ERRORLEVEL -205 ;elimina mensaje de warning
temp_1 equ 20h ;definimos variable temp_1 para la demora
temp_2 equ 21h ;definimos variable temp_2 para la demora
;************************ RESET Y VERCTORES INT *******************************
org 00h ;Vector de reset (aqui viene el micro cuando arranca)
goto Inicio ;inmediatamente lo mandamos a Inicio
org 0x05 ;Le indicamos en que posición de memoria comienza lo que sigue
Inicio ;------------------------ INICIALIZA MICROPOCESADOR ---------------------------
;Inicializa puertos
IniPorts
clrf PORTA ;pone a 0 el puerto A
clrf PORTB ;pone a 0 el puerto B
clrf PORTC ;pone a 0 el puerto C
clrf PORTD ;pone a 0 el puerto D
clrf PORTE ;pone a 0 el puerto E
bsf STATUS,RP0 ;Seleccionamos Bank 1
movlw 0x06 ;???
movwf ADCON1 ;???
clrf TRISA ;indicamos puerto A salidas
clrf TRISB ;indicamos puerto B salidas
clrf TRISC ;indicamos puerto C salidas
clrf TRISD ;indicamos puerto D salidas
MOVLW b'11101111' ;ojo que TRISE tambien actua sobre puerto D y
movwf TRISE ;es analógico
bcf STATUS,RP0 ;Seleccionamos Bank 0
Main
clrf PORTA ;inicio puerto A
call demoraXms ;espera antirrebote para que al pulsar no cuente más de 1 pulsación
btfss PORTE,0 ;pin 0 a +?
goto $-1 ;aun no, volvemos a la instrucción anterior
bsf PORTA,0 ;si, activa led 0
call demoraXms ;espera X segundos antes de volver a mirar el el RE0
btfss PORTE,0 ;si RE0 =1 escapa, si es 0 hace el goto, que vuelve subir a la instrucción anterior
goto $-1 ;sube a la instruccion anterior
bsf PORTA,1 ;como RE0=1 ponemos un 1 RA0
call demoraXms ;espera X segundos antes de volver a mirar el el RE0
btfss PORTE,0 ;si RE0 =1 escapa, si es 0 hace el goto, que vuelve subir a la instrucción anterior
goto $-1 ;sube a lka instrucción anterior
bsf PORTA,2 ;como RE0=1 ponemos RA1 a 1
call demoraXms ;espera X segundos antes de volver a mirar el el RE0
btfss PORTE,0 ;miramos estado pin RE0, si es 0 hace la siguiente instrucción, si es 1 se salta el goto
goto $-1 ;ejecuta la instrucción anterior
bsf PORTA,3 ;ponemos un 1 en el pin RA2
call demoraXms ; espera X segundos antes de volver a mirar el el RE0
btfss PORTE,0 ; miramos estado pin RE0, si es 0 hace la isntrucción siguiente, si es 1 hace goto Main
goto $-1
goto Main ;vuelve a empezar
;Demora Xms a 4mhz
demoraXms
movlw 0xFF ;ponemos FF en W
movwf temp_1 ;guardamos FF en la variable temp_1
movlw .180 ;cuanto mayor sea este numero más larga será la demora???
movwf temp_2 ;ponemos 180 en la variable temp_2
decfsz temp_1,f ;decrementamos temp_1 salta si es 0???
goto $-1 ;ejecutamos la instrucción anterior
clrwdt ;Limpiamos el tiempo del watchdog???
decfsz temp_2,f ;decrementamos temp_2 salta si es 0???
goto $-4 ; salta 4 isntrucciones hacia atras, osea salta a decfsz temp_1
return ;vuelve a la instrucción donde estaba
end
Bueno, esto es lo que yo entiendo, hay algunas cosas que me falta confirmar, las que estan en negrita sobretodo.