
;temperature = temp + 10 * (cnt_perc - cnt_remn) / cnt_perc - 5 ;
	list p=16f628a
	include p16f628a.inc
	__CONFIG  _WDT_OFF & _XT_OSC & _PWRTE_ON &_LVP_OFF& _CP_OFF &_MCLRE_OFF & _BODEN_OFF
           		ERRORLEVEL -302         ;  supress message because of page change
	            ERRORLEVEL -224         ;  supress annoying message because of tris
;*********************DIFINIÁL******************************    
#DEFINE		RS	PORTA, 0		    	;RS-LCD
#DEFINE		E	PORTA, 1	    		;E-LCD
 CONSTANT DATA_PIN=4
;**********************MAKROK******************************* 
nagyobb60 MACRO
     MOVLW  D'60'
     MOVWF   A60
     BCF    STATUS,C
     MOVF   A60,W
     SUBWF  hours_M,f           ;MINUT
     BTFSS  STATUS,C
     GOTO   KISEBB_M
     GOTO   NAGYOBB_M
NAGYOBB_M
     MOVF   A60,W
     ADDWF  hours_M,f
     clrf   hours_M
     incf   hours_H
     GOTO   KÉSZ_M
KISEBB_M
     MOVF   A60,W
     ADDWF  hours_M,f        
KÉSZ_M
     MOVLW  D'24'
     MOVWF   A60
     BCF    STATUS,C
     MOVF   A60,W
     SUBWF  hours_H,f           ;HOURS
     BTFSS  STATUS,C
     GOTO   KISEBB_H
     GOTO   NAGYOBB_H 
NAGYOBB_H
     MOVF   A60,W
     ADDWF  hours_H,f
     clrf   hours_H
     GOTO   KÉSZ_H
KISEBB_H
     MOVF   A60,W
     ADDWF  hours_H,f 
KÉSZ_H
;*********************MAXIMUM**************************************       
     ENDM     
MINI      MACRO
     BCF STATUS,C
     MOVF   MIN,W     ;TEMP_READ=W      ;MIN<TEMP
     SUBWF  TEMP_READ  ,F         ;W=MIN-TEM_READ
     BTFSS  STATUS,C         ;UGRÁS HA C=1, TEMP_READ <=  MIN
     GOTO   KISEBB
     BTFSS  STATUS,Z
     GOTO   NAGYOBB
     GOTO   EGYENLÖ
KISEBB
     MOVF   MIN,W
     ADDWF  TEMP_READ,F
     MOVF   TEMP_READ,W
     MOVWF  MIN
     GOTO   KÉSZ1
NAGYOBB
     MOVF   MIN,W
     ADDWF  TEMP_READ,F
     GOTO   KÉSZ1     
EGYENLÖ
     MOVF   MIN,W
     ADDWF  TEMP_READ,F
KÉSZ1
       ENDM
;********************MINIMUM******************************************     
MAXI       MACRO  
     BCF STATUS,C
     MOVF   MAX,W     ;TEMP_READ=W      ;MIN<TEMP
     SUBWF  TEMP_READ  ,F         ;W=MIN-TEM_READ
     BTFSS  STATUS,C         ;UGRÁS HA C=1, TEMP_READ <=  MIN
     GOTO   KISEBB2
     BTFSS  STATUS,Z
     GOTO   NAGYOBB2
     GOTO   EGYENLÖ2
KISEBB2
     MOVF   MAX,W
     ADDWF  TEMP_READ,F
     GOTO   KÉSZ2
NAGYOBB2
     MOVF   MAX,W
     ADDWF  TEMP_READ,F
     MOVF   TEMP_READ,W
     MOVWF  MAX
     GOTO   KÉSZ2
EGYENLÖ2
     MOVF   MAX,W
     ADDWF  TEMP_READ,F
KÉSZ2     
        ENDM
;***********************************************************
;*********************ÁTFORDÍT********************************** 
MINUSZ      MACRO 
    MOVLW   '-'
    MOVWF   JEL
    MOVLW   D'255'
    MOVWF   X           ;-ÁTFORDÍT
    MOVF    TEMP_READ,W 
    SUBWF   X
    MOVF    X,W
    MOVWF   TEMP_READ
    ENDM
