
	LIST P=16F628A, R=DEC
	INCLUDE<P16F628A.INC>

	__CONFIG _PWRTE_ON & _WDT_OFF & _MCLRE_OFF & _BODEN_OFF & _LVP_OFF & _XT_OSC
        

PC				equ	02h
TMP0    equ      0x23            
TMP1    equ      0x24
cislo   equ     0x25
DSDL1   equ     0x26            ; komunikace s DS18B20
DSREG1  equ     0x27
DSREG2  equ     0x28
TEMPL   equ     0x29
TEMPH   equ     0x2A
TEMPNM  equ     0x2B            ; ???,  °C
TEMPDP  equ     0x2C		;    ,? °C
TMP2	equ	0x2F
T0		equ	0x30
T1		equ	0x31
T2		equ	0x32
desatiny	equ	0x33
jednotky	equ	0x34
desiatky	equ	0x35
stovky		equ	0x36
W_save		equ	37h	; zaloha pri preruseni
Sta_sav		equ	38h	; zaloha pri preruseni
PCL_sav		equ	39h	; zaloha pri preruseni
FSR_sav		equ	3Ah	; zaloha pri preruseni
T4			equ	3Bh
hodnota		equ	.255
D550US  equ     200             ; 550us
D90US   equ     25              ; 90us
D1US    equ     1               ; 3us



#DEFINE	A1		PORTA,0		;spoločná anóda
#DEFINE	A2		PORTA,1		;   -//-
#DEFINE	A3		PORTA,2		;	-//-
#DEFINE	A4		PORTA,3		;	-//-
#define DSPIN   PORTB,0		; DS18B20 pin
;piny 7/1 na porte B sú pripojené na katódy segmentov displeja





; ========================================================================
; Start procesoru
;
        org     0x00
        goto    INIT
;----------------------------------------------------------------------


	org	04h		; ulozeni hlavnich registru
	movwf	W_save		; W
	movf	STATUS,W
	clrf	STATUS		; Banka 0
	movwf	Sta_sav		; STATUS
	movf	PCLATH,w
	movwf	PCL_sav		; PCLATH
	movf	FSR,w
	movwf	FSR_sav		; FSR
	GOTO	PRERUS
;--------------------------------------------

	
INIT	MOVLW	B'00000111'	; typ komparatoru (off)
		MOVWF	CMCON
		BSF		STATUS,RP0	; nastaveni In / Out
		MOVLW	B'00000000'
		MOVWF	TRISA
		MOVLW	B'00000000'
		MOVWF	TRISB
        MOVLW	B'00000011';delička 32;B'00000011'
		MOVWF	OPTION_REG
		BCF		STATUS,RP0
		MOVLW	B'10100000'	; povoleni preruseni pouze od TMR0
		MOVWF	INTCON
		MOVLW	hodnota
		MOVWF	cislo
        MOVLW	.123
		MOVWF	TEMPNM
   		MOVLW	.4
		MOVWF	TEMPDP
 	
START	movf	desatiny,0;načítaj obsah reg.desatiny do WREG
		call	zobraz
		bsf		A1
		call	wait
		bcf		A1
		
		movf	jednotky,0;načítaj obsah reg.jednotky do WREG
		call	zobraz
		bsf		A2
		call	wait
		bcf		A2
		
		movf	desiatky,0;načítaj obsah reg.desiatky do WREG
		call	zobraz
		bsf		A3
		call	wait
		bcf		A3
		
		movf	stovky,0;načítaj obsah reg.stovky do WREG
		sublw	.2			; W = CONST-A
		btfss	STATUS, Z		; Check if zero
		goto	zob100			; Z=0, A!=0, false cond'n
		goto 	minus
	
;---------------------------------------------------------------

PREPOČET	movlw	hodnota
			movwf	cislo
			CALL    DSREAD          ; vyčtení teploty z cidla
           	CALL    TMPCNV          ; prevod binarni teploty na hodnotu
		
			MOVFW	TEMPNM
			CALL	HexDec
			MOVF	T0,0
			MOVWF	jednotky
			MOVF	T1,0
			MOVWF	desiatky
			MOVF	T2,0
			MOVWF	stovky
			MOVFW	TEMPDP
			CALL	HexDec
			MOVF	T0,0
			MOVWF	desatiny
			CALL    DSSTART
       		goto PRERKON
;-------------------------------------------------------

