#INCLUDE <P16F877.INC>
ERRORLEVEL -302
loops equ 0x20 ;variables usadas en retardos
loops2 equ 0x21
Dig43 equ 0x22
Dig21 equ 0x23
CONTA equ 0x24
Tecla equ 0x25
KEY_1 equ 0x26
KEY_2 equ 0x27
KEY_DELAY_1 equ 0x28
KEY_DELAY_2 equ 0x29
flag equ 0x2A
W_TEMP equ 0x2B
STATUS_TEMP equ 0x2C
PCLATH_TEMP equ 0x2D
org 00h ;Indica al ensamblador la dirección de memoria de
;la sig. instrucción
goto inicio
org 04h
MOVWF W_TEMP ;guardar copia de los registros claves
SWAPF STATUS,W
CLRF STATUS
MOVWF STATUS_TEMP
MOVF PCLATH, W
MOVWF PCLATH_TEMP
CLRF PCLATH
btfsc INTCON,RBIF ;es interrupción RBIF?
call FOULT
btfss INTCON,INTE ;es interrupción INTE??
call KEYBOARD
MOVF PCLATH_TEMP,W ;restaurar registros claves
MOVWF PCLATH
SWAPF STATUS_TEMP,W
MOVWF STATUS
SWAPF W_TEMP,F
SWAPF W_TEMP,W
retfie
inicio
bsf STATUS,RP0 ;selecciona el banco de memoria alto
bcf STATUS,RP1
clrf TRISE ;configura el puerto E como salida
movlw b'00001111' ;configura RD7-RD4 como salidas
movwf TRISD ;y RD3-RD0 como entradas.
movlw b'10000000' ;configura el puerto C
movwf TRISC ;como salida excepto RC7.
movlw 0xff ;configura el puerto B
movwf TRISB ;como entrada.
movlw 0x06 ;se configura el puerto A
movwf ADCON1 ;como salidas digitales.
clrf TRISA ;configura el puerto A como salida
movwf OPTION_REG ;interr en bajo de RB0
bcf STATUS,RP0 ;selecciona el banco de memoria bajo
movlw b'10010001' ;configura las interrupcion
movwf INTCON ;RB0/INT y RBIF.
test btfsc PORTB,2 ;chek la act. del sensor de prestage canal A
call prestage1
btfss PORTB,3 ;chek la act. del sensor de prestage canal B
goto test
call prestage2
test2 btfsc PORTC,7 ;chek la act. del sensor de stage canal A
call stage1
btfss PORTB,1 ;chek la act. del sensor de stage canal B
goto test2
call stage2
movlw d'250'
call retardo
bsf PORTE,0 ;enciende Luz amarilla1 Ch A
bsf PORTE,1 ;enciende Luz amarilla1 Ch B
movlw d'250'
call retardo
bsf PORTE,2 ;enciende Luz amarilla2 Ch A
bsf PORTC,0 ;enciende Luz amarilla2 Ch B
movlw d'250'
call retardo
bsf PORTC,1 ;enciende Luz amarilla3 Ch A
bsf PORTC,2 ;enciende Luz amarilla3 Ch B
movlw d'250'
bsf PORTC,3 ;enciende Luz verde Ch A
bsf PORTC,4 ;enciende Luz verde Ch B
bcf PORTE,0 ;apaga luz amarilla1 ch A
bcf PORTE,1 ;apaga luz amarilla1 ch B
bcf PORTE,2 ;apaga luz amarilla2 ch A
bcf PORTC,0 ;apaga luz amarilla2 ch B
bcf PORTC,1 ;apaga luz amarilla3 ch A
bcf PORTC,2 ;apaga luz amarilla3 ch B
movlw d'250'
call retardo
bcf PORTC,3 ;apaga luz verde ch A
bcf PORTC,4 ;apaga luz verde ch B
goto ciclo
stage1
bsf PORTA,4 ;enciende Luz stage canal A
btfss PORTB,1 ;chek la act. del sensor de stage canal B
goto $-1
bsf PORTA,5 ;enciende luz prestage canal B
return
stage2
bsf PORTA,5 ;enciende luz stage canal B
btfss PORTC,7 ;chek la act. del sensor de prestage canal A
goto $-1
bsf PORTA,4 ;enciende luz prestage canal A
return
prestage1
bsf PORTA,2 ;enciende Luz prestage canal A
btfss PORTB,3 ;chek la act. del sensor de prestage canal B
goto $-1
bsf PORTA,3 ;enciende luz prestage canal B
return
prestage2
bsf PORTA,3
btfss PORTB,2 ;chek la act. del sensor de prestage canal A
goto $-1
bsf PORTA,2 ;enciende luz prestage canal A
return
FOULT
bcf INTCON,RBIF ;subrutina de Foult
btfsc PORTB,4
goto canalA
goto canalB
canalA bsf PORTA,1 ;enciende y deja fija luz de foult canal B
bsf PORTA,0 ;enciende y parpadea luz de foult canal A
movlw d'100' ;indicando que es este canal
call retardo ;el que falto
bcf PORTA,0
movlw d'100'
call retardo
goto canalA
canalB bsf PORTA,0 ;enciende y deja fija luz de foult canal A
bsf PORTA,1 ;enciende y parpadea luz de foult canal B
movlw d'100' ;indicando que es este canal
call retardo ;el que falto
bcf PORTA,1
movlw d'100'
call retardo
goto canalB
Return
KEYBOARD
bcf INTCON,INTE
nop ;aun Falta terminar esta rutina
nop
nop
Return
retardo ;subrutina de retardo
movwf loops ;la variable de trabajo contiene la cant.
top2 movlw d'110' ;de ms a demorar
movwf loops2
top nop
nop
nop
nop
nop
nop
decfsz loops2,F ;controla si termina 1mS
goto top
decfsz loops,F ;controla si termina el retardo completo
goto top2
retlw 0
ciclo nop
goto $-1
end