LIST P=pic16f628a
INCLUDE "p16f628a.inc"
 ERRORLEVEL	0,	-302		; suppress bank selection messages
 __CONFIG _HS_OSC&_CP_OFF&_WDT_OFF&_LVP_OFF


cblock	0x20    ;Deklaráció kezdete
		p_temp			;Interrupt rutin regiszterek mentésére és visszaállításához
		s_temp		
		w_temp
		W_TMP
		W_TMP2	
		DIGIT1
        DIGIT2
        DIGIT3	;A kijelzendő számok
        DIGIT4
        DIGIT5
        DIGIT6
        DIGIT7
        DIGIT8
		NEXT_DIG
		timer1also
		timer1felso
		voltbejel
		osztandofelso
		osztandoalso
		timer1tulcsordult

			count			;used in looping routines
			count1			;used in delay routine
			counta			;used in delay routine
			countb			;used in delay routine

		OSZTÓ_H				;osztáshoz szükséges változók
		OSZTÓ_L
		MARADÉK_H
		MARADÉK_L
		OSZTAND_EREDMÉNY_Z
		OSZTAND_EREDMÉNY_U	; ide adódik a részeredmény és tolódik jobbra
		OSZTAND_EREDMÉNY_H
		OSZTAND_EREDMÉNY_L	; ide töltődik a hányados
		
		OSZTÓ_CIKLUS		; 32

		
Endc	;Vége a deklarációnak

SEG_PORT	Equ	PORTB			;7 segmens portjai (ebből egy a bemenet lesz, RB0/INT)
SEG_TRIS	Equ	TRISB			;Szegmens beállításhoz
DIG_PORT	Equ PORTA			;Digitek portjai
DIG_TRIS	Equ	TRISA			;Digitek beállításához
;NEXT_DIG						;Digit számláló, éppen melyiket íratjuk ki



org	0x00		
Goto	Initialise

ORG	0x0004	;Interrupt (megszakítás) rutin
		movwf	w_temp		
		swapf	STATUS,W	;w és status regiszterek mentése, hogy a bennük lévő adat visszaállítható legyen, amikor visszatérünk a főprogramba
		movwf	s_temp

		bcf		INTCON,6	;Periféria megszakítás tiltva
		bcf		INTCON,7	;Minden megszakítás tiltva
	
	
		movlw	b'00000001'
	;	btfsc	PIR1,TMR1IF	;Timer1 csordult túl? akkor:
	;	goto	tm1tulcs
	;	movwf	timer1tulcsordult
	;	btfsc	PIR1,TMR1IF	;Timer1 csordult túl? akkor:
	;	bcf		PIR1,TMR1IF	;Timer1 jelzőbit törlése
	;	goto	vissza2
;	vissza2	
		btfsc	INTCON,INTF	;RB0/INT volt a megszakítás okozója? ha igen:
		goto	timer1adatki
	vissza	
		bsf		INTCON,6	;Periféria megszakítás engedélyezve
		bsf		INTCON,7	;Minden megszakítás engedélyezve
	

		swapf	s_temp,W
		movwf	STATUS
		swapf	w_temp,F	;w és status regiszterek visszaállítása
		swapf	w_temp,w
RETFIE	;Visszatérés a főprogramba

tm1tulcs
		bcf		STATUS,RP0		;BANK0-ra váltás
		bsf		T1CON,0		;Timer1 megállítása
		bcf		PIR1,TMR1IF	;Timer1 jelzőbit törlése
		bcf		INTCON,INTF ;RB0/INT jelzőbit törlése
		clrf	TMR1L			
		clrf	TMR1H			;Timer1 értékének törlése
		movlw	b'00000001'
		movwf	timer1tulcsordult
		movlw	b'00000000'
		movwf	voltbejel
		movlw	b'11111110'
		Movwf	PORTB
		movlw	b'00000000'
		movwf	PORTA
		movlw	b'00010001'   ;Timer1 beállítás, előosztás 01=1:2, Timer1 bekapcsolva
		movwf	T1CON		 ;Újra be kell állítani, mivel ha írjuk a Timer1 TMR1L-t, az előosztás törlődik
		movlw	0x0B
		movwf	DIGIT1
		movwf	DIGIT2
		movwf	DIGIT3
		movwf	DIGIT4
		goto	vissza2

