Owen's First PIC Program



        list P=16F84
	include 

; Interdig.asm
; Interdigitate
;    Program to alternately flash
;    LEDs in this sequence: 13243546576867564534231
; April 14, 2001
; Owen Lawrence
;
; 


tmpw		EQU	0CH
portb   	EQU     6
trisb   	EQU     86H
optreg  	EQU     81H
status  	EQU     3
RP0     	EQU     5
leftmost	EQU	7	; Bit position of leftmost LED
rightmost	EQU	0	; Bit position of rightmost LED

	__config	_RC_OSC	& _WDT_ON	; RC oscillator with watch-dog timer

	org	0		; program starts at address 0

	bsf	status,RP0	; Select register bank 1
	clrf	trisb^80H	; Set PORTB to all outputs
	movlw	0DH		; Assign prescaler (1:32) to WDT
	movwf	optreg^80H
	bcf	status,RP0	; Select register bank 0
	movlw	B'10000000'	; Prepare initial value--leftmost LED on
	movwf	portb		; and place it in PORTB
	clrf	tmpw
RIGHT	movf	portb,0		; We want to shift right by 2, but we do it in tmpw
	movwf	tmpw		; so the intermediate shift by 1 doesn't appear
	rrf	tmpw,1		; Shift tmpw to the right by 1, result in tmpw
	rrf	tmpw,0		; Shift tmpw to the right by another 1, result in W
	movwf	portb		; Move results (W) into portb
	sleep			; Wait for WDT timeout
	btfsc	portb,rightmost	; If the rightmost bit is set
	goto	LEFT		;	Switch direction
	rlf	portb,1		; Else shift to the left by 1
	sleep
	goto	RIGHT		; Start new cycle
LEFT	movf	portb,0
	movwf	tmpw
	rlf	tmpw,1
	rlf	tmpw,0
	movwf	portb		; Shift to the left by 2
	sleep
	btfsc	portb,leftmost	; If the leftmost bit is set
	goto	RIGHT		; 	Switch direction back
	rrf	portb,1		; Else shift to the right by 1
	sleep
	goto	LEFT		; Start new cycle
	end