;Harmadik programom
;Készítette: én
;2009.12.27.
;------------------------------------------------------------
	list	P=18F4520
#include	"P18F4520.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 
		config	OSC = INTIO67
		config	WDT = OFF


;#define	SZEGMENS_A	LATC,0
;#define	SZEGMENS_B	LATC,1
;#define	SZEGMENS_C	LATC,2
;#define	SZEGMENS_D	LATC,3
;#define	SZEGMENS_E	LATC,4
;#define	SZEGMENS_F	LATC,5
;#define	SZEGMENS_G	LATC,6
;#define	SZEGMENS_DP	LATC,7
;
;#define EGY		(SZEGMENS_B | SZEGMENS_C)
;#define KETTŐ	(SZEGMENS_A | SZEGMENS_B | SZEGMENS_G | SZEGMENS_E | SZEGMENS_D)
;#define HÁROM	(SZEGMENS_A | SZEGMENS_B | SZEGMENS_G | SZEGMENS_C | SZEGMENS_D)
;#define NÉGY	(SZEGMENS_F | SZEGMENS_B | SZEGMENS_G | SZEGMENS_C)
;#define ÖT		(SZEGMENS_A | SZEGMENS_F | SZEGMENS_G | SZEGMENS_C | SZEGMENS_D)
;#define HAT		(SZEGMENS_A | SZEGMENS_F | SZEGMENS_G | SZEGMENS_E | SZEGMENS_C | SZEGMENS_D)
;#define HÉT		(SZEGMENS_A | SZEGMENS_B | SZEGMENS_C)
;#define NYOLC	(SZEGMENS_A | SZEGMENS_B | SZEGMENS_C | SZEGMENS_D | SZEGMENS_E | SZEGMENS_F | SZEGMENS_G)
;#define KILENC	(SZEGMENS_A | SZEGMENS_B | SZEGMENS_C | SZEGMENS_D | SZEGMENS_F | SZEGMENS_G)
;#define NULLA	(SZEGMENS_A | SZEGMENS_B | SZEGMENS_C | SZEGMENS_D | SZEGMENS_E | SZEGMENS_F)



;********************************Kijelzéskép beállítása**********************************
;				   GFEDCBA
#define EGY		b'00000110'
#define KETTŐ	b'01011011'
#define HÁROM	b'01001111'
#define NÉGY	b'01100110'
#define ÖT		b'01101101'
#define HAT		b'01111101'
#define HÉT		b'00000111'
#define NYOLC	b'01111111'
#define KILENC	b'01101111'
#define NULLA	b'00111111'
;***************************************************************************************

#define	SZEGMENSEK	LATC
#define	DIGITEK		LATA

#define	KIJELZŐ1_DIGIT1		LATA,0
#define	KIJELZŐ1_DIGIT2		LATA,1
#define	KIJELZŐ1_DIGIT3		LATA,2
#define	KIJELZŐ1_DIGIT4		LATA,3
#define	KIJELZŐ2_DIGIT1		LATA,4
#define	KIJELZŐ2_DIGIT2		LATA,5
#define	KIJELZŐ2_DIGIT3		LATA,6
#define	KIJELZŐ2_DIGIT4		LATA,7




cblock
	SZAM1_felso
	SZAM1_also
	SZAM2_felso
	SZAM2_also
	KIJELZŐ_1_felső_bájt
	KIJELZŐ_1_alsó_bájt
	KIJELZŐ_2_felső_bájt
	KIJELZŐ_2_alsó_bájt
	ezresek
	szazasok
	tizesek
	egyesek
	KIJELZŐ_1_tp_helye
	KIJELZŐ_2_tp_helye
	delay0
	delay1
	delay2
	delay3
	Nullakioltas
endc
	
org 0

