;******************************************************************************
;                                                                             *
;    Filename:      FNDTap                                                    *
;    Date:          2011.05.13.                                               *
;    File Version:  1.00                                                      *
;                                                                             *
;    Author:        Karlik Tamás                                              *
;    Company:                                                                 *
;                                                                             * 
;******************************************************************************
;                                                                             *
;    Files Required: P18F25K80.INC                                             *
;                                                                             *
;******************************************************************************

	LIST P=18F25K80		;directive to define processor
	#include <P18F25K80.INC>	;processor specific variable definitions

;******************************************************************************
;Configuration bits
;Microchip has changed the format for defining the configuration bits, please 
;see the .inc file for futher details on notation.  Below are a few examples.



;   Oscillator Selection:
;    CONFIG	FOSC=_INTIO2             ;Belső

;******************************************************************************
;Variable definitions
; These variables are only needed if low priority interrupts are used. 
; More variables may be needed to store other special function registers used
; in the interrupt routines.

		CBLOCK	

Digit:7					;kiírandószám 7 digiten
FeszAram
FeszKapcs

; 16 bites átalakítás BCDre
temp
NumH
NumL
TenK
Thou
Hund
Tens
Ones

count1					;számláló
Timer1
Timer2					;varakozo hurkok regiszterei

		ENDC


;******************************************************************************
;Reset vector
; This code will start executing when a reset occurs.

	ORG	0x0000

	clrf	PORTA
	clrf	PORTB
	clrf	PORTC
	clrf	PORTE
	movlw	b'11111111'	;felhúzóellenállások bekapcsolva
	movwf	WPUB
	movlw	b'00000000'	;kimenet
	movwf	TRISC
	movlw	b'00000000' ;kimenet
	movwf	TRISB		;portb iranyok beallitasa
	movlw	b'11111111'	;bemenet
	movwf	TRISA		;porta iranyok beallitasa
	movlw	b'00000101'
	movwf	ANCON0		;porta 0, 2 analog
	clrf	ANCON1
	movlw	b'00110000' ;
	movwf	ADCON1		;belső 4 volt - Vss referencia
	movlw	b'10110101' ;
	movwf	ADCON2		;Fosc/16, 16TAD
	movlw	B'00000000'	;PORTB alapállapot
	movwf	PORTB

	rcall	Kesl

	clrf	Digit		;kijelzendő szám törlés
	clrf	Digit+1
	clrf	Digit+2
	clrf	Digit+3
	clrf	Digit+4
	clrf	Digit+5
	clrf	Digit+6
	clrf	FeszAram
	clrf	FeszKapcs
	bra		MAIN

;------------------------------------------------------------------------------
; BCD 7 szegmens dekódolás
;
LedTable
        addwf   PCL, F          ;add to PC low
;Szegmensek       cfbadeDg
        retlw   B'11111100'     ;led drive for 0
        retlw   B'10100000'     ;led drive for 1
        retlw   B'00111101'     ;led drive for 2
        retlw   B'10111001'     ;led drive for 3
        retlw   B'11100001'     ;led drive for 4
        retlw   B'11011001'     ;led drive for 5
        retlw   B'11001101'     ;led drive for 6
        retlw   B'10110000'     ;led drive for 7
        retlw   B'11111101'     ;led drive for 8
        retlw   B'11110001'     ;led drive for 9
        retlw   B'00000000'     ;led drive for A
        retlw   B'00010000'     ;led drive for felülvonás
        retlw   B'00000001'     ;led drive for közép
        retlw   B'00010000'     ;led drive for alulvonás
        retlw   B'01011101'     ;led drive for E
        retlw   B'01110101'     ;led drive for F

;-------------------------------------------------------------------------------

MAIN
	movlw	.6			;minden 6-dik ciklusban mér
	movwf	count1
	
MAIN2
	bcf		PORTB,2		;digit kikapcsolás
	rlcf	Digit,W		;kiirandó szám betölt
	rcall	LedTable	;BCD 7 szegmens átalakítás
	movwf	PORTC		;kiírás
	bsf		PORTB,6		;megfelelő digitre kiir
  
	rcall	Kesl2

	bcf		PORTB,6		;ua mint előbb 2. digit
	rlcf 	Digit+1,W
	rcall	LedTable
	movwf	PORTC
	bsf		PORTC,1	
	bsf		PORTB,5
  
	rcall	Kesl2

	bcf		PORTB,5		;ua mint előbb 3. digit
	rlcf 	Digit+2,W
	rcall	LedTable
	movwf	PORTC
	bsf		PORTB,4
  
	rcall	Kesl2

	bcf		PORTB,4		;ua mint előbb 4. digit
	rlcf	Digit+3,W
	rcall	LedTable
	movwf	PORTC
	bsf		PORTB,3
  
	rcall	Kesl2

	bcf		PORTB,3		;ua mint előbb 5. digit
	rlcf	Digit+4,W
	rcall	LedTable
	movwf	PORTC
	bsf		PORTC,1	
	bsf		PORTB,0
  
	rcall	Kesl2

	bcf		PORTB,0		;ua mint előbb 6. digit
	rlcf 	Digit+5,W
	rcall	LedTable
	movwf	PORTC
	bsf		PORTB,1
  
	rcall	Kesl2

	bcf		PORTB,1		;ua mint előbb 7. digit
	rlcf 	Digit+6,W
	rcall	LedTable
	movwf	PORTC
	bsf		PORTB,2

	rcall	Kesl2

	decfsz	count1
	goto	MAIN2		;ezt csinálja amíg count1 0 nem lesz

	btfsc	FeszAram,0
	bra		Aram
	rcall 	ADINRA0		;feszmérés RA0-ra van kötve

	clrf	FeszKapcs	;hova kell kapcsolni 1 felső 0 alsó
	movf	NumH,w
	sublw	0x05
	btfsc	STATUS,N
	bsf		FeszKapcs,7

	btfss	FeszKapcs,7
	bcf		PORTB,7	
	btfsc	FeszKapcs,7
	bsf		PORTB,7	

	rcall	bin16_bcd		;a 16 bites hexa számot BCD+re alakítjuk

	movf	Thou,W			;bekerülnek az első helyre
	movwf	Digit
	movf	Hund,W			;bekerülnek az első helyre
	movwf	Digit+1
	movf	Tens,W			;bekerülnek az első helyre
	movwf	Digit+2
	movf	Ones,W			;bekerülnek az első helyre
	movwf	Digit+3
	
	incf	FeszAram
	goto	MAIN

