;------------ Feszültség és motorhőfok mérő --------
;Szegmensek:RC0-RC7  ----->	0:világít	1:nem világít
;Digitek: Egyes:RB0    Tizedes:RB1   ----->	0:aktív	1:inaktív
;Hőfok:RB2(an13)
;Feszültség:RB3(an9)
;Gomb:RB4
;


		#include <P16F883.INC>
		LIST		P=16f883
	__config _CONFIG1, 0x20C4
	__config _CONFIG2, 0x3EFF

;---	Változók	---

		CBLOCK	20h
		dige
		digt
		digsz
		kijelzéshosszabbító
		kijelzéshosszabbító2
		digeatmeneti
		digtatmeneti
		digszatmeneti
		digitkonvertalas
		osztando16_8_8l
		osztando16_8_8h
		osztas16_8_8eredmeny
		oszto16_8_8
		temp
		tíz
		T1
		T2
		maxhőfok
		temp2
		w_temp
		status_temp
		kijh
		ENDC

;---	Programkezdethez	---

		org		0x00
		goto	konfigok

;---	Megszakítás		---

		org		0x04
		call	push
		movlw	d'255'
		movwf	kijh
		movfw	maxhőfok
		call	BINtoBCD
		call	kijelzéshőfok
		decfsz	kijh
		goto	$-5
		banksel	INTCON
		bcf		INTCON,0	;RB interrupt flag törlés
		call	pop
		retfie

;---	Konfigok	---

konfigok
#define	egyes		PORTB,0
#define	tizedes		PORTB,1
#define	hőfok		PORTB,2
#define	feszültség	PORTB,3
#define	gomb		PORTB,4

	banksel	OPTION_REG		;PORTB felhúzóellenállások be
	bcf		OPTION_REG,7
	movlw	b'00010000'		;PORTB melyik bitje legyen felhúzva
	movwf	WPUB			;0=felhúzás ki    1=felhúzás

	banksel	TRISA
	bcf		TRISA,0		;Semmi
	bcf		TRISA,1		;Semmi
	bcf		TRISA,2		;Semmi
	bcf		TRISA,3		;Semmi
	bcf		TRISA,4		;Semmi
	bcf		TRISA,5		;Semmi
	bcf		TRISA,6		;Semmi
	bcf		TRISA,7		;Semmi

	banksel	TRISB
	bcf		TRISB,0		;Egyes digit
	bcf		TRISB,1		;Tizedes figit
	bcf		TRISB,2		;semmi
	bsf		TRISB,3		;Feszültség
	bsf		TRISB,4		;Gomb
	bsf		TRISB,5		;Hőfok
	bcf		TRISB,6		;Semmi
	bcf		TRISB,7		;Semmi

	banksel	TRISC
	bcf		TRISC,0		;E-szegmens
	bcf		TRISC,1		;F-szegmens
	bcf		TRISC,2		;G-szegmens
	bcf		TRISC,3		;.-szegmens
	bcf		TRISC,4		;D-szegmens
	bcf		TRISC,5		;C-szegmens
	bcf		TRISC,6		;A-szegmens
	bcf		TRISC,7		;B-szegmens

	banksel	ANSEL
	bcf		ANSEL,0		;digital I/O
	bcf		ANSEL,1		;digital I/O
	bcf		ANSEL,2		;digital I/O
	bcf		ANSEL,3		;digital I/O
	bcf		ANSEL,4		;digital I/O
	bcf		ANSEL,5		;digital I/O
	bcf		ANSEL,6		;digital I/O
	bcf		ANSEL,7		;digital I/O

	banksel	ANSELH
	bsf		ANSELH,0	;analog input
	bsf		ANSELH,1	;analog input
	bcf		ANSELH,2	;digital I/O
	bcf		ANSELH,3	;digital I/O
	bcf		ANSELH,4	;digital I/O
	bsf		ANSELH,5	;analog input
	bcf		ANSELH,6	;digital I/O
	bcf		ANSELH,7	;digital I/O

	banksel	INTCON		;globális megszakítások be
	movlw	B'1001000'	;RB változás megszakítások be
	movwf	INTCON
	
	goto	main	

;---	Szubrutinok		---

szegmenstábla

	ADDWF PCL,F