;	banksel TRISC
	movlw	B'00000000'		;0-át írunk a W-be
	movwf	TRISA			;PORTA minden lába kimenet lesz
	movwf	TRISB			;PORTB minden lába kimenet lesz
	movwf	TRISC			;PORTC minden lába kimenet lesz
	movwf	TRISD			;PORTD minden lába kimenet lesz

	clrf	LATA
	clrf	LATB
	clrf	LATC
	clrf	LATD
	
	goto START1		;melyik program fusson?

;-------------------------------------------------------------------------------
;----------------------START1---------------------------------------------------
;-------------------------------------------------------------------------------
START1

	clrf	DIGITEK
	clrf	SZEGMENSEK


movlw	b'00000000'
movwf	KIJELZŐ_1_felső_bájt
movlw	b'00000010'
movwf	KIJELZŐ_1_alsó_bájt
movlw	b'00000000'
movwf	KIJELZŐ_2_felső_bájt
movlw	b'00000000'
movwf	KIJELZŐ_2_alsó_bájt

movlw	b'00001000'
movwf	KIJELZŐ_1_tp_helye


	movff	KIJELZŐ_1_felső_bájt, SZAM1_felso
	movff	KIJELZŐ_1_alsó_bájt, SZAM1_also
	call	KONV_13bit_4digit

	movlw	b'00000100'
	movwf	LATC
	movwf	LATA

	
k1d1:	tstfsz	ezresek			;a szám nulla?
		goto	k1d1k			;ha nem nulla, akkor jelezd ki!
		btfss	KIJELZŐ_1_tp_helye,3	;x.xxx-es a kijelzés?
		goto	k1d2					;ha nem, akkor ne jelezz ki hanem lépj tovább a következő digitre!
k1d1k:	bsf		KIJELZŐ1_DIGIT1		;bekapcsoljuk az első kijelző legnagyobb helyiértékű digitjét
		movf	ezresek, W
		call	TÁBLA1				;az ezresek regiszter tartalmát átkonvertáljuk kijelzésképpé
		movwf	SZEGMENSEK			;majd kijelezzük a számot
		call	delay10ms			;rövid ideig tartjuk a kijelzést
		bcf		KIJELZŐ1_DIGIT1		;aztán lekapcsoljuk a digitet
		clrf	SZEGMENSEK			;és a szegmenseket is

goto$

k1d2:	tstfsz	szazasok		;a szám nulla?
;		goto	k1d2k			;ha nem nulla, akkor jelezd ki!
;		btfss	KIJELZŐ_1_tp_helye,2	;xx.xx-es a kijelzés?
;		goto	k1d3					;ha nem, akkor ne jelezz ki hanem lépj tovább a következő digitre!
;k1d2k:	bsf		KIJELZŐ1_DIGIT2		;bekapcsoljuk az első kijelző balról a második digitjét
;		movf	szazasok	
;		call	TÁBLA1				;az ezresek regiszter tartalmát átkonvertáljuk kijelzésképpé
;		movwf	SZEGMENSEK			;majd kijelezzük a számot
;		call	delay10ms			;rövid ideig tartjuk a kijelzést
;		bcf		KIJELZŐ1_DIGIT2		;aztán lekapcsoljuk a digitet
;		clrf	SZEGMENSEK			;és a szegmenseket is

	



		
TÁBLA1
	rlncf	WREG, W		;W szorzása kettővel
	addwf	PCL,F		;W HOZZÁADÁSA A PROGRAMSZÁMLÁLÓ ALSÓ BYTE-JÁHOZ
	retlw	NULLA
	retlw	EGY
	retlw	KETTŐ
	retlw	HÁROM
	retlw	NÉGY
	retlw	ÖT
	retlw	HAT
	retlw	HÉT
	retlw	NYOLC
	retlw	KILENC
RETURN

	

	



goto$




;-------------------------------------------------------------------------
;------------SZUBRUTINOK--------------------------------------------------
;-------------------------------------------------------------------------

KONV_13bit_4digit
	clrf	ezresek
	clrf	szazasok
	clrf	tizesek
	clrf	egyesek