Aram
	rcall	ADINRA2		;akkor az áram az RA2-re van kötve

	rcall	bin16_bcd		;a 16 bites hexa számot BCD+re alakítjuk

	movf	Thou,W			;bekerülnek az első helyre
	movwf	Digit+4
	movf	Hund,W			;bekerülnek az első helyre
	movwf	Digit+5
	movf	Tens,W			;bekerülnek az első helyre
	movwf	Digit+6

	clrf	FeszAram,0
	goto	MAIN		;itt pörög a végtelenségig


;
;------------------------------------------------------------------------------
;******************************* SZUBRUTINOK **********************************
;------------------------------------------------------------------------------

Kesl100
            movlw   .165                         ; 100us késleltetés
            movwf   Timer1
Kesl1
            decfsz  Timer1,1
            bra     Kesl1
            return
;-------------------------------------------------------------------------------
Kesl2
            clrf    Timer1                      ; 1ms késleltetés
            movlw   .8
            movwf   Timer2
Kesl21
            rcall   Kesl100
            decfsz  Timer2,1
            bra     Kesl21
            return
;-------------------------------------------------------------------------------
Kesl
            rcall   Kesl2
            rcall   Kesl2
            rcall   Kesl2
            rcall   Kesl2
            rcall   Kesl2
            return                              ; 5x2ms késleltetés
;-------------------------------------------------------------------------------

;-----------------------------------------------------------------------------
; A/D átalakítás Volt
;
ADINRA0
	movlw	0x01		;AD beállítás RA0
	movwf   ADCON0 
	rcall	Kesl100		;várás 100uS
	bsf		ADCON0,GO	;konverzió indul
A0TOV
	btfsc	ADCON0,GO	;ha végzett tovább
	bra		A0TOV
	
	movf	ADRESH,W	
	movwf	NumH		;eredmény felső bájt
	movf	ADRESL,W	
	movwf	NumL		;eredmény alsó bájt
	
	return

;-----------------------------------------------------------------------------
; A/D átalakítás Amper
;
ADINRA2
	movlw	0x09		;mint előbb de RA2
	movwf	ADCON0 
	rcall	Kesl100
	bsf		ADCON0,GO 
A1TOV
	btfsc	ADCON0,GO
	bra		A1TOV
	
	movf	ADRESH,W	
	movwf	NumH		;eredmény felső bájt
	movf	ADRESL,W	
	movwf	NumL		;eredmény alsó bájt

	return

;---------------- Binary (16-bit) to BCD -----------------------
;               xxx = highest possible result
bin16_bcd
                               ; Takes number in NumH:NumL
                                ; Returns decimal in
                                ; TenK:Thou:Hund:Tens:Ones
        swapf   NumH,W
        andlw   0x0F
        addlw   0xF0
        movwf   Thou
        addwf   Thou,F
        addlw   0xE2
        movwf   Hund
        addlw   0x32
        movwf   Ones

        movf    NumH,W
        andlw   0x0F
        addwf   Hund,F
        addwf   Hund,F
        addwf   Ones,F
        addlw   0xE9
        movwf   Tens
        addwf   Tens,F
        addwf   Tens,F

        swapf   NumL,W
        andlw   0x0F
        addwf   Tens,F
        addwf   Ones,F

        rlcf     Tens,F
        rlcf     Ones,F
        comf    Ones,F
        rlcf     Ones,F

        movf    NumL,W
        andlw   0x0F
        addwf   Ones,F
        rlcf     Thou,F

        movlw   0x07
        movwf   TenK

        movlw   0x0A                             ; Ten
Lb1:
        decf    Tens,F
        addwf   Ones,F
        btfss   STATUS,C
         bra   Lb1
Lb2:
        decf    Hund,F
        addwf   Tens,F
        btfss   STATUS,C
         bra   Lb2
Lb3:
        decf    Thou,F
        addwf   Hund,F
        btfss   STATUS,C
         bra   Lb3
Lb4:
        decf    TenK,F
        addwf   Thou,F
        btfss   STATUS,C
        bra   Lb4

        retlw   0

;******************************************************************************
;End of program

		END
