LIST P=pic16f628a
INCLUDE "p16f628a.inc"
 ERRORLEVEL	0,	-302		; suppress bank selection messages
 __CONFIG _HS_OSC&_CP_OFF&_WDT_OFF&_LVP_OFF



		cblock	0x20			;start of general purpose registers
		
			count1			;used in delay routine
			counta			;used in delay routine
			countb			;used in delay routine
			tmp1			;temporary storage
			tmp2
			p_temp			;save register
			s_temp			;save register
			w_temp			;save register
			tens			;tens storage
			ones			;ones storage
			harmasok	
			negyesek
			;szorzásra
a
h
r
n

			;binárisból decimális
			COUNTER1
			COUNTER2
			DIGIT1
        	DIGIT2
         	DIGIT3
        	DIGIT4
         	DIGIT5
        	DIGIT6
        	DIGIT7
         	DIGIT8
			COUNT0
			COUNT1		
			COUNT2
		
		endc

mulcnd  equ     09      ; 8 bit multiplicand
mulplr  equ     10      ; 8 bit multiplier
H_byte  equ     12      ; High byte of the 16 bit result
L_byte  equ     13      ; Low byte of the 16 bit result
count   equ     14      ; loop counter

Same    equ     1

SEG_PORT	Equ	PORTB			;7 segment port
SEG_TRIS	Equ	TRISB
DIG_PORT	Equ PORTA
DIG_TRIS	Equ	TRISA
NEXT_DIG



		org	0x0000
		goto	Initialise  ;ez a végefelé van!

;**************************************************************************	
;			     	Interrupt routine
;**************************************************************************


	ORG	0x0004


INT
	
	bcf 	STATUS,	RP0	;select bank 0
		bcf	INTCON,PEIE		; Disable all peripheral interrupts
		bcf	INTCON,GIE		; Global interrupt disable
	
		movwf	w_temp		; Save W register
		swapf	STATUS,W	; Swap status to be saved into W
		movwf	s_temp		; Save STATUS register
		movfw	PCLATH
		movwf	p_temp		; Save PCLATH 
	
	

		
		Btfsc	PIR1,TMR1IF
		Goto	TMR0Ki
		Goto	kiiras
	
		


TMR0Ki
		bcf	T1CON,TMR1ON	; Timer1 megállítás
		bcf	PIR1,TMR1IF	; Timer1 IT flag törlés
		bsf	T1CON,TMR1ON	; Timer1 start		
		clrwdt
		MOVFw TMR0	; ez kell majd		
		movwf	h
		clrf	TMR0
		goto kiiras

;innen binárisból decimális digitenként
kiiras			; ITT HA ÉRTÉKET ADOK A h és a 	VÁLTOZÓNAK, AKKOR MEGY RENDESEN A KIÍRÁS!
movlw 	b'00000000'	;a felszorzás után 16 bit lesz, de most ennek a felső része 'a'=0, a h változóban van a mért érték.
	    movwf   a       
  	clrf 	DIGIT1 	;eredmény-regiszterek nullázása
  	clrf 	DIGIT2 	 
  	clrf 	DIGIT3 	 
  	clrf 	DIGIT4 	 
  	clrf 	DIGIT5 	 
  	btfsc 	a,7 	;helyiértékek szétosztása
  	call 	H7 	 
  	btfsc 	a,6 	 
  	call 	H6 	 
  	btfsc 	a,5 	 
  	call 	H5 	 
  	btfsc 	a,4 	 
  	call 	H4 	 
  	btfsc 	a,3 	 
  	call 	H3 	 
  	btfsc 	a,2 	 
  	call 	H2 	 
  	btfsc 	a,1 	 
  	call 	H1 	 
  	btfsc 	a,0 	 
  	call 	H0 	 
  	btfsc 	h,7 	 
  	call 	L7 	 
  	btfsc 	h,6 	 
  	call 	L6 	 
  	btfsc 	h,5 	 
  	call 	L5 	 
  	btfsc 	h,4 	 
  	call 	L4 	 
  	movlw 	0x0F 	 
  	andwf 	h,0 	;W = h alsó négy bitje
  	addwf 	DIGIT1,1 	 
T1 	movlw 	0x0A 	;DIGIT1 értéktúllépés vizsgálata
  	subwf 	DIGIT1,0 	 
  	btfss 	STATUS,0 	 
  	goto 	T2 	;ugrik, ha már nincs értéktúllépés
  	movwf 	DIGIT1 	 
  	incf 	DIGIT2,1 	 
  	goto 	T1 	 
