;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
	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 START3


;----------------------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	delay1000ms
;	call	delay1000ms
;	call	delay1000ms
	rlncf	LATC,f
	
	goto	FORGATAS

;-------------START4---------------------------

START4
	clrf	SZAM1
	clrf	SZAM2
	clrf	SZAM3
	clrf	PORTC
	movlw	b'00000001'
	movwf	PORTC
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
		btfss	STATUS,Z		;az első szám el van tárolva?
		goto	$+3
		call	SZAM1_tarolas	;ha nem, akkor tárold el az első számot
		goto	FORGATAS2		;és kérdezd meg a második számot
		movf	SZAM2
		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	PORTC
	call	delay100ms
	call	delay100ms
	call	delay100ms
	movlw	d'11111111'
	movwf	PORTC
	call	delay100ms
	call	delay100ms
	call	delay100ms
	movlw	d'00000000'
	movwf	PORTC
	call	delay100ms
	call	delay100ms
	call	delay100ms
	movlw	d'11111111'
	movwf	PORTC
	call	delay100ms
	call	delay100ms
	call	delay100ms
	movlw	d'00000000'
	movwf	PORTC
	call	delay100ms
	call	delay100ms
	call	delay100ms
	movlw	d'11111111'
	movwf	PORTC
	call	delay100ms
	call	delay100ms
	call	delay100ms
	movlw	d'00000000'
	movwf	PORTC
	call	delay100ms
	call	delay100ms
	call	delay100ms
	movlw	d'11111111'
	movwf	PORTC
	call	delay100ms
	call	delay100ms
	call	delay100ms
	movlw	d'00000000'
	movwf	PORTC
	call	delay100ms
	call	delay100ms
	call	delay100ms
	movlw	d'11111111'
	movwf	PORTC
	call	delay100ms
	call	delay100ms
	call	delay100ms

	clrf	PORTC
	clrf	W
	movf	SZAM1		;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,PORTC	;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	$
	
	
	


;--------------szubrutinok--------------------------------

SZAM1_tarolas
	clrf	SZAM1
	movf	PORTC
	btfss	W,0		;az első szám 1?
		goto	$+3
		movlw	d'1'	;ha igen, akkor...
		movwf	SZAM1	;... írjunk 1-et a SZAM1 regiszterbe
	btfss	W,1		;az első szám 2?
		goto	$+3
		movlw	d'2'	;ha igen, akkor...
		movwf	SZAM1	;... írjunk 2-őt a SZAM1 regiszterbe
	btfss	W,2		;az első szám 3?
		goto	$+3
		movlw	d'3'	;ha igen, akkor...
		movwf	SZAM1	;... írjunk 3-at a SZAM1 regiszterbe
	btfss	W,3		;az első szám 4?
		goto	$+3
		movlw	d'4'	;ha igen, akkor...
		movwf	SZAM1	;... írjunk 4-et a SZAM1 regiszterbe
	btfss	W,4		;az első szám 5?
		goto	$+3
		movlw	d'5'	;ha igen, akkor...
		movwf	SZAM1	;... írjunk 5-öt a SZAM1 regiszterbe
	btfss	W,5		;az első szám 6?
		goto	$+3
		movlw	d'6'	;ha igen, akkor...
		movwf	SZAM1	;... írjunk 6-ot a SZAM1 regiszterbe
	btfss	W,6		;az első szám 7?
		goto	$+3
		movlw	d'7'	;ha igen, akkor...
		movwf	SZAM1	;... írjunk 7-et a SZAM1 regiszterbe
	btfss	W,7		;az első szám 8?
		goto	$+3
		movlw	d'8'	;ha igen, akkor...
		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      

     retlw  0


CIKLUS	goto	CIKLUS
	
END