PLUSZ       MACRO
    CLRF    JEL
    MOVLW   '+'
    MOVWF   JEL
    ENDM
EStrobe		MACRO
	BSF		E   ;LCD_RE KÍÍR
	BCF		E
	ENDM 
;*******************SZORZÁS****************************		
SZORZÁS     MACRO
        MOVLW       D'100'
        MOVWF        W1
        CLRF         M1LO           ;eredmény alsó nullázás
        CLRF         M1HI           ;eredmény felső nullázás
        MOVWF        W1          ;szorzó elmentése
        MOVLW        0X8        ;8 ciklus
        MOVWF        SZ         ;számlálóba
        MOVFW        W1        ;szorzó a w-be
SZ03  
        CLRC            ;c flag törlése
        RLF          M1LO        ;eredmény *2 (16 bit)
        RLF          M1HI
        RLF          MLO         ;szorzó eltolása 1 bittel
        BNC          SZ04        ;ha a kilépő bit magas, szorzandót
        ADDWF        M1LO,F    ;hozzáadjuk az eredményhez
        BNC          SZ04        ;túlcsordulás korrigálása
        INCF         M1HI
SZ04 
        DECF         SZ ;számláló csökkentése
        BNZ          SZ03 ;ha nincs vége vissza  
        ENDM     ;eredmény m1lo és m1hi regiszterben.          
 ;--- div16_8: 16 bites szám osztása 8 bitessel ------
;    Belépéskor p az osztandó, d az osztó
;    Kilépéskor p alsó bájtja a hányados, a felső bájt pedig a maradék 
;    Az esetleges osztási túlcsordulást kilépéskor a C=1 feltétel jelzi
OSZTÁS     MACRO 
          movf    d,W          ;túlcsordulás vizsgálat
          subwf   p+1,W        ;pH >= d?
          bc      kilep        ;ha C=1, akkor osztási túlcsordulás hiba!
          movlw   8
          movwf   k            ;a ciklusszámláló 8 legyen
ciklus:   movf    d,W          ;osztó elővétele
          bcf     STATUS,C
          rlf    p   
          rlf    p+1          ;balraforgatja az osztandót
          bc      kivonas      ;ha C=1, pd > d, tehát kivonás következhet
          subwf   p+1          ;a parciális osztandó előállítása kivonással
          bc      bit_egy      ;ha C=1, pd>=d, a hányados következő bitjébe 1-et írunk!
          addwf   p+1          ;ha C=0, akkor vissza kell csinálni a kivonást és át kell
          CALL     szamlal      ;ugrani a hányados következő bitjének 1-be állításását!
kivonas  
          subwf   p+1          ;a parciális osztandó előállítása kivonással
bit_egy  
          bsf     p,0          ;a hányados soron következő bitjét '1'-be állítjuk
szamlal 
          decfsz  k            ;a ciklusok visszaszámlálása
          CALL     ciklus       ;újabb iteráció, ha k <> 0
          bcf     STATUS,C     ;nincs túlcsordulás, Carry törlése 
kilep: 
             ENDM      
;*****************FOGLALT REGISZTEREK***********************
           CBLOCK 0X20                       ;memoria kezdet
                X                            ;+_-_fordít
                hours_M                      ;minutum
                hours_H                      ;hours
                hours_S                      ;secundum
                MAX                          ;maximum hőmérséklet
                MIN                          ;minimum hőmérséklet 
                JEL                          ;előjel
                SZ                           ;SZÁMLÁLO
                MLO                          ;SZORZANDÓ
                M1HI                         ;EREDMÉNY MAGAS
                M1LO                         ;EREDMÉNY ALACSONY
                W1                           ;SZORZÓ
                k                            ;CIKLUS SZÁMLÁLÓ
                p:2                          ;OSZTANDO LOW & HIGH
                d                            ;OSZTÓ     
	            COUNT_PER_C                  ;SZÁMLÁLO /1C'FOK	
	            COUNT_REMAIN                 ;SZÁMLÁLO MARADÉK
                TEMP_READ           	     ;TEMPERATURAE
                I_BYTE                       ;IN-BIT
	            INDEX                        ;X BIT    
	            TEMP                         ;BIT_TEMP
	            O_BYTE                       ;OUT BIT
	            LOOP1                        ;DELAY 10USE
                bin                          ; binary number to be converted 
                hundreds                     ; BCD hundreds result
                tens_and_ones                ; BCD tens and ones result
                d1                           ;DELAY1
                d2                           ;DELAY2
                d3                           ;DELAY3
                temp                         ;ASCII  TEMP
                COUNT_PER_CM                 ;count_per_c
             	ENDC
	            ORG     0                    ;reset vektor   
	            clrf   hours_M
	            clrf   hours_H
	            clrf   hours_S       
 	            GOTO    MAIN