T2 	movlw 	0x0A 	;DIGIT2 értéktúllépés vizsgálata
  	subwf 	DIGIT2,0 	 
  	btfss 	STATUS,0 	 
  	goto 	T3 	;ugrik, ha már nincs értéktúllépés
  	movwf 	DIGIT2 	 
  	incf 	DIGIT3,1 	 
  	goto 	T2 	 
T3 	movlw 	0x0A 	;DIGIT3 értéktúllépés vizsgálata
  	subwf 	DIGIT3,0 	 
  	btfss 	STATUS,0 	 
  	goto 	T4 	;ugrik, ha már nincs értéktúllépés
  	movwf 	DIGIT3 	 
  	incf 	DIGIT4,1 	 
  	goto 	T3 	 
T4 	movlw 	0x0A 	;DIGIT4 értéktúllépés vizsgálata
  	subwf 	DIGIT4,0 	 
  	btfss 	STATUS,0 	 
  	goto 	VEGE 	;ugrik, ha már nincs értéktúllépés
  	movwf 	DIGIT4 	 
  	incf 	DIGIT5,1 	 
  	goto 	T4 	 

 	  	 
  		  	 
H7 	movlw 	0x03 	;32768 szétosztása
  	addwf 	DIGIT5,1 	 
  	movlw 	0x02 	 
  	addwf 	DIGIT4,1 	 
  	movlw 	0x07 	 
  	addwf 	DIGIT3,1 	 
  	movlw 	0x06 	 
  	addwf 	DIGIT2,1 	 
  	movlw 	0x08 	 
  	addwf 	DIGIT1,1 	 
  	return 	  	 
H6 	incf 	DIGIT5,1 	;16384 szétosztása
  	movlw 	0x06 	 
  	addwf 	DIGIT4,1 	 
  	movlw 	0x03 	 
  	addwf 	DIGIT3,1 	 
  	movlw 	0x08 	 
  	addwf 	DIGIT2,1 	 
  	movlw 	0x04 	 
  	addwf 	DIGIT1,1 	 
  	return 	  	 
H5 	movlw 	0x08 	;8192 szétosztása
  	addwf 	DIGIT4,1 	 
  	incf 	DIGIT3,1 	 
  	movlw 	0x09 	 
  	addwf 	DIGIT2,1 	 
  	movlw 	0x02 	 
  	addwf 	DIGIT1,1 	 
  	return 	  	 
H4 	movlw 	0x04 	;4096 szétosztása
  	addwf 	DIGIT4,1 	 
  	movlw 	0x09 	 
  	addwf 	DIGIT2,1 	 
  	movlw 	0x06 	 
  	addwf 	DIGIT1,1 	 
  	return 	  	 
H3 	movlw 	0x02 	;2048 szétosztása
  	addwf 	DIGIT4,1 	 
  	movlw 	0x04 	 
  	addwf 	DIGIT2,1 	 
  	movlw 	0x08 	 
  	addwf 	DIGIT1,1 	 
  	return 	  	 
H2 	incf 	DIGIT4,1 	;1024 szétosztása
  	movlw 	0x02 	 
  	addwf 	DIGIT2,1 	 
  	movlw 	0x04 	 
  	addwf 	DIGIT1,1 	 
  	return 	  	 
H1 	movlw 	0x05 	;512 szétosztása
  	addwf 	DIGIT3,1 	 
  	incf 	DIGIT2,1 	 
  	movlw 	0x02 	 
  	addwf 	DIGIT1,1 	 
  	return 	  	 
H0 	movlw 	0x02 	;256 szétosztása
  	addwf 	DIGIT3,1 	 
  	movlw 	0x05 	 
  	addwf 	DIGIT2,1 	 
  	movlw 	0x06 	 
  	addwf 	DIGIT1,1 	 
  	return 	  	 
L7 	incf 	DIGIT3,1 	;128 szétosztása
  	movlw 	0x02 	 
  	addwf 	DIGIT2,1 	 
  	movlw 	0x08 	 
  	addwf 	DIGIT1,1 	 
  	return 	  	 
L6 	movlw 	0x06 	;64 szétosztása
  	addwf 	DIGIT2,1 	 
  	movlw 	0x04 	 
  	addwf 	DIGIT1,1 	 
  	return 	  	 
L5 	movlw 	0x03 	;32 szétosztása
  	addwf 	DIGIT2,1 	 
  	movlw 	0x02 	 
  	addwf 	DIGIT1,1 	 
  	return 	  	 
