; ARROW.ASM
;
; Peter H. Anderson, Feb 11, '08
;

	LIST p=16f887
#include <p16f887.inc>	

            __CONFIG    _CONFIG1, 0x28e4 
	        __CONFIG    _CONFIG2, 0x3eff 
	
NUM_MS		EQU 20H
NUM_10US    EQU 21H
N			EQU 22H

	ORG 0x000	;program code to start at 000H


	BSF STATUS, RP0		; switch to bank 1 and
				
    MOVLW 0x61	
    MOVWF OSCCON		; internal clock, 4 MHz

	MOVLW 0xf0
	MOVWF TRISB

    BCF OPTION_REG, 7

	BCF STATUS, RP0		; back to data bank 0

    BSF STATUS, RP0		; over to bank 3
    BSF STATUS, RP1

    MOVLW 0x00
    MOVWF ANSELH		; provide use of RB4 - RB7
   
    BCF STATUS, RP0		; back to bank 0
    BCF STATUS, RP1
    

TOP:
    BTFSS PORTB, 4
    GOTO LEFT
    BTFSC PORTB, 4
    GOTO RIGHT
    GOTO TOP
    
LEFT:

    MOVLW 0			; turn off all four lamps
    MOVWF PORTB
    MOVLW .250
    CALL DELAY_MS

    MOVLW .4
    MOVWF N
LEFT_1:
    MOVF N, W
    SUBLW .4 
    CALL LOOK_LEFT
    MOVWF PORTB
    MOVLW .250
    CALL DELAY_MS

    DECFSZ N, F ;  4, 3, 2, 1, 0
    GOTO LEFT_1
    GOTO TOP

RIGHT:

    MOVLW 0			; turn off all four lamps
    MOVWF PORTB
    MOVLW .250
    CALL DELAY_MS

    MOVLW .4
    MOVWF N
RIGHT_1:
    MOVF N, W
    SUBLW .4 
    CALL LOOK_RIGHT
    MOVWF PORTB
    MOVLW .250
    CALL DELAY_MS

    DECFSZ N, F ;  4, 3, 2, 1, 0
    GOTO RIGHT_1
    GOTO TOP

LOOK_LEFT:
    ADDWF PCL, F
    RETLW 0x01
    RETLW 0x03
    RETLW 0x07
    RETLW 0x0f

LOOK_RIGHT:
    ADDWF PCL, F
    RETLW 0x08
    RETLW 0x0c
    RETLW 0x0e
    RETLW 0x0f
    
    
DELAY_MS:		; delay.  number of ms passed in W
    MOVWF NUM_MS
DELAY_MS_1:        
	MOVLW .100     
	CALL DELAY_10US
	
	DECFSZ NUM_MS, F
	GOTO DELAY_MS_1
	RETURN

DELAY_10US:		; delay.  number of 10us passed in W
	MOVWF NUM_10US	
DELAY_10US_1:	
	CLRWDT	; 7 ~
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	DECFSZ NUM_10US, F
	GOTO DELAY_10US_1
	RETURN

    
    END