 TITLE  "7seg1.asm"                    ; displaying 0,1,...,9 on a 7-seg LED
 List P=16F84a, R=DEC
 INCLUDE "p16F84a.inc"

; data segment
 CBLOCK 0x00C 
 n                                     ; the number to display
 i,j,k                                 ; variables used in delay()
 segments:10                           ; storage for segment codes
 ENDC

; code segment
 PAGE
 __CONFIG _CP_OFF & _PWRTE_ON  & _WDT_OFF & _XT_OSC

  org    0
  	bsf    	STATUS, RP0            ; change to BANK 1
    	movlw 	0xFF
	movwf	PORTB                  ; turn off all LED segments
  	clrf    TRISB ^ 0x80           ; Enable RB1-RB7 for Output
  	movlw  	0x7F                   ; Enable Internal Pull-Ups
  	movwf  	OPTION_REG ^ 0x80
  	bcf    	STATUS, RP0            ; back to BANK 0

; setup codes for the LED segments
	call 	initSegments
    	clrf	n           		; start counting with n=0 

loop
	movf	n, w
	addlw	segments
	movwf	FSR         		; FSR = pointer to digit code
	movf	INDF, w			; w = code[digit]
	xorlw	0xFF			; highlight only segs for bit=0
	movwf	PORTB       		; light on the digit
	call 	delay			; delay

	incf	n, f			; n++
 	movf	n, w
	sublw	10	   
	btfss	STATUS, Z		; n == 10?	
	goto	loop			; NO - continue
	clrf 	n 			; YES - start from digit 0 again
	goto 	loop

initSegments                            ; fill the array of segment codes
  	movlw	b'11011110' 		; gidit 0
	movwf	segments+0
	movlw	b'00011000' 		; digit 1
	movwf	segments+1
	movlw	b'11101100'		; digit 2
	movwf	segments+2
	movlw	b'01111100'		; digit 3
	movwf	segments+3
	movlw	b'00111010'		; digit 4	
	movwf	segments+4
	movlw	b'01110110'		; digit 5
	movwf	segments+5
	movlw	b'11110110'		; digit 6
	movwf	segments+6
	movlw	b'00011100'		; digit 7
	movwf	segments+7
	movlw	b'11111110' 		; digit 8
	movwf	segments+8
	movlw	b'01111110'		; digit 9
	movwf	segments+9
	return

delay                                   ; a simple delay procedure
	movlw	3
	movwf	k
	
L1	movlw	200
	movwf	i

L2 	movlw	200
	movwf 	j

L3 	decfsz	j, f
	goto 	L3

	decfsz	i, f
	goto 	L2

    	decfsz 	k, f
	goto 	L1

	return

 end
