	list p=16F628a
	#include "p16f628a.inc"	; De definities
	__CONFIG _CP_OFF & _BODEN_OFF & _DATA_CP_OFF & _PWRTE_ON & _WDT_OFF & _LVP_OFF & _MCLRE_ON & _XT_OSC

tempw		EQU	20h
teller		EQU	21h
delay		EQU	22h
teller1		EQU	23h
teller2		EQU	24h
teller3		EQU	25h
wachttijd	EQU	26h
richting	EQU	27h
teller4		EQU	28h
tempint		EQU	29h
dataL		EQU	2Ah
sendinterval	EQU	2Bh

	ORG 00h
		GOTO 	init

	ORG 04h						; interrupt, wordt als het goed is 1x per 16 msec aangeroepen
		MOVWF	tempw
		BCF 	INTCON,2 		; enable volgende interrupt, timer

		BSF		PORTB,0			; controle LED aan
		BSF		PORTB,3			; servo puls aan
		CALL	dservo			; wacht 1 tot 2 msec, afhankelijk van delay
		BCF		PORTB,0			; LED uit
		BCF		PORTB,3			; servo puls uit
		MOVFW	tempw
		RETFIE

init	CLRF 	PORTB		; INIT
		CLRF	PORTA
		BCF 	STATUS, 6		;Select Bank1 \
		BSF 	STATUS, 5		;Select Bank1 --> bitje 5 en 6 bepalen de bank
		MOVLW 	b'11110010' 		
		MOVWF 	TRISB 			;PORTB wordt output
		MOVLW	0x0F
		MOVWF	TRISA			;PORTA wordt half input

		BCF		OPTION_REG,5	; enable timer mode (clr T0CS)
		BCF		OPTION_REG,3	; prescaler wel nodig
								
		BSF		OPTION_REG,2
		BCF		OPTION_REG,1
		BSF		OPTION_REG,0	; Prescaler op 101 = 64 (64 * 256 = 16 msec)

        movlw	0x19				; COM: 0x19=9600 bps (0x0C=19200 bps)	(1 stop bit, no parity)
        movwf	SPBRG
        movlw	b'00100100'			; COM: brgh = high (2)
        movwf	TXSTA				; COM: enable Async Transmission, set brgh

		BCF		STATUS, 6		; \
		BCF		STATUS, 5 		; --> Select Bank0

        MOVLW	b'10010000'			; COM: enable Async Reception
        MOVWF	RCSTA 				; COM



        CLRF	dataL				; COM: delay, rustig beginnen
cdelay  DECFSZ	dataL,F				; COM
        GOTO	cdelay				; COM

        MOVF	RCREG,W				; COM
        MOVF	RCREG,W				; COM
        MOVF	RCREG,W				; COM: flush receive buffer 

		BSF		INTCON,7		; enable all interrupts
		BSF		INTCON,5		; enable timer interrupt

		MOVLW   07h 			; Dit had geloof ik te maken met de input poorten voor porta
		MOVWF   1fh				; Analoge input uitschakelen

		MOVLW	0ah
		MOVWF	wachttijd		; wachttijd initialiseren
		MOVLW	00h
		MOVWF	richting	; EINDE INIT
main
		BTFSS	PORTA,2
		GOTO 	next
		DECFSZ	sendinterval,1		; COM: 1 keer per 256 de com poort gebruiken
		GOTO	next				; COM: anders vertraagd het programma teveel
		MOVLW	0x40
		MOVWF	sendinterval
		BTFSC	wachttijd,7
		CALL	send1
		BTFSS	wachttijd,7
		CALL	send0
		BTFSC	wachttijd,6
		CALL	send1
		BTFSS	wachttijd,6
		CALL	send0
		BTFSC	wachttijd,5
		CALL	send1
		BTFSS	wachttijd,5
		CALL	send0
		BTFSC	wachttijd,4
		CALL	send1
		BTFSS	wachttijd,4
		CALL	send0
		BTFSC	wachttijd,3
		CALL	send1
		BTFSS	wachttijd,3
		CALL	send0
		BTFSC	wachttijd,2
		CALL	send1
		BTFSS	wachttijd,2
		CALL	send0
		BTFSC	wachttijd,1
		CALL	send1
		BTFSS	wachttijd,1
		CALL	send0
		BTFSC	wachttijd,0
		CALL	send1
		BTFSS	wachttijd,0
		CALL	send0

        MOVLW	0x0D 					; CR
        CALL	send
        MOVLW	0x0A 					; LF
        CALL	send				; END COM


