;Első programom
;Készítette: én
;2009.12.11


	list	P=18F14K50
#include	"P18F14K50.INC"
;	__CONFIG _HS_OSC&_CP_OFF&_WDT_OFF	;Kvarc oszcillátor, kódvédelem ki, wdt ki
;__config _MCLRE_ON & _CP_OFF & _WDT_OFF & _IntRC_OSC
; MCLR láb sima I/O, kódvédelem ki, watchdog ki, belső RC oszcillátor


              config CPUDIV = NOCLKDIV
              config USBDIV = OFF
              config FOSC   = HS
              config PLLEN  = ON
              config FCMEN  = OFF
              config IESO   = OFF
              config PWRTEN = OFF
              config BOREN  = OFF
              config BORV   = 30
              config WDTEN  = OFF
              config WDTPS  = 32768
              config MCLRE  = ON      ;ez mos legyen inább ON!
              config HFOFST = OFF
              config STVREN = ON
              config LVP    = OFF
              config XINST  = OFF
              config BBSIZ  = OFF
              config CP0    = OFF
              config CP1    = OFF
              config CPB    = OFF
              config WRT0   = OFF
              config WRT1   = OFF
              config WRTB   = OFF
              config WRTC   = OFF
              config EBTR0  = OFF
              config EBTR1  = OFF
              config EBTRB  = OFF 


#define két_szélső    b'00001001'
#define két_középső   b'00000110'

	cblock
	regiszter1
	regiszter2
	delay1
	delay2
	delay3
	SZAM1
	SZAM2
	SZAM3	; összeg
	SZAM4
	endc
	
	org 0

;	banksel TRISC
	movlw	B'00000000'		;0-át írunk a W-be
	movwf	TRISC			;PORTC minden lába kimenet lesz
;	movlw	B'00001000'
	bsf		TRISB,7			;RB7 bemenet lesz
	
	goto START4		;melyik program fusson?


;----------------------START1----------------------------


START1

k_led_be
	movlw	két_középső
	movwf	PORTC			;kigyújtjuk a két középső LED-et
	call	delay1000ms

sz_led_be
	movlw	két_szélső
	movwf 	PORTC
	call	delay1000ms

	btfss	PORTB,7
	goto	START2

	goto	START1

;-------------------START2---------------------


START2
	clrf	PORTC
	movlw	b'10000001'
	movwf	PORTC
	call	delay1000ms
	movlw	b'11000011'
	movwf	PORTC
	call	delay1000ms
	movlw	b'11100111'
	movwf	PORTC
	call	delay1000ms
	movlw	b'11111111'
	movwf	PORTC
	call	delay1000ms
	movlw	b'01111110'
	movwf	PORTC
	call	delay1000ms
	movlw	b'00111100'
	movwf	PORTC
	call	delay1000ms
	movlw	b'00011000'
	movwf	PORTC
	call	delay1000ms
	movlw	b'00000000'
	movwf	PORTC
	call	delay1000ms

	btfss	PORTB,7
	goto	START1

	goto	START2

;-------------START3--------------------------

START3
	clrf	PORTC
	movlw	b'00001000'
	movwf	PORTC
FORGATAS
	call	delay100ms
	call	delay100ms
;	call	delay1000ms
	rlncf	LATC,f

	goto	FORGATAS

;-------------START4---------------------------

START4
	clrf	SZAM1
;	movlw	d'00100000'
;	movwf	SZAM1
	clrf	SZAM2
	clrf	SZAM3
	clrf	PORTC
	movlw	b'00000001'
	movwf	LATC
	clrf	W
FORGATAS2
	call	delay1000ms		;várj egy másodpercet
	btfsc	PORTB,7			;le van nyomva a gomb?
	goto	KOVETKEZO_SZAM		;ha nem, akkor léptess a következő számra
		movf	SZAM1,W
		btfss	STATUS,Z		;az első szám el van tárolva?
		goto	masodik_szam_kerdes
		call	SZAM1_tarolas	;ha nem, akkor tárold el az első számot
movff	SZAM1,LATC
goto $
		goto	FORGATAS2		;és kérdezd meg a második számot
		movf	SZAM2,W
	masodik_szam_kerdes
		btfss	STATUS,Z		;a második szám el van tárolva?	
		goto	EREDMENY		;akkor írd ki az eredményt!
		call	SZAM2_tarolas	;ha nem, akkor tárold el a második számot
KOVETKEZO_SZAM
	rlncf	LATC,f			;léptesd a következő LED-et
	goto	FORGATAS2

EREDMENY:
	movlw	d'00000000'
	movwf	LATC
	call	delay100ms
	call	delay100ms
	call	delay100ms
	movlw	d'11111111'
	movwf	LATC
	call	delay100ms
	call	delay100ms
	call	delay100ms
	movlw	d'00000000'
	movwf	LATC
	call	delay100ms
	call	delay100ms
	call	delay100ms
	movlw	d'11111111'
	movwf	LATC
	call	delay100ms
	call	delay100ms
	call	delay100ms
	movlw	d'00000000'
	movwf	LATC
	call	delay100ms
	call	delay100ms
	call	delay100ms
	movlw	d'11111111'
	movwf	LATC
	call	delay100ms
	call	delay100ms
	call	delay100ms
	movlw	d'00000000'
	movwf	LATC
	call	delay100ms
	call	delay100ms
	call	delay100ms
	movlw	d'11111111'
	movwf	LATC
	call	delay100ms
	call	delay100ms
	call	delay100ms
	movlw	d'00000000'
	movwf	LATC
	call	delay100ms
	call	delay100ms
	call	delay100ms
	movlw	d'11111111'
	movwf	LATC
	call	delay100ms
	call	delay100ms
	call	delay100ms

	clrf	PORTC
	clrf	W
	movf	SZAM1,W		;az első számot betesszük a W-be
	addwf	SZAM2,0		;a második számot hozzáadjuk
	movwf	SZAM3		;az eredményt kiírjuk a SZAM3-ba
	movff	SZAM3,LATC	;majd ugyan ezt a LED-ekre
	call	delay1000ms
	call	delay1000ms
	call	delay1000ms
	call	delay1000ms
	call	delay1000ms
	call	delay1000ms
	call	delay1000ms
	call	delay1000ms
	call	delay1000ms
	call	delay1000ms	;10 másodpercig mutatjuk az eredményt
	clrf	PORTC		;majd kikapcsoljuk a LED-eket
	
	goto	START4		;és kezdjük az egészet előrről
	