;           BACD.GFE    0 VILÁGÍT, 1 NEM VILÁGÍT
	RETLW B'00001100'		;0
	RETLW B'01011111'		;1
	RETLW B'00101010'		;2
	RETLW B'00001011'		;3
	RETLW B'01011001'		;4
	RETLW B'10001001'		;5
	RETLW B'10001000'		;6
	RETLW B'00011111'		;7
	RETLW B'00001000'		;8
	RETLW B'00001001'		;9
	RETLW B'00000100'		;0.
	RETLW B'01010111'		;1.
	RETLW B'00100010'		;2.
	RETLW B'00000011'		;3.
	RETLW B'01010001'		;4.
	RETLW B'10000001'		;5.
	RETLW B'10000000'		;6.
	RETLW B'00010111'		;7.
	RETLW B'00000000'		;8.
	RETLW B'00000001'		;9.

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

push	movwf	w_temp
		swapf	w_temp, f
		swapf	STATUS, w
		movwf	status_temp
		return

pop		swapf	status_temp, w
		movwf	STATUS
		swapf	w_temp, w
		return

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

osztáshattal
	banksel oszto16_8_8
	movlw	d'6'
	movwf	oszto16_8_8
	banksel	ADRESL
	movfw	ADRESL
	banksel osztando16_8_8l
	movwf	osztando16_8_8l
	banksel	ADRESH
	movfw	ADRESH
	banksel osztando16_8_8h
	movwf	osztando16_8_8h

osztas16_8_8
	movlw 0						;ha oszto 0 akkor visszatér
	subwf oszto16_8_8,0			;ha oszto 0 akkor visszatér
	btfsc STATUS,Z				;ha oszto 0 akkor visszatér
	RETURN						;ha oszto 0 akkor visszatér
	clrf osztas16_8_8eredmeny
osztas16_8_81
	incf osztas16_8_8eredmeny
	movfw oszto16_8_8
	subwf osztando16_8_8l,1
	btfsc STATUS,C
	goto  osztas16_8_81
	movlw 1
	subwf osztando16_8_8h,1
	btfss STATUS,C
	goto osztas16_8_83
	goto osztas16_8_81
osztas16_8_83
	decf osztas16_8_8eredmeny
	movfw	osztas16_8_8eredmeny
	RETURN

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

BINtoBCD

kdigsz3
		banksel digszatmeneti
		clrf	digszatmeneti
		movwf 	digitkonvertalas
kdigsz23
		movlw 	d'100'
		subwf 	digitkonvertalas
		incf 	digszatmeneti
		btfsc 	STATUS,0
		goto 	kdigsz23
		decf 	digszatmeneti
		movfw 	digszatmeneti
		movwf 	digsz
		movlw 	d'100'
		addwf 	digitkonvertalas,0
kdigt3
		clrf 	digtatmeneti
		movwf 	digitkonvertalas
kdigt23
		movlw 	d'10'
		subwf 	digitkonvertalas
		incf 	digtatmeneti
		btfsc 	STATUS,0
		goto 	kdigt23
		decf 	digtatmeneti
		movfw 	digtatmeneti
		movwf 	digt
		movlw 	d'10'
		addwf 	digitkonvertalas,1
kdige3
		clrf 	digeatmeneti
kdige23
		movlw	d'1'
		subwf 	digitkonvertalas
		incf 	digeatmeneti
		btfsc 	STATUS,0
		goto 	kdige23
		decf 	digeatmeneti
		movfw	digeatmeneti
		movwf 	dige
		return

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

kijelzésfeszültség
	banksel	PORTC
	bsf		egyes
	bsf		tizedes
	movfw	digsz
	addlw	d'10'
	call	szegmenstábla
	movwf	PORTC
	bcf		egyes
	call	delay
	bsf		egyes
	movfw	digt
	call	szegmenstábla
	movwf	PORTC
	bcf		tizedes
	call	delay
	bsf		tizedes
	movlw	d'255'
	movwf	PORTC
	return

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

kijelzéshőfok
	banksel	kijelzéshosszabbító
	movlw	d'255'
	movwf	kijelzéshosszabbító