timer1adatki
	bcf		STATUS,RP0		;BANK0-ra váltás
	bsf		T1CON,0		;Timer1 megállítása
	bcf		INTCON,INTF ;RB0/INT jelzőbit törlése
	movfw	TMR1L
	movwf	timer1also		;Timer1 értékének kimásolása
	movfw	TMR1H
	movwf	timer1felso
	clrf	TMR1L			
	clrf	TMR1H			;Timer1 értékének törlése
	movlw	b'00000001'
	movwf	voltbejel
	movlw	b'00010001'   ;Timer1 beállítás, előosztás 01=1:2, Timer1 bekapcsolva
	movwf	T1CON		 ;Újra be kell állítani, mivel ha írjuk a Timer1 TMR1L-t, az előosztás törlődik
;	bsf		PIE1,TMR1IE
;	bcf		T1CON,0		;Timer1 indítása
	goto	vissza



Initialise	;Inicializálás
		movlw	b'00000000'	;Általános megszakítás tiltva, periféria megszakítás tiltva, TMR0 tiltva, RB0/INT megszakítás engedélyezve, PORTB többi megszakítás tiltva, TMR0 túlcs. jelzőbit 0, RB0/INT megszakítás jelzőbit 0, PORTB RB7-RB4 megszak. jelzőbit 0
		movwf	INTCON
		bsf 	STATUS,	RP0	;BANK1 kiválasztása
		movlw	b'00000001'		;TRISB Szegmens port kimenet, kivéve az RB0/INT
		movwf	SEG_TRIS
		movlw   b'00000000'		;TRISA Minden kimenet
		movwf	DIG_TRIS

		BSF  OPTION_REG,INTEDG ;Lefutó élre interruptol (1 = felfutó, 0 = lefutó él)
		;BsF  OPTION_REG,7
		bcf	STATUS,RP0	; bank0 kiválasztás
		clrf	TMR1H
		clrf	TMR1L
		movlw	b'00010001'   ;Timer1 beállítás, előosztás 01=1:2, Timer1 bekapcsolva
		movwf	T1CON
	;	bsf		PIE1,TMR1IE	;timer1 megszakítás túlcsordulás engedélyezés
		bsf		INTCON,4	;RB0 megszakítás engedélyezése
		bsf		INTCON,6	;PEIE Periféria megszakítás engedélyezve
		bsf		INTCON,7	;GIE Általános megszakítás engedélyezve
		movlw	b'11111110'
		Movwf	PORTB
		movlw	b'00000000'
		movwf	PORTA
		movlw	0x0B		;eredmények - jelet mutassanak addig, amíg nincs jel
		movwf	DIGIT1
		movwf	DIGIT2
		movwf	DIGIT3
		movwf	DIGIT4
		clrf	NEXT_DIG	 		
		Goto	Main	;Kezdődjék a "játék"

kiszamol
clrf	voltbejel	;töröljük a bejövő jel jelzőjét
clrf	timer1tulcsordult	;timer1 tulcsordulás már nem kell
goto	oszto_rutin
;innen az osztás 32 bit/16 bit 37.500.000 osztva a timer1 értékével (timer1felso és timer1also)
oszto_rutin
	BCF		STATUS,RP0	;BANK0 kiválasztva
	; OSZTANDÓ, MAJD AZ EREDMÉNY IS EBBE KELETKEZIK
	MOVLW	b'00000010'       
	MOVWF	OSZTAND_EREDMÉNY_Z  
	MOVLW	b'00111100'
    MOVWF	OSZTAND_EREDMÉNY_U
	MOVLW	b'00110100'
    MOVWF	OSZTAND_EREDMÉNY_H
	MOVLW	b'01100000'
    MOVWF	OSZTAND_EREDMÉNY_L 	; 200 000 000
	; OSZTÓ    
	MOVFW	timer1felso
	MOVWF	OSZTÓ_H	
	MOVFW	timer1also
	MOVWF	OSZTÓ_L		; 