;*****************MEGSZAKÍTÁSOK********************************* 	    
 	        	ORG     4                     ;Megszakítási vektor                              
                BTFSC   PIE1,TMR1IE           ;Timer1 megszakítás?
                GOTO    TMR1INT
                RETFIE                        ;Nem
;*********************PORT-BEÁLLÍTÁS************************
init        
            MOVLW	    7                    ;comperatorok tiltása
        	MOVWF   	CMCON;               ;-
            CLRF        PORTA                ;PORTA TŐRŐL
            CLRF        PORTB                ;PORTB TŐRŐL
            MOVLW       B'00010100'          ; RA4, RA2 input, others outputs
            TRIS        PORTA
            MOVLW       B'10000000'          ; RB4, RB5 input, others outputs
            TRIS        PORTB                         
;************************Timero 1***************************
            BCF         STATUS,RP0          ;BANK;0
            MOVLW       b'00011011'         ;1:1
            MOVWF       T1CON        
            BSF         INTCON  ,GIE        ;Általános megszakítás engedélyezés
            BSF         INTCON  ,PEIE       ;MINDEN MASZK ENGEDÉLY
            BSF         STATUS,RP0          ;BANK,1
            BSF         PIE1    ,TMR1IE     ;TMR1 ENGEDÉLYEZÉSE
            BCF         STATUS,RP0          ;BANK,0
           
	        RETURN                                          
;********************LCD-beállítások*************************

TMR1INT                                     ;Kiszolgáló rutin  
            BSF         STATUS,RP0          ;BANK,1
            BSF         PIE1    ,TMR1IE     ;TMR1 ENGEDÉLYEZÉSE
            BCF         STATUS,RP0          ;BANK,0                                  
            BCF         PIR1    ,TMR1IF     ;Flag törlése  
           ;****************************                                                          
           incf        hours_S,F
           movf        hours_S,w
           sublw       d'15'
           bnz         tőbb_S
           clrf        hours_S
           incf        hours_M ,F          
tőbb_S        
           movf        hours_M,w
           sublw       d'60'
           bnz         tőbb_M    
           clrf        hours_M
           incf        hours_H  ,F                
tőbb_M
           movf         hours_H,w
           sublw        d'24'
           bnz          tőbb_H
           clrf         hours_S
           clrf         hours_M
           clrf         hours_H                     
tőbb_H
           RETFIE
;**********************INIT LCD**************************************                                                                                      
initlcd:
    call      init
    call  ms30                    ;  Wait 40 msecs before Reset
    bcf    RS                     ;  send an 8 bit instruction
    movlw  0x03                   ;  Reset Command
    call   NybbleOut              ;  Send the Nybble
    call   ms30                   ;  Wait 5 msecs before Sending Again
    EStrobe
    nop
    call  ms30
    nop                           ;  Wait 244 usecs before Sending the Second Time
    EStrobe
    nop
    call  ms30
    nop                           ;  Wait 244 usecs before Sending the Third Time
    bcf    RS                     ; send an 8 bit instruction
    movlw  0x02                   ;  Set 4 Bit Mode
    call   NybbleOut
    call      ms30
    nop
    nop  
    movlw 0x028                            ;  4 bit, 2 Line, 5x7 font
    call   SendINS
    movlw  0x010              ;  display shift off
    call   SendINS
    movlw  0x001                  ;  Clear the Display RAM
    call   SendINS                           ;  Note, Can take up to 4.1 msecs
    movlw  0x006                  ;  increment cursor
    call   SendINS     
    movlw  0x00C                  ;  display on cursor off
    call   SendINS
    RETURN       