;	movlw	d'3'
;	movwf	kijelzéshosszabbító2
	bsf		egyes
	bsf		tizedes
	banksel	PORTC
	movfw	digt
	call	szegmenstábla
	movwf	PORTC
	bcf		egyes
	call	delay
	bsf		egyes
	movfw	dige
	call	szegmenstábla
	movwf	PORTC
	bcf		tizedes
	call	delay
	bsf		tizedes
	movlw	d'255'
	movwf	PORTC
	decfsz	kijelzéshosszabbító
	goto	$-18
;	decfsz	kijelzéshosszabbító2
;	goto	$-20
	return

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

kivonás
	banksel temp
	movwf	temp
	movlw	d'21'
	subwf	temp,W
	return

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

delay:	movlw	d'3'
		movwf	T1
DEL:	movlw	d'255'
		movwf	T2	
DEL1:	nop
		nop
		nop
		nop
		nop
		nop
		nop
		nop
		decfsz	T2,f
		goto	DEL1
		decfsz	T1,f
		goto	DEL
		return

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

hőfokmérés
		
		banksel	INTCON
		bcf		INTCON,GIE	;megszakítások kikapcsolása
		banksel	ADCON0
		bsf		ADCON0,0	;AD on
		bsf		ADCON0,2	;AN13 select
		bcf		ADCON0,3
		bsf		ADCON0,4
		bsf		ADCON0,5
		bsf		ADCON0,6	;FOSC/8
		bcf		ADCON0,7
		banksel	ADCON1
		bcf		ADCON1,4	;VDD ref
		bcf		ADCON1,5	;VSS ref
		bsf		ADCON1,7	;right justified
		banksel	ADCON0
		bsf 	ADCON0,1 	;Start conversion
		btfsc 	ADCON0,1 	;Is conversion done?
		goto 	$-1 		;No, test again
		banksel	PIR1
		bcf		PIR1,6
		banksel	INTCON
		bsf		INTCON,GIE
		return

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

korrekció
		banksel	ADRESH
		btfss	ADRESH,0
		goto	xy
		movlw	d'6'
		addwf	dige,f
		movlw	d'5'
		addwf	digt,f
		movlw	d'2'
		addwf	digsz,f
		call	korrekció2
xy		btfss	ADRESH,1
		goto	ret
		movlw	d'2'
		addwf	dige,f
		movlw	d'1'
		addwf	digt,f
		movlw	d'5'
		addwf	digsz,f
		call	korrekció2
ret		return


korrekció2
		movfw	dige
		movwf	temp
		movlw	d'10'
		movwf	tíz
		movfw	dige
		subwf	tíz,w
		btfss	STATUS,C
		call	korrekció3
		return

korrekció3
		movlw	d'10'
		subwf	dige,f
		movlw	d'1'
		addwf	digt,f
		return
		
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

feszültségmérés
		
		banksel	ADCON0
		bsf		ADCON0,0	;AD on
		bsf		ADCON0,2	;AN9 select
		bcf		ADCON0,3
		bcf		ADCON0,4
		bsf		ADCON0,5
		bsf		ADCON0,6	;FOSC/8
		bcf		ADCON0,7
		banksel	ADCON1
		bcf		ADCON1,4	;VDD ref
		bcf		ADCON1,5	;VSS ref
		bsf		ADCON1,7	;right justified
		banksel	ADCON0
		bsf 	ADCON0,1 	;Start conversion
		btfsc 	ADCON0,1 	;Is conversion done?
		goto 	$-1 		;No, test again
		banksel	ADRESL
		movfw	ADRESL
		return

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

maxhofok
		movwf	temp2		;mért érték tempbe
		bsf		STATUS,C
		subwf	maxhőfok,W
		btfsc	STATUS,C
		goto	$+3
		movfw	temp2
		movwf	maxhőfok
		movfw	temp2

		btfsc	PORTB,4
		goto	$+4
		movfw	maxhőfok
		call	BINtoBCD
		call	kijelzéshőfok

		return

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;---	Főprogram	---

main
;		call	feszültségmérés
;		call	BINtoBCD
;		call	korrekció			;10 bit miatt
;		call	kijelzésfeszültség
		call	hőfokmérés
		call	osztáshattal
		call	kivonás
		call	maxhofok
		call	BINtoBCD
		call	kijelzéshőfok
		goto	main

		END
