; LED_3.ASM
;
; Lights four LEDs in sequence on lower four bits of PortB.   
; The direction is controlled by a switch at PortB, Bit 7
;
; 
; copyright, Peter H. Anderson, MSU, June 1, '97
;

	LIST p=16c84
#include <p16c84.inc>
	__CONFIG 11h

LOOP1	EQU 10H		; used for timing
LOOP2	EQU 11H		; "
PATT	EQU 12H		; pattern output to LEDs
COUNT	EQU 13H		; for (count = 4; count >0; count--)

	ORG 000H

	BCF STATUS, RP1
	BSF STATUS, RP0		; switch to bank 1 and
				; make lower 7 bits on Portb outputs
				; most significant bit input
	MOVLW 	80H
	MOVWF	TRISB		

	BCF STATUS, RP0		; back to data bank 0

TOP
	BTFSS	PORTB, 7
	GOTO 	OTHER_WAY	; if input 7 at 1

ONE_WAY:
	MOVLW	.1		; init pattern to 01H
	MOVWF	PATT
	MOVLW	.4
	MOVWF	COUNT		; count = 4
ONE_WAY_1:
	MOVF	PATT, W		
	XORLW	0FH		; invert pattern
	CALL	OUT		; and output to light LED
	DECFSZ	COUNT, F
	GOTO	ONE_WAY_2
	GOTO 	TOP
ONE_WAY_2:
	RLF	PATT, W		; shift pattern and OR with 01H
	IORLW	01H		; walking ones to left
	MOVWF	PATT		; save
	GOTO ONE_WAY_1	
	
OTHER_WAY:
	MOVLW	08H		; initialized
	MOVWF	PATT
	MOVLW	.4
	MOVWF	COUNT
OTHER_WAY_1:
	MOVF	PATT, W
	XORLW	0FH		; invert pattern
	CALL	OUT
	DECFSZ	COUNT, F
	GOTO	OTHER_WAY_2
	GOTO	TOP
OTHER_WAY_2:
	RRF	PATT, W		; walk ones to right
	IORLW	08H
	MOVWF	PATT
	GOTO OTHER_WAY_1
	

OUT:
	MOVWF	PORTB		; output pattern
	CALL	DELAY
	RETURN

DELAY:
	MOVLW	.250	; change to .250 for final run
	MOVWF	LOOP1
OUTTER
	MOVLW	.110	; close to 1.0 msec delay when set to .110
	MOVWF 	LOOP2
INNER
	NOP
	NOP
	DECFSZ	LOOP2, F
	GOTO INNER
	DECFSZ 	LOOP1, F
	GOTO OUTTER
	RETURN

	END