	list p=16F628a				; het type pic
	#include "p16f628a.inc"			; De definities
	__CONFIG _CP_OFF & _BODEN_OFF & _DATA_CP_OFF & _PWRTE_ON & _WDT_OFF & _LVP_OFF & _MCLRE_ON & _XT_OSC
					; de fuses
; vars
teller 	EQU	0x20	
teller2	EQU	0x21	; voor de delay
disp1	EQU	0x22
disp2	EQU	0x23	; voor weergave
digit1	EQU	0x24
digit2	EQU	0x25	; voor weergave (dec)
tel1	EQU	0x26
tel2	EQU	0x27	; voor de weergaveloop
cntdly	EQU	0x28	; voor delay
sdata	EQU	0x29	; voor schuifregister
stel	EQU	0x2A	; teller voor schuifregister

; array van karakters maken
nul	EQU	0x30
een	EQU	0x31
twee	EQU	0x32
drie	EQU	0x33
vier	EQU	0x34
vijf	EQU	0x35
zes	EQU	0x36
zeven	EQU	0x37
acht	EQU	0x38
negen	EQU	0x39
aa	EQU	0x3a
bb	EQU	0x3b
cc	EQU	0x3c
dd	EQU	0x3d
ee	EQU	0x3e
ff	EQU	0x3f

	; Begin programma
	ORG 00h
		GOTO	main
	ORG 05h
main		BCF	STATUS,6	; selecteer bank1
		BSF	STATUS,5	; selecteer bank1
		MOVLW	0x00
		MOVWF	TRISB		; portb is output
		MOVLW	0x00
		MOVWF	TRISA		; porta is output (we gebruiken alleen pin 0 en 1)
		MOVLW	0x07		; zet analoge ingang uit (gebruik porta voor IO)
		MOVWF	CMCON		; zet analoge ingang uit (gebruik porta voor IO)

		BCF	STATUS,5	; selecteer bank0

		; array vullen
		MOVLW	0xb7		; dit bepaald welke ledjes aan moeten om het cijfer 1 te vormen
		MOVWF	een
		MOVLW	0x2C		; idem voor het cijfer 2
		MOVWF	twee
		MOVLW 	0x26		; enz...
		MOVWF	drie
		MOVLW	0x87
		MOVWF	vier
		MOVLW	0x46
		MOVWF	vijf
		MOVLW	0x44
		MOVWF	zes
		MOVLW	0x37
		MOVWF	zeven
		MOVLW	0x04
		MOVWF	acht
		MOVLW	0x06
		MOVWF	negen
		MOVLW	0x14
		MOVWF	nul
		MOVLW	0x05
		MOVWF	aa
		MOVLW	0xc4
		MOVWF	bb
		MOVLW	0x5c
		MOVWF	cc
		MOVLW	0xa4
		MOVWF	dd
		MOVLW	0x4c
		MOVWF	ee
		MOVLW	0x4d
		MOVWF	ff
		
		BCF	PORTA,0		; zet display 0 uit
		BCF	PORTA,1		; zet display 1 uit

begin		
		MOVLW	nul
		MOVWF	digit1
		MOVWF	digit2		; beide digits op 0 zetten
		MOVLW	0x10
		MOVWF	tel1		; zet teller op 16 stappen (grootte van array)

uitloop		MOVLW	0x10
		MOVWF	tel2		; zet teller op 16 (grootte array)
		MOVLW	nul
		MOVWF	digit2		; reset digit naar nul

		MOVFW	digit1		; haal digit 1 op
		MOVWF	FSR		
		MOVFW	INDF
		MOVWF	disp1		; zet inhoud van digit1 op disp1
		INCF	digit1,1	; verhoog digit1 met 1

inloop		MOVFW	digit2		; haal digit 2 op
		MOVWF	FSR
		MOVFW	INDF
		MOVWF	disp2		; zet inhoud van digit2 op disp2
		INCF	digit2,1	; verhoog digit2 met 1

		call	display		; geef disp1 en disp2 weer

		DECFSZ	tel2,1		; als tel2 geen nul is herhalen
		goto	inloop
		
		DECFSZ	tel1,1		; als tel1 geen nul is herhalen
		goto	uitloop

		goto 	begin		; als tel1 wel nul is dan herstarten we (dan zijn we een keer rond geweest)
		

display		MOVLW	0x01		; deze routine bevat een dubbele lus om een vertraging te
		MOVWF	teller		; introduceren, in de lus worden ook de displays bestuurd
displayloop2	MOVLW	0xFF			
		MOVWF	teller2
displayloop1
		BSF	PORTA,0		; selecteer display 1
		MOVFW	disp1		; zet var disp1 in W
		CALL	write		; zet W op het schuifregister
		CALL	delay		; wacht even zodat het display niet meteen uit gaat
		BCF	PORTA,0		; display 1 uit
		MOVLW	0xFF		; schuifregister resetten (let op: 1 is led uit, 0 is led aan)
		CALL	write		; schuifregister resetten
		BSF	PORTA,1		; selecteer display 2
		MOVFW	disp2
		CALL	write
		CALL	delay
		BCF	PORTA,1		; display 2 uit
		MOVLW	0xFF
		CALL	write		; schuifregister resetten
		DECFSZ	teller2,1
		goto 	displayloop1
		DECFSZ	teller,1
		goto 	displayloop2
		return
		
delay		MOVLW	0xF0
		MOVWF	stel
deloop		DECFSZ	stel,1
		goto 	deloop
		return

		return

write		; schrijf W naar de 74c959
		MOVWF	sdata		; zet W in een var
		MOVLW	0x08
		MOVWF	stel		; zet teller op 8
wloop
		RLF	sdata,1		; schuif alles op naar rechts (bit0 wordt carry, bit1 wordt bit0, enz)
		BTFSS	STATUS,C		
		BCF	PORTB,0		; Zet carry bit op data-pin (als carry-bit 0 is zetten we data ook op 0)
		BTFSC	STATUS,C
		BSF	PORTB,0		; Zet carry bit op data-pin (carry-bit = 1 dus BSF ofwel zet bitje van data op 1)
		
		bsf	PORTB,2
		nop
		bcf	PORTB,2		; geef de klok een tik (aan - uit), ofwel next!

		decfsz	stel,1
		goto 	wloop		; als teller geen 0 is dan zijn we nog niet klaar met de byte
		
		BSF	PORTB,1		; en als we wel klaar zijn zetten we de latch 
					; een keer om zodat de data wordt weergegeven
		NOP
		NOP
		BCF	PORTB,1		; latch een keer omgooien
		return
	
		

	end	

;    8
;6	7
;    5
;2	4
;    1		3