Osztas_ezerrel
	movlw	b'00000011'			;először felső bájt
	subwf	SZAM1_felso, w		;kivonás
	btfss	STATUS, C			;ha alulcsordulás van, akkor...
	goto	Osztas_szazzal		;...akkor osszunk tovább százzal
	tstfsz	WREG				;de ha nulla, akkor is százzal osszunk tovább!
	goto	oe
		incf	ezresek
		movwf	SZAM1_felso			;eredmény tárolása
		movlw	b'11101000'			;azután alsó bájt
		subwf	SZAM1_also, w		;kivonás
		movwf	SZAM1_also    		;eredmény tárolás
		goto	Osztas_szazzal
oe	movwf	SZAM1_felso			;eredmény tárolása
	movlw	b'11101000'			;azután alsó 
	subwf	SZAM1_also, w		;kivonás
	movwf	SZAM1_also    		;eredmény tárolás
	btfss	STATUS, C    		;
	decf	SZAM1_felso			;felső bájt dekrementálása
	incf	ezresek
	goto	Osztas_ezerrel

Osztas_szazzal
	movlw	b'01100100'			;írjunk decimálisan 100-at a W-be
	subwf	SZAM1_also, w		;kivonás
	btfsc	STATUS, C    		;ha alulcsordult, akkor ugrik
	goto	$+10				; (b-hez ugorjon)
	tstfsz	SZAM1_felso			;ha a felso bajt nulla, akkor ugrik!
	goto	$+6					; (a-hoz ugorjon) ha alulcsordult, de a felso bájt nem nulla
	goto	Osztas_tizzel
	decf	SZAM1_felso			; (a) felso bájt dekrementálása
	movwf	SZAM1_also    		; (b) eredmény tárolás
	incf	szazasok
	goto	Osztas_szazzal

Osztas_tizzel
	movlw	b'00001010'			;decimálisan 10-et írunk a W-be
	subwf	SZAM1_also, w		;kivonás
	btfss	STATUS, C			;ha alulcsordulás van, akkor...
	goto	$+10
	incf	tizesek
	movwf	SZAM1_also
	goto	Osztas_tizzel
	movff	SZAM1_also,egyesek
	movff	SZAM1_also,egyesek

RETURN						;konverzió befejezve!




;delay1000s:
;	movlw   d'100'
;	movwf	delay1
;	movlw	d'100'
;	movwf	delay2
;	movlw	d'100'
;	movwf	delay3
;	goto    d1
;delay100s:
;	movlw   d'100'
;	movwf	delay1
;	movlw	d'100'
;	movwf	delay2
;	movlw	d'10'
;	movwf	delay3
;	goto    d1 
;delay10s:
;	movlw	d'100'
;	movwf	delay2
;	movlw	d'100'
;	movwf	delay3
;	goto    d2 
;delay1s:
;	movlw	d'10'
;	movwf	delay2
;	movlw	d'100'
;	movwf	delay3
;	goto    d2 
;delay100ms:
;	movlw   d'100'
;	movwf	delay3
;	goto    d3 
;delay10ms:
;	movlw	d'10'
;	movwf	delay3
;	goto    d3
;delay1ms:
;	movlw	d'1'
;	movwf	delay3
;	goto    d3 	
;d1:	decfsz	delay1,f
;	goto	d1
;d2:	decfsz	delay2,f
;	goto	d2
;d3:	decfsz	delay3,f
;	goto	d3
;d0:	movlw	d'248'	;   d'248'
;	movwf	delay0
;	decfsz	delay0,f
;	goto	$-2
;RETURN



delay100ms:
	movlw	d'100'		;100ms
	goto	d2
delay10ms:
	movlw	d'10'		;10ms
	goto	d2
delay1ms:
	movlw	d'1'		;1ms
d2:	movwf	delay1
d1:	movlw	d'248'	
	movwf	delay0	
d0:	decfsz	delay0,f
	goto	d0
	decfsz	delay1,f
	goto	d1

RETURN




goto$
END