wait    nop
		MOVLW .5  
        MOVWF TMP1
        MOVLW .5 
        MOVWF TMP0
        DECFSZ TMP0,F
        GOTO $-1
        DECFSZ TMP1,F
        GOTO $-3
		RETURN




;**************************ZOBRAZOVANIE***********************************




koduj	addwf	PC,f		;preskoc W instrukciu
		retlw	B'10000000'	;vystupy pre nulu
		retlw	B'11110010'	;vystupy pre jednicku
		retlw	B'01001000'	;vystupy pre dvojku
		retlw	B'01100000'	;vystupy pre trojku
		retlw	B'00110010'	;vystupy pre stvorku
		retlw	B'00100100'	;vystupy pre petku
		retlw	B'00000100'	;vystupy pre sestku
		retlw	B'11110000'	;vystupy pre sedmicku
		retlw	B'00000000'	;vystupy pre osmicku
		retlw	B'00110000'	;vystupy pre deviatku
		retlw	B'11111111'	;zhasnuty displej
		retlw	B'11111111'	;zhasnuty displej
		retlw	B'11111111'	;zhasnuty displej
		retlw	B'11111111'	;zhasnuty displej
		retlw	B'11111111'	;zhasnuty displej
		retlw	B'11111111'	;zhasnuty displej
;*************************************************************
zobraz	andlw	0fh		;zamaskuj horne styri bity zaciatok zobrazovania
		call	koduj
		movwf	PORTB		;nastav vystupy portu B
		return

;************************************************************************** 
; Prevod Hex 8bit na DEC T3,T2,T1 
;************************************************************************** 

HexDec    
	   ;banksel   TMP0    
	   movwf   TMP0 
	   clrf   TMP1 
	   ;banksel   T1 
	   CLRF   T1 
	   CLRF   T2 
Rad100 
	   ;banksel   TMP0    
	   MOVLW   .100 
	   SUBWF   TMP0,W      ;TMP0-100 
	   MOVWF   TMP2      ;TMP2 
	   BTFSC   STATUS,C   ;zaporne? 
	   GOTO   Uloz      ;NE 
	   MOVLW   .1      ; 
	   SUBWF   TMP1,W      ;TMP1-1 
	   BTFSS   STATUS,C   ;kladne? 
	   GOTO   Rad10      ;NE 
	   MOVWF   TMP1      ; 
	   MOVF   TMP2,W       
Uloz    
	   banksel   TMP0    
	   MOVWF   TMP0 
	   banksel   T2    
	   INCF   T2,F      ;+1 
	   GOTO   Rad100 
Rad10 
	   banksel   TMP0    
	   MOVLW   .10 
	   SUBWF   TMP0,W      ;TMP0-10 
	   BTFSS   STATUS,C   ;kladne? 
	   GOTO   End10      ;NE 
	   MOVWF   TMP0 
	   banksel   T1    
	   INCF   T1,F      ;+1 
	   GOTO   Rad10 
End10 
	   banksel   TMP0    
	   MOVF   TMP0,W 
	   banksel   T0    
	   MOVWF   T0      ;T0,1,2=vysledna hodnota 
	   banksel   0
	   return
  
 


zob100		movf	stovky,0;načítaj obsah reg.stovky do WREG
			call	zobraz
			bsf		A4
			call	wait
			bcf		A4
			goto	START
minus		CLRF	PORTB
			movlw	B'01111110'
			movwf		PORTB
			bsf		A4
			call	wait
			bcf		A4
			goto 	START
;____________________________________________________________________________		
       ;----------------------------------------------------------------------


PRERUS	BTFSC	INTCON,2;test či bolo prerušenie od TMR0
		GOTO	PRER0		; od TMR0
		GOTO	PRERKON		; nezname = nic-vrati sa naspäť vykon.prgm.

PRER0	BCF	INTCON,2	; smazat priznak a vykonávať prerušenie.
		DECF	cislo,1
		BTFSC	STATUS,Z;ak je nula skáč
		goto	PREPOČET	;odtialto sa skáče na obsluhu prerušenia.
		GOTO	PRERKON;choď na ukončenie prerušenia


PRERKON	MOVLW	B'10100000'	; povoleni zpet pozadovanych preruseni
	MOVWF	INTCON
	clrf	STATUS		; Banka 0	obnoveni ulozenych registru
	movf	FSR_sav,w	; FSR
	movwf	FSR
	movf	PCL_sav,w	; PCLATH
	movwf	PCLATH
	movf	Sta_sav,w	; Status
	movwf	STATUS
	swapf	W_save,f	; W
	swapf	W_save,w
	retfie

