 TITLE  "led1.asm" 			; Turning on a LED
 List P=16F84a, R=DEC
 INCLUDE "p16F84a.inc"

; data segment 
 CBLOCK 0x00C                   
 i,j,k                          	; these variables are used in delay()
 ENDC

 PAGE
 __CONFIG _CP_OFF & _PWRTE_ON  & _WDT_OFF & _XT_OSC

  org    0x00
  goto main

	ORG     0x04			; interrupt vector
	goto	ISR	

main

    bcf INTCON,RBIF
    bsf INTCON,RBIE    
	bsf INTCON,GIE

  	bsf    	STATUS, RP0		; change to BANK 1
  ;	bcf    	TRISB ^ 0x080, 1       	; enable RB1 for output
  	bsf    	TRISB,0
  	bcf    	TRISB,1
  	bsf    	TRISB,2
  	bsf    	TRISB,3
  	bcf    	TRISB,4
  	bsf    	TRISB,5
  	bsf    	TRISB,6
  	bsf    	TRISB,7    
    movlw  	0x07F                  	; enable internal pull-ups
	bsf    	STATUS, RP1
    bsf    	TRISA,3

  	movwf  	OPTION_REG ^ 0x080
  	bcf    	STATUS, RP0		; back to BANK 0

loop
	bsf	PORTB, 1		; RB1 = 1, thus LED on 
    call 	delay

	bcf	PORTB, 1		; RB1 = 0, thus LED off
	call 	delay
	goto	loop			; repeat forever

delay					; this is a dalay for approx. 2s
	movlw	5			; for 16F84A @ 4Mhz
	movwf	k
	
L1	movlw	200			; outer loop
	movwf	i

L2 	movlw	200			; inner loop
	movwf 	j

L3 	decfsz	j, f			; inner inner loop
	goto 	L3

	decfsz	i, f		
	goto 	L2

    	decfsz 	k, f	
	goto 	L1

	return
 

		; Interrupt Service Routine (ISR)

ISR	;************************
	;*** ISR CONTEXT SAVE ***
	;************************
	

	bcf INTCON,GIE
	bcf INTCON,RBIE


btfss INTCON,RBIF
goto exit
	
	btfsc PORTB,3
    bsf	PORTB,4   
    btfss PORTB,3
    bcf PORTB,4  

exit

bcf INTCON,RBIF
            bsf INTCON,GIE
            bsf INTCON,RBIE

	RETFIE
end
