; 4 MHz-es BELSŐ rezonátor van használatban, eszerint egy utasítás végrehajtása 1 mikro-sec.

	list      p=12F683
	#include <p12F683.inc>

	errorlevel  -302

	__CONFIG   _FCMEN_ON & _IESO_OFF & _CP_OFF & _CPD_OFF & _BOD_OFF & _MCLRE_ON & _WDT_OFF & _PWRTE_ON & _INTOSCIO


;      \\\\\\\\\\\\\\\    VÁLTOZÓK    ///////////////

		cblock 	0x20
				TEMP
		endc


;**********************************************************************

		ORG     0x000             ; reset vektor
		clrf    PCLATH
  		goto    main


;      \\\\\\\\\\\\\\\    MEGSZAKÍTÁS    ///////////////

;		ORG     0x004             ; interrupt vector location
;		movwf   w_temp            ; save off current W register contents
;		movf	STATUS,w          ; move status register into W register
;		movwf	status_temp       ; save off contents of STATUS register


;		movf    status_temp,w     ; retrieve copy of STATUS register
;		movwf	STATUS            ; restore pre-isr STATUS register contents
;		swapf   w_temp,f
;		swapf   w_temp,w          ; restore pre-isr W register contents
;		retfie                    ; return from interrupt with INTERRUPT ENABLE


;      \\\\\\\\\\\\\\\    FŐPROGRAM    ///////////////

main	bsf 	STATUS,RP0
  		movlw 	d'249'
   		movwf 	PR2
		bsf		OSCCON,SCS
   		bcf 	STATUS,RP0

		movlw 	b'00000000'  	  ; kitöltési tényező 9. - 2. bitjeinek beállítása
   		movwf 	CCPR1L

   		movlw 	b'00000111'		  ; komparátor modul kikapcsolva !
		movwf	CMCON0

		bsf 	STATUS,RP0

		clrf	ANSEL			  ; bemenetek digitálisak !

  		bcf		TRISIO,2		  ; CCP láb kimenetté való beállítása

   		bcf 	STATUS,RP0

   		bsf 	T2CON,T2CKPS0     ; 1:4 előosztó
		bsf		T2CON,TMR2ON	  ; TMR2 modul bekapcsolása

		movf 	CCP1CON,W
	   	andlw 	b'00110000'  	  ; kitöltési tényező maszkolása
	   	iorlw 	b'00001101'  	  ; PWM modul elindítása
  		movwf 	CCP1CON

		bsf		WPU,5			  ; belső felhúzó ellenállások bekapcsolása
		bsf		WPU,4			  ; a bemeneti lábakon

loop	btfss	GPIO,GP5		  ;   \
		goto	novel			  ;    \_
		btfss	GPIO,GP4		  ;     _>  FŐ RUTIN
		goto	csokk			  ;    /
		goto	loop			  ;   /

novel	call	delay
		btfsc	GPIO,GP5		  ; még mindig tart a gombnyomás?
		goto	loop			  ; <<< NEM
		movlw	d'1'			  ; <<< IGEN
		addwf	CCPR1L,1
		btfsc	STATUS,C
		call	teli
		goto	loop

csokk	call	delay
		btfsc	GPIO,GP4		  ; még mindig tart a gombnyomás?
		goto	loop			  ; <<< NEM
		movlw	d'1'			  ; <<< IGEN
		subwf	CCPR1L,1
		btfss	STATUS,C
		call	ures
		goto	loop


;      \\\\\\\\\\\\\\\    SZUBRUTINOK    ///////////////

teli	movlw 	b'11111111'		  ; felső korlátozás
  		movwf 	CCPR1L
		return


ures	movlw 	b'00000000'		  ; alsó korlátozás
  		movwf 	CCPR1L
		return


delay  	movwf	TEMP			  ; W átmeneti elmentése
		bcf		T1CON,TMR1ON	  ; ha már futna korábbról a TIMER_1  >>  leállítjuk
		bcf		PIR1,TMR1IF		  ; TIMER_1 túlcsordulását jelző flag törlése
		clrf	TMR1H			  ; TIMER_1 regisztereinek nullázása
		clrf	TMR1L			  
		bsf		T1CON,TMR1ON	  ; TIMER_1 indítása
tcsord	btfss	PIR1,TMR1IF		  ; megtörtént a túlcsordulás?
		goto	tcsord			  ; <<< NEM
		movf	TEMP,0			  ; <<< IGEN + az átmenetileg elmentett W visszatöltése
		return

		END                       ; program vége