;--------------------------------------------
;---------------------

DSREAD  CLRF    TEMPL           ; vycteni teploty z cidla
        CLRF    TEMPH
        CALL    DSPINL
        MOVLW   D550US          ; reset pulse
        CALL    DSDEL
        CALL    DSPINH
        MOVLW   D90US
        CALL    DSDEL
        BTFSC   DSPIN
        RETURN                  ; bez odpovedi - konec
        MOVLW   D550US
        CALL    DSDEL
        MOVLW   0xCC
        CALL    DSSEND
        MOVLW   0xBE
        CALL    DSSEND
        CALL    DSREC
        MOVWF   TEMPL
        CALL    DSREC
        MOVWF   TEMPH
        RETURN
        
;---------------------
        
DSPINL  BSF     STATUS,RP0      ; pin DSPIN do L
        BCF     DSPIN
        BCF     STATUS,RP0
        BCF     DSPIN
        RETURN

;---------------------
        
DSPINH  BSF     STATUS,RP0      ; pin DSPIN do H (pull-up)
        BSF     DSPIN
        BCF     STATUS,RP0
        RETURN
        
;---------------------
        
DSDEL   MOVWF   DSDL1		; prodleva pro komunikaci
        DECFSZ  DSDL1,1
        GOTO    $-1
        RETURN

;---------------------

DSSEND  MOVWF   DSREG1          ; odeslani jednoho bytu z W do DS18B20
        MOVLW   8
        MOVWF   DSREG2
DSSND1  CALL    DSPINL
        BTFSC   DSREG1,0
        CALL    DSPINH
        MOVLW   D90US
        CALL    DSDEL
        CALL    DSPINH
        RRF     DSREG1,1
        DECFSZ  DSREG2,1
        GOTO    DSSND1
        MOVLW   D90US
        CALL    DSDEL
        RETURN
        
;---------------------
        
DSREC   CLRF    DSREG1          ; vycteni jednoho bytu z DS18B20 do W
        MOVLW   8
        MOVWF   DSREG2
DSREC1  RRF     DSREG1,1
        CALL    DSPINL
        CALL    DSPINH
        MOVLW   D1US
        CALL    DSDEL
        BCF     DSREG1,7
        BTFSC   DSPIN
        BSF     DSREG1,7
        MOVLW   D90US
        CALL    DSDEL
        DECFSZ  DSREG2,1
        GOTO    DSREC1
        MOVLW   D90US
        CALL    DSDEL
        MOVF    DSREG1,0
        RETURN


        
; ========================================================================
 ; Prevod binarni hodnoty ziskane z cidla na velikost teploty
;
TMPCNV  CLRF    TEMPNM
        CLRF    TEMPDP
        BTFSS   TEMPH,7
        GOTO    $+5
        COMF    TEMPH,1
        COMF    TEMPL,1
        MOVLW   200
        MOVWF   TEMPNM
        
        MOVF    TEMPDP,0
        BTFSC   TEMPL,1
        ADDLW   1
        BTFSC   TEMPL,2
        ADDLW   2
        BTFSC   TEMPL,3
        ADDLW   5
        MOVWF   TEMPDP
        
        MOVF    TEMPNM,0
        BTFSC   TEMPL,4
        ADDLW   1
        BTFSC   TEMPL,5
        ADDLW   2
        BTFSC   TEMPL,6
        ADDLW   4
        BTFSC   TEMPL,7
        ADDLW   8

        BTFSC   TEMPH,0
        ADDLW   16
        BTFSC   TEMPH,1
        ADDLW   32
        BTFSC   TEMPH,2
        ADDLW   64
        MOVWF   TEMPNM
      
        RETURN
        
        

; ========================================================================


DSSTART CALL    DSPINL          ; start prevodu teploty
        MOVLW   D550US          ; reset pulse
        CALL    DSDEL
        CALL    DSPINH
        MOVLW   D90US
        CALL    DSDEL
        BTFSC   DSPIN
        RETURN                  ; bez odpovedi - konec
        MOVLW   D550US
        CALL    DSDEL
        MOVLW   0xCC
        CALL    DSSEND
        MOVLW   0x44
        CALL    DSSEND
        RETURN














 END