;*********************Bineal_converter**************** 
DispDec10               ;2 KARAKTERIG
    movwf bin
    call binary_to_bcd
    movf hundreds,W
   ; call SWO_ASCII
   CLRW
   CLRF hundreds
    swapf tens_and_ones, W
    andlw H'F'
    call SWO_ASCII
    movf tens_and_ones, W
    andlw H'F'
    call SWO_ASCII
    call	us43
    clrf    hundreds
    clrf    binary_to_bcd
   	return	
DispDec  	
    movwf bin            ;3 KARAKTERIG
    call binary_to_bcd
    movf hundreds,W
    call SWO_ASCII
    swapf tens_and_ones, W
    andlw H'F'
    call SWO_ASCII
    movf tens_and_ones, W
    andlw H'F'
    call SWO_ASCII
    call	us43
    clrf    hundreds
    clrf    binary_to_bcd
   	return
;***************Change binary nbr in bin to BCD********
binary_to_bcd                     
    clrf hundreds
    swapf bin, W
    addwf bin, W
    andlw B'00001111'
    skpndc
    addlw 0x16
    skpndc
    addlw 0x06
    addlw 0x06
    skpdc
    addlw -0x06
    btfsc bin,4
    addlw 0x16 - 1 + 0x6 ;
    skpdc
    addlw -0x06
    btfsc bin,5
    addlw 0x30
    btfsc bin, 6
    addlw 0x60
    btfsc bin,7
    addlw 0x20
    addlw 0x60
    rlf hundreds, f
    btfss hundreds, 0
    addlw -0x60
    movwf tens_and_ones
    btfsc bin,7
    incf hundreds, f
    return	
;********************4-BITRE FORDÍT	KARAKTER****************
SWO_ASCII
	addlw '0'
SendCHAR
	MOVWF	temp
	SWAPF	temp,W
	BSF		RS
	CALL	NybbleOut
	movf   	temp,W
	BSF		RS
	CALL	NybbleOut
	CALL    us43
	RETURN
;********************4-BITRE FORDÍT	INSTRUKT*****************
SendINS
	movwf	temp
	SWAPF	temp,W
	BCF		RS
	CALL	NybbleOut
	MOVF	temp,W
	BCF		RS
	CALL	NybbleOut
    CALL    ms30
	RETURN
;***************************LCD_RE KIÍRAT*********************
NybbleOut
	MOVWF	PORTB
	EStrobe
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	RETURN	
;**************************DELAY	RUTINOK*******************	
DELAY				;5000000 cycles
	movlw	0x2C
	movwf	d1
D9	movlw	0xE7
	movwf	d2
D8	movlw	0x0B
	movwf	d3
D7	nop
	nop
	nop
	decfsz	d3, f
	goto	D7
	decfsz	d2, f
	goto	D8
	decfsz	d1, f
	GOTO	D9
	NOP
	NOP
	Return
;*********************************************	
ms30			;29993 cycles
	movlw	0x6E
	movwf	d1
ms3	movlw	0x18
	movwf	d2
Delay_02
	decfsz	d2, f
	goto	Delay_02
	decfsz	d1, f
	goto	ms3
    nop
	nop
	nop		;3 cycles
	nop
    nop
    nop
	nop		;4 cycles (including call)
	return
;*********************************************	
;*********************************************	
us43			;37 cycles
	movlw	0x0C
	movwf	d1
Delay_01
	decfsz	d1, f
	goto	Delay_01
	nop
	nop		;2 cycles
    nop
	nop
	nop
	nop		;4 cycles (including call)
	return 
;*********************************************	  
DELAY_10USEC:  ;LOOP1 X 10USSEC
     MOVWF LOOP1
DELAY_10USEC_1:
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	DECFSZ LOOP1, F
	GOTO DELAY_10USEC_1
	RETURN     