goto	$
	

START5
	clrf	LATC
	goto	$+1
	goto	START1
	goto	START2
	goto	START3
goto $
	
	


;--------------szubrutinok--------------------------------

SZAM1_tarolas:
	clrf	SZAM1
	movf	PORTC,W
	szam1_teszt_0	btfss	W,0		;az első szám 1?
					goto	szam1_teszt_1
					movlw	d'1'	;ha igen, akkor...
					movwf	SZAM1	;... írjunk 1-et a SZAM1 regiszterbe
					RETURN
	szam1_teszt_1	btfss	W,1		;az első szám 2?
					goto	szam1_teszt_2
					movlw	d'2'	;ha igen, akkor...
					movwf	SZAM1	;... írjunk 2-őt a SZAM1 regiszterbe
					RETURN
	szam1_teszt_2	btfss	W,2		;az első szám 3?
					goto	szam1_teszt_3
					movlw	d'3'	;ha igen, akkor...
					movwf	SZAM1	;... írjunk 3-at a SZAM1 regiszterbe
					RETURN
	szam1_teszt_3	btfss	W,3		;az első szám 4?
					goto	szam1_teszt_4
					movlw	d'4'	;ha igen, akkor...
					movwf	SZAM1	;... írjunk 4-et a SZAM1 regiszterbe
					RETURN
	szam1_teszt_4	btfss	W,4		;az első szám 5?
					goto	szam1_teszt_5
					movlw	d'5'	;ha igen, akkor...
					movwf	SZAM1	;... írjunk 5-öt a SZAM1 regiszterbe
					RETURN
	szam1_teszt_5	btfss	W,5		;az első szám 6?
					goto	szam1_teszt_6
					movlw	d'6'	;ha igen, akkor...
					movwf	SZAM1	;... írjunk 6-ot a SZAM1 regiszterbe
					RETURN
	szam1_teszt_6	btfss	W,6		;az első szám 7?
					goto	szam1_iras_7
					movlw	d'7'	;ha igen, akkor...
					movwf	SZAM1	;... írjunk 7-et a SZAM1 regiszterbe
					RETURN
	szam1_iras_7	movlw	d'8'
					movwf	SZAM1	;... írjunk 8-at a SZAM1 regiszterbe
					RETURN

SZAM2_tarolas:
	clrf	SZAM2
	movf	PORTC
	btfss	W,0		;az első szám 1?
		goto	$+3
		movlw	d'1'	;ha igen, akkor...
		movwf	SZAM2	;... írjunk 1-et a SZAM2 regiszterbe
	btfss	W,1		;az első szám 2?
		goto	$+3
		movlw	d'2'	;ha igen, akkor...
		movwf	SZAM2	;... írjunk 2-őt a SZAM2 regiszterbe
	btfss	W,2		;az első szám 3?
		goto	$+3
		movlw	d'3'	;ha igen, akkor...
		movwf	SZAM2	;... írjunk 3-at a SZAM2 regiszterbe
	btfss	W,3		;az első szám 4?
		goto	$+3
		movlw	d'4'	;ha igen, akkor...
		movwf	SZAM2	;... írjunk 4-et a SZAM2 regiszterbe
	btfss	W,4		;az első szám 5?
		goto	$+3
		movlw	d'5'	;ha igen, akkor...
		movwf	SZAM2	;... írjunk 5-öt a SZAM2 regiszterbe
	btfss	W,5		;az első szám 6?
		goto	$+3
		movlw	d'6'	;ha igen, akkor...
		movwf	SZAM2	;... írjunk 6-ot a SZAM2 regiszterbe
	btfss	W,6		;az első szám 7?
		goto	$+3
		movlw	d'7'	;ha igen, akkor...
		movwf	SZAM2	;... írjunk 7-et a SZAM2 regiszterbe
	btfss	W,7		;az első szám 8?
		goto	$+3
		movlw	d'8'	;ha igen, akkor...
		movwf	SZAM2	;... írjunk 8-at a SZAM2 regiszterbe
	RETURN


delay1000ms:
     movlw  d'100'
     goto       d3 
delay100ms:
     movlw      1
 d3: movwf      delay3    ;4MHz esetén 1usec/utasítás 
 d2: movlw      d'100'
     movwf  delay2
 d1: movlw      d'248'    ; belső ciklus hossza (2*konstans +3us)
     movwf  delay1
 d0: decfsz  delay1,f
     goto   d0    	 ;ahányszor visszaugrik annyiszor 2us -> 512us
     decfsz  delay2,f
     goto       d1      ;cx-2 ször fut le a belső ciklus idő: konstans*(belső+2us)
     decfsz  delay3,f
     goto       d2      

     RETURN


CIKLUS	goto	CIKLUS
	
END