OSZT
	MOVLW	D'32'   
	MOVWF	OSZTÓ_CIKLUS
	CLRF	MARADÉK_H   
	CLRF	MARADÉK_L

OSZTÁS 
	BCF		STATUS,C
    RLF		OSZTAND_EREDMÉNY_L,F  
    RLF		OSZTAND_EREDMÉNY_H,F
    RLF		OSZTAND_EREDMÉNY_U,F
    RLF		OSZTAND_EREDMÉNY_Z,F   	; LSB CARRY-be
    RLF		MARADÉK_L,F  		; MARADÉKBA ÁTHOZVA
    RLF		MARADÉK_H,F

    BTFSC	STATUS,C   		; VOLT ÁTVITEL?
    GOTO	KIVON_GO		; HA NEM VOLT AKKOR SIMA KIVONÁS
    MOVF	OSZTÓ_H,W  		 
    SUBWF	MARADÉK_H,W
    BTFSS	STATUS,Z		 
    GOTO	NEM_NULL   		
    MOVF	OSZTÓ_L,W  		
    SUBWF	MARADÉK_L,W
NEM_NULL
 	BTFSS	STATUS,C           
    GOTO	VAN_MÉG

KIVON_GO
	MOVF	OSZTÓ_L,W  			 
    SUBWF	MARADÉK_L,F
    BTFSS	STATUS,C	     	; VOLT ÁTVITEL?
    DECF	MARADÉK_H,F   		; -1
    MOVF	OSZTÓ_H,W
    SUBWF	MARADÉK_H,F
    BSF		OSZTAND_EREDMÉNY_L,0  		; 1-ES HELYIÉRTÉKBE 1

VAN_MÉG
	DECFSZ	OSZTÓ_CIKLUS,F
    GOTO	OSZTÁS

;idáig az osztás
goto	bcdboldigit


;innen binárisból decimális digitenként
bcdboldigit
     
  	clrf 	DIGIT1 	;eredmény-regiszterek nullázása
  	clrf 	DIGIT2 	 
  	clrf 	DIGIT3 	 
  	clrf 	DIGIT4 	 
  	clrf 	DIGIT5 	 
  	btfsc 	OSZTAND_EREDMÉNY_H,7 	;helyiértékek szétosztása
  	call 	H7 	 
  	btfsc 	OSZTAND_EREDMÉNY_H,6 	 
  	call 	H6 	 
  	btfsc 	OSZTAND_EREDMÉNY_H,5 	 
  	call 	H5 	 
  	btfsc 	OSZTAND_EREDMÉNY_H,4 	 
  	call 	H4 	 
  	btfsc 	OSZTAND_EREDMÉNY_H,3 	 
  	call 	H3 	 
  	btfsc 	OSZTAND_EREDMÉNY_H,2 	 
  	call 	H2 	 
  	btfsc 	OSZTAND_EREDMÉNY_H,1 	 
  	call 	H1 	 
  	btfsc 	OSZTAND_EREDMÉNY_H,0 	 
  	call 	H0 	 
  	btfsc 	OSZTAND_EREDMÉNY_L,7 	 
  	call 	L7 	 
  	btfsc 	OSZTAND_EREDMÉNY_L,6 	 
  	call 	L6 	 
  	btfsc 	OSZTAND_EREDMÉNY_L,5 	 
  	call 	L5 	 
  	btfsc 	OSZTAND_EREDMÉNY_L,4 	 
  	call 	L4 	 
  	movlw 	0x0F 	 
  	andwf 	OSZTAND_EREDMÉNY_L,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
	goto	Main