;*************************Beállítás vége***********************
MAIN: 
;********************   bejelentkező szőveg  ****************** 
    call initlcd 
    movlw   0x81            ;POZITCIO
    call    SendINS 
    MOVLW   'B'
    CALL    SendCHAR
    MOVLW   'a'
    CALL    SendCHAR
    MOVLW   'l'
    CALL    SendCHAR
    MOVLW   'c'
    CALL    SendCHAR
    MOVLW   's'
    CALL    SendCHAR
    MOVLW   'i'
    CALL    SendCHAR
    MOVLW   'k'
    CALL    SendCHAR
    MOVLW   ' '
    CALL    SendCHAR
    movlw   'V'
    call    SendCHAR
    movlw   'i'
    call    SendCHAR
    movlw   'k'
    call    SendCHAR
    movlw   't'
    call    SendCHAR
    movlw   'o'
    call    SendCHAR
    movlw   'r'
    call    SendCHAR
    movlw   0xc2            ;POZITCIO
    call    SendINS
    MOVLW   'T'
    CALL    SendCHAR
    MOVLW   'h'
    CALL    SendCHAR
    MOVLW   'e'
    CALL    SendCHAR
    MOVLW   'r'
    CALL    SendCHAR
    MOVLW   'm'
    CALL    SendCHAR
    MOVLW   'o'
    CALL    SendCHAR
    movlw   '_'
    call    SendCHAR
    movlw   'm'
    call    SendCHAR
    movlw   'e'
    call    SendCHAR
    movlw   't'
    call    SendCHAR
    movlw   'e'
    call    SendCHAR
    movlw   'r'
    call    SendCHAR
    CALL    DELAY
    CALL    DELAY
    CALL    DELAY
    CALL    DELAY
    MOVLW   0x001        ;Clear the Display RAM
    CALL    SendINS 
;*** ********************MAIN1**********************************************             
MAIN1    
         call    RESETDS              
    MOVLW   0XAA                     ;READ TEMPERATURE   TEMP_READ*********************
    MOVWF   O_BYTE
    CALL    OUT_BYTE   
    CALL   IN_BYTE		
    MOVWF  TEMP_READ     
        CALL    RESETDS         
    MOVLW   0XA0        ;READ COUNTER       COUNT_REMAIN********************
    MOVWF   O_BYTE
    CALL    OUT_BYTE
    CALL   IN_BYTE		
    MOVWF  COUNT_REMAIN
        CALL    RESETDS       
    MOVLW   0X41        ;LOAD COUNTER
    MOVWF   O_BYTE
    CALL    OUT_BYTE
        CALL    RESETDS       
    MOVLW   0XA0        ;READ COUNTER       COUNT_PER_C ********************
    MOVWF   O_BYTE
    CALL    OUT_BYTE 
    CALL    IN_BYTE
    MOVWF   COUNT_PER_C    
        CALL    RESETDS
    MOVLW   0XEE        ;START CONVERT
    MOVWF   O_BYTE
    CALL    OUT_BYTE       
        call    RESETDS       
    MOVLW   0X22
    MOVWF   O_BYTE
    CALL    OUT_BYTE    ;STOP CONVERT       
;**********************KIOLVASVA*********************************   
;*******************TIZEDES KONVERZIO****************************
    MOVF    COUNT_PER_C,W
    MOVWF   COUNT_PER_CM
    MOVF    COUNT_REMAIN,W      ;REMAIN A MARADÉK
    SUBWF   COUNT_PER_C      
    MOVF    COUNT_REMAIN,W
    MOVWF   MLO
    SZORZÁS
    MOVF    M1HI,W
    MOVWF   p+1
    MOVF    M1LO,W
    MOVWF   p
    MOVF    COUNT_PER_CM,W
    MOVWF   d
    OSZTÁS
    BTFSS   TEMP_READ,  7
    GOTO    PLUSZ1
    GOTO    MINUSZ1
MINUSZ1
      MINUSZ
     GOTO   TOVÁBB
PLUSZ1
       PLUSZ
     GOTO   TOVÁBB
TOVÁBB
    MINI
    MAXI    
;**********************KIJELZÉS**********************************
    MOVLW   0X82            ;POZITCIO
    CALL    SendINS
    MOVLW   'T'
    CALL    SendCHAR
    MOVLW   '='
    CALL    SendCHAR
    MOVF    JEL,W        ;PLUSZ   
    CALL    SendCHAR
    movf    TEMP_READ,w  ;EGÉSZ HŐMÉRSÉKLET
    CALL    DispDec
    MOVLW   ','          ;TIZEDES VESSZŐ
    CALL    SendCHAR
    MOVLW   5
    SUBLW   p
    MOVF   p,W
    CALL    DispDec10
    MOVLW   B'11011111'
    CALL    SendCHAR
    MOVLW   'C'
    CALL    SendCHAR
    CALL    ÓRA
    CALL    DELAY
    GOTO    MAIN1