L4 	incf 	DIGIT2,1 	;16 szétosztása
  	movlw 	0x06 	 
  	addwf 	DIGIT1,1 	 
  	return 	  	 

;idáig a binárisból decimális

VEGE


	
	
		incf	NEXT_DIG,F
		movfw	NEXT_DIG
		andlw	0x04
		xorlw	0x04
		BNZ		UGRO_TBL
		Clrf	NEXT_DIG
		;goto	Do_tens

Do_onces
		
		movfw	DIGIT1
		andlw	0x0F		;make sure in range of table
		call	LED_Table
		movwf	SEG_PORT
		movlw	b'00000001'
		movwf	DIG_PORT
		goto	INTX

UGRO_TBL

		movfw	NEXT_DIG
		addwf	PCL,F
		GOTO 	Do_onces
		GOTO	Do_tens
		GOTO	Do_harmas
		GOTO	Do_negyes
	
Do_tens	
		movfw	DIGIT2
		call	LED_Table
		movwf	SEG_PORT
		movlw	b'00000010'
		movwf	DIG_PORT
		goto 	INTX

Do_harmas
		movfw	DIGIT3	
		andlw	0x0F		;make sure in range of table
		call	LED_Table
		movwf	SEG_PORT
		movlw	b'00000100'
		movwf	DIG_PORT
		goto	INTX

Do_negyes
		movfw	DIGIT4
		andlw	0x0F		;make sure in range of table
		call	LED_Table
		movwf	SEG_PORT
		movlw	b'00001000'
		movwf	DIG_PORT
		goto	INTX
						;Idáig megy a kiírás, gyakorlatban ezzel nincs gond!

INTX
	
		movfw	p_temp
		movwf	PCLATH		; Restore PCLATH
		swapf	s_temp,W
		movwf	STATUS		; Restore STATUS register - restores bank
		swapf	w_temp,F
		swapf	w_temp,W	; Restore W register
	
	
	   	bcf 	STATUS,	RP0	;select bank 0
	
		clrwdt
		bsf	INTCON,PEIE		; enable all peripheral interrupts
		bsf	INTCON,GIE		; Global interrupt enable
		bsf	T1CON,TMR1ON	; Timer1 start	
	
	retfie

LED_Table  	
				ADDWF   PCL       , f
						 ;PGFEDCBA
            	RETLW   b'11000000'		;0
            	RETLW   b'11111001'		;1
            	RETLW   b'10100100'		;2
            	RETLW   b'10110000'		;3
            	RETLW   b'10011001'		;4
            	RETLW   b'10010010'		;5
            	RETLW   b'10000010'		;6
            	RETLW   b'11111000'		;7
            	RETLW   b'10000000'		;8
            	RETLW   b'10010000'		;9
            	;RETLW   b'11111111'		;blank
            	;RETLW   b'11111111'		;blank
            	;RETLW   b'11111111'		;blank
            	;RETLW   b'11111111'		;blank
            	;RETLW   b'11111111'		;blank
            	;RETLW   b'11111111'		;blank


Initialise	
		
movlw	0x07
		movwf	CMCON			;turn comparators off (make it like a 16F84)
		bsf 	STATUS,		RP0	;select bank 1
		movlw	b'00000000'		;Set port data directions, data output
		movwf	SEG_TRIS
		movlw   b'00010000'
		movwf	DIG_TRIS		
	
;------------------------------------------------------------------------------
; Timer0 konfigurálása

			movlw b'10111111'   
			movwf	OPTION_REG	
	
	bcf 	STATUS,		RP0	;select bank 0
	
	
;------------------------------------------------------------------------------
; Timer1 konfigurálása
;
		movlw	1		; TMR1IE=1
		movwf	PIE1		; Timer1 megszakítás engedélyezés
		bcf	STATUS,RP0	; bank0 kiválasztás
		movlw	b'00110001'   
		movwf	T1CON		
		clrf	INTCON		
;------------------------------------------------------------------------------
	
		movlw	0x192		; GIE=1, PEIE=1
		movwf	INTCON		; Timer1 IT engedélyezés
		bsf	T1CON,TMR1ON	; Timer1 start		
		bcf	T2CON,TMR2ON


		bcf 	STATUS,	RP0	;select bank 0
	
		bsf	INTCON,PEIE		; Enable all peripheral interrupts
		bsf	INTCON,GIE		; Global interrupt enable
		bcf 	STATUS,		RP0	;select bank 0



goto Main
		

Main
	
	
goto Main
	END


END