org 0x320
SEG_TBL
				
				ADDWF   PCL, f
	         	RETLW   b'01000000'		;0
            	RETLW   b'11111000'		;1
            	RETLW   b'00100100'		;2
            	RETLW   b'00110000'		;3
            	RETLW   b'10011000'		;4
            	RETLW   b'00010010'		;5
            	RETLW   b'00000010'		;6
            	RETLW   b'01111000'		;7
            	RETLW   b'00000000'		;8			
            	RETLW   b'00010000'		;9
				RETLW	b'11111110'		;10. sor, 4. digit üres
				RETLW	b'10111110'		;-jel




kiiras 
	    MOVLW   HIGH(UGRO_TBL)
        MOVWF   PCLATH
        INCF    NEXT_DIG,w
      	andlw   3
        movwf   NEXT_DIG
     	ADDWF   PCL,F
UGRO_TBL
        GOTO    digit1_ki
        GOTO    digit2_ki
        GOTO    digit3_ki
        GOTO    digit4_ki
	
digit1_ki
	MOVFW	DIGIT1
	;ANDLW	0x0F
	MOVWF	W_TMP2
	MOVLW	HIGH(SEG_TBL)
	MOVWF	PCLATH
	MOVF	W_TMP2,W
	CALL	SEG_TBL
	MOVWF	PORTB
	MOVLW	B'00000001'
	MOVWF	PORTA
	GOTO	minivege
	
digit2_ki
	MOVFW	DIGIT2
;	ANDLW	0x0F
	MOVWF	W_TMP2
	MOVLW	HIGH(SEG_TBL)
	MOVWF	PCLATH
	MOVF	W_TMP2,W
	CALL	SEG_TBL
	MOVWF	PORTB
	MOVLW	b'00000010'
	MOVWF	PORTA
	GOTO 	minivege

digit3_ki
	MOVFW	DIGIT3
;	ANDLW	0x0F
	MOVWF	W_TMP2
	MOVLW	HIGH(SEG_TBL)
	MOVWF	PCLATH
	MOVF	W_TMP2,W
	CALL	SEG_TBL
	MOVWF	PORTB
	MOVLW	B'00000100'
	MOVWF	PORTA
	GOTO	minivege


digit4_ki
	MOVFW	DIGIT4
	iorlw   0x00           
	btfsc   STATUS,Z
	MOVlW	0x0A
	MOVWF	W_TMP2
	MOVLW	HIGH(SEG_TBL)
	MOVWF	PCLATH
	MOVF	W_TMP2,W
	CALL	SEG_TBL
	MOVWF	PORTB
	MOVLW	b'00001000'
	MOVWF	PORTA

minivege
goto Main

            

loop	


Delay255	movlw	d'100'			;delay 255 mS
		goto	d0
Delay100	movlw	d'50'			;delay 100mS
		goto	d0
Delay50		movlw	d'75'			;delay 50mS
		goto	d0
Delay20		movlw	d'75'			;delay 20mS
		goto	d0
Delay5		movlw	0x05			;delay 5.000 ms (4 MHz clock)
d0		movwf	count1
d1		movlw	0xC7			;delay 1mS
		movwf	counta
		movlw	0x01
		movwf	countb
Delay_0
		decfsz	counta, f
		goto	$+2
		decfsz	countb, f
		goto	Delay_0

		decfsz	count1	,f
		goto	d1
		
Goto	kiiras

valami
	movlw	0x0B
	movwf	DIGIT1
	movwf	DIGIT2
	movwf	DIGIT3
	movwf	DIGIT4
	clrf	timer1tulcsordult
	clrf	voltbejel
	movlw	b'11111110'
	Movwf	PORTB
	movlw	b'00001111'
	movwf	PORTA


	




Main 	;Főprogram
	;Btfsc	timer1tulcsordult,0	;timer1 túlcsordult?
	;goto	valami
	Btfsc	voltbejel,0	;Volt-e bejövő jel
	goto	kiszamol
	goto	loop

Goto Main
End
End