next	BTFSC	PORTA,0
		CALL	tijddown		; Als knop 0 is ingedrukt verkort de tijd
		BTFSC	PORTA,1		
		CALL	tijdup			; Bij knop 1 verleng de tijd
		BTFSC	PORTA,3
		CALL	alarm
		MOVFW	wachttijd		; softtimer om snelheid van de beweging te bepalen
		MOVWF	teller2
slbegin	MOVLW	0x40
		MOVWF	teller1
slwait	NOP
		NOP
		NOP
		NOP
		NOP
		DECFSZ	teller1,1
		GOTO	slwait

		DECFSZ	teller2,1
		GOTO	slbegin			; einde softtimer

		BTFSS	richting,0		; richting 1 is dan 
		GOTO	servoup			; moet de servo omhoog
		GOTO	servodown		; en anders naar beneden
servoup
		INCFSZ	delay,1	;1
		GOTO	main
		DECF	delay,1
		MOVLW	01h
		MOVWF	richting
		GOTO	main		;2
servodown
		DECFSZ	delay,1			; delay = delay-1, niet nul? 
		GOTO	main			; niet nul? doorgaan!
		MOVLW	00h				; wel nul? richting veranderen
		MOVWF	richting
		MOVLW	0x01
		MOVWF	delay
		GOTO	main
								; functies
tijdup
		INCF	wachttijd,1		; Tijd verlengen
		CALL	ssleep			; tijdje wachten om te voorkomen dat je deze knop 1000x
		RETURN					; in kan drukken per msec :P

tijddown
		DECF	wachttijd,1		; Tijd inkorten
		CALL	ssleep			; zie boven
		RETURN

dservo						; Maakt delay van 1-2 msec om de stand van de servo te bepalen
		MOVFW	delay			; Met delay wordt 4 * [delay] usecs gewacht (0.004 msec tot 1.02 msec)
		MOVWF	teller
dsloop	NOP						; Totaal 4 cycles wachten,
		NOP						; Correctie 6! geeft een grotere uitslag op deze servo
		NOP						; 4 werkte ook maar geeft minder effect
		DECFSZ 	teller,1
		GOTO	dsloop

		MOVLW	0xFF			; Tenslotte nog 1 msec extra vertraging, 
		MOVWF	teller			; dit zorgt ervoor dat de functie 1.02 tot 2.04 msecs duurt
dsloop2	NOP
		DECFSZ	teller,1
		GOTO 	dsloop2

		RETURN	


ssleep	MOVLW	0x80		; Een laatste delay, om knopjes te ontdenderen (128 msec)
		MOVWF	teller4

sslbg	MOVLW	0xFA			; innerloop, 1 msec
		MOVWF	teller3
ssleepp	NOP
		DECFSZ	teller3,1
		GOTO	ssleepp

		DECFSZ	teller4,1		; outerloop, 128 keer
		GOTO	sslbg

		RETURN

send1	MOVLW	'1'
		CALL	send
		RETURN

send0	MOVLW	'0'
		CALL	send
		RETURN

send    MOVWF	TXREG			; send data in W
		BSF		INTCON,2		; tijdelijk disable interrupt
TransWt BSF		STATUS,RP0		; RAM PAGE 1
WtHere  BTFSS	TXSTA,TRMT		; (1) transmission is complete if hi
        GOTO	WtHere

        BCF		STATUS,RP0		; RAM PAGE 0
		BCF 	INTCON,2		; enable interrupt
        RETURN 

alarm	BSF		OPTION_REG,5	; tijdelijk disable interrupt
		MOVLW	0x00
		MOVWF	PORTB
		MOVLW	'a'
		CALL	send
		MOVLW	'l'
		CALL	send
		MOVLW	'a'
		CALL	send
		MOVLW	'r'
		CALL	send
		MOVLW	'm'
		CALL	send

		BTFSS	PORTA,2
		GOTO	alarm
		BCF 	OPTION_REG,5		; enable interrupt
		RETURN
	end	