;*************************MIN_MAX****************************************    
max_min
    movlw   0XC0            ;POZITCIO
    call    SendINS
    movlw   'M'
    call    SendCHAR
    MOVLW   'a'
    CALL    SendCHAR
    MOVLW   'x'
    CALL    SendCHAR
    MOVLW   ':'
    CALL    SendCHAR
    MOVF    MAX,w  ;max
    CALL    DispDec     
    MOVLW   0XC9            ;POZÍTCIO
    CALL    SendINS 
    MOVLW   'M'
    CALL    SendCHAR
    MOVLW   'i'
    CALL    SendCHAR
    MOVLW   'n'
    CALL    SendCHAR
    MOVLW   ':'
    CALL    SendCHAR
    MOVF    MIN,w     ;MIN
    CALL    DispDec
    RETURN
;***********************ÓRA*******************************
ÓRA
    MOVLW   0XC6
    CALL    SendINS
    MOVF    hours_H     ,w      ;ÓRA
    CALL    DispDec10
    MOVLW   ':'
    CALL    SendCHAR
    MOVF    hours_M     ,W      ;PERC
    CALL    DispDec10
    RETURN           
;******************idő beálítás***************************
RESETDS:
     CALL   PIN_HI
     CALL   PIN_LO
     MOVLW     50              ; 500 us delay
     CALL DELAY_10USEC    
     CALL PIN_HI           
     MOVLW     50                 ; 500 usec delay
     CALL DELAY_10USEC   
     RETURN
;***********************WAIT****************************
WAIT:        
     CALL   IN_BYTE
     MOVLW  0FFH
     SUBWF  I_BYTE, W
     BTFSS  STATUS, Z
     GOTO   WAIT
     RETURN  
;**********************IN_BYTE***********************************
IN_BYTE:                   ; returns byte in W
     MOVLW  8
     MOVWF  INDEX
     CLRF   I_BYTE
IN_BYTE_1:
     CALL PIN_LO         ; momentary low on DATA_PIN
     NOP
     CALL PIN_HI
     nop
     nop
     nop
     MOVF   PORTA, W  	    ; 7 usecs later, fetch from DATA_PIN
     MOVWF  TEMP                                                        
     BTFSS  TEMP, 4
     BCF    STATUS, C       ; its a zero
     BTFSC  TEMP, 4
     BSF    STATUS, C       ; its a one
     RRF    I_BYTE, F   
     MOVLW  6              ; now delay 60 usecs
     CALL   DELAY_10USEC
     DECFSZ INDEX, F
     GOTO   IN_BYTE_1
     MOVFW  I_BYTE         ; return the result in W
     RETURN
;***********************OUT_BYTE*****************************     
OUT_BYTE:
     MOVLW  8
     MOVWF  INDEX
OUT_BYTE_1:
     RRF    O_BYTE, F
     BTFSS  STATUS, C
     GOTO   OUT_0
     GOTO   OUT_1     
OUT_BYTE_2:
     DECFSZ    INDEX, F
     GOTO   OUT_BYTE_1
     RETURN
OUT_0:
     CALL   PIN_LO         	; bring DATA_PIN low
     MOVLW  6 		       	; for 60 usecs
     CALL   DELAY_10USEC
     CALL   PIN_HI
     GOTO   OUT_BYTE_2
OUT_1:
     CALL PIN_LO         	; momentary low
     CALL   PIN_HI
     MOVLW 6
     CALL DELAY_10USEC
     GOTO   OUT_BYTE_2
;*************************************************************       
PIN_HI:
     BSF  STATUS, RP0
     BSF  TRISA, DATA_PIN       ; high impedance
     BCF  STATUS, RP0  
     RETURN
PIN_LO:
     BCF  PORTA, DATA_PIN
     BSF  STATUS, RP0
     BCF  TRISA, DATA_PIN       ; low impedance zero
     BCF  STATUS, RP0        
     RETURN
;*****************************************************
      end