Hi WP

I played a bit with the code these two days ...

that gives the following ...

Code:
'*****************************************************************************
'*****************************************************************************
' Thermostat F84 test sur EasyPic5
' Thermostat 16F877a + DS 18B20
'*****************************************************************************
'*****************************************************************************

'*****************************************************************************
'*****************************************************************************

@ __config _HS_OSC & _WDT_ON & _PWRTE_ON & _BODEN_ON & _LVP_OFF & _CP_OFF 

'*****************************************************************************
'*                  LCD Defines for EasyPic5                                 *
'*****************************************************************************
  
    DEFINE LCD_DREG PORTB               ' I/O port where LCD is connected
    DEFINE LCD_DBIT 0
    DEFINE LCD_RSREG PORTB
    DEFINE LCD_RSBIT 4                  ' Register select pin
    DEFINE LCD_EREG PORTB
    DEFINE LCD_EBIT 5                   ' Enable pin
    DEFINE LCD_BITS 4                   ' 4-bit data bus
    DEFINE LCD_LINES 2                  ' LCD has 2 character lines
 
    DEFINE OSC 8
    DEFINE BUTTON_PAUSE 100
    
'Define	    LCD_DREG	PORTD
'Define	    LCD_DBIT	4
'Define	    LCD_RSREG	PORTE
'Define	    LCD_RSBIT	0
'Define	    LCD_EREG	PORTE
'Define	    LCD_EBIT	1


Temp_Down     	VAR PortA.0    	 'Temp down button input port
Temp_Up      	VAR PortA.1    	 'Temp up button input port
G_LED         	VAR PortC.0   	  ' Green LED output cold needed
Relay_Cold		VAR PORTC.1
R_LED        	VAR PortC.6   	  ' Red LED output  hot needed
Relay_hot		VAR PortC.7
DQ           	VAR PortE.2   	  ' One-wire Data-Pin "DQ" on PortE.2


'Temp_Down    	VAR PortB.3    	 'Temp down button input port
'Temp_Up       	VAR PortB.2    	 'Temp up button input port
'R_LED        	VAR PortB.0   	  ' Red LED output
'G_LED        	VAR PortB.1   	  ' Green LED output
'DQ            	VAR PortC.0   	  ' One-wire Data-Pin "DQ" on PortC.0
'


Busy          	VAR BIT        	 ' Busy Status-Bit

delay         	VAR BYTE       	 'Button working variable
Dummy         	VAR BYTE       	 ' Dummy for Div32
Loscale			VAR BYTE
Hiscale			VAR BYTE
Decal			VAR BYTE

Tempeff			VAR WORD
Setpoint      	VAR WORD
R_Temp        	VAR WORD        	' RAW Temperature readings
TempC         	VAR WORD        	' Temp in deg C
Float         	VAR WORD       	' Holds remainder for + temp C display

ColdStart		VAR BIT
Sign			VAR BIT

Cold_Bit      	VAR R_Temp.Bit11	' Sign-Bit for +/- Temp. 1 = Below 0 deg C

 
ADCON1 = 7			          	' Set PORTD and PORTE to digital
CMCON  = 7						' Comparators OFF

PORTA = %00000011
PORTB = 0
PORTC = 0
PORTD = 0
PORTE = 0

TRISA = %00000011
TRISB = 0
TRISC = 0
TRISD = 0
TRISE = %00000010


DS18B20_9bit  CON %00011111   	' 93.75ms, 0.5°C
DS18B20_10bit CON %00111111   	' 187.5ms, 0.25°C  <-- My favorite
DS18B20_11bit CON %01011111   	' 375ms,   0.125°C
DS18B20_12bit CON %01111111   	' 750ms,   0.0625°C  (default)

   
Setpoint = 200                                  'Default setpoint on start up
ColdStart = 1

    LCDOut  $FE,1                                     'Clear LCD     
    PAUSE 750
    
'Chargement motifs en CGRAM

  LCDOUT  $FE,$40,$00,$00,$00,$00,$00,$04,$04,$04  ' Cust Char #0
  LCDOUT  $FE,$48,$00,$00,$00,$04,$04,$04,$04,$04  ' Cust Char #1
  LCDOUT  $FE,$50,$04,$04,$04,$04,$04,$04,$04,$04  ' Cust Char #2
  LCDOUT  $FE,$58,$04,$04,$0E,$0E,$0E,$1F,$1B,$11  ' Cust Char #3
  LCDOUT  $FE,$60,$11,$1B,$1F,$0E,$0E,$0E,$04,$04  ' Cust Char #4

  
    OWOUT DQ, 1, [$CC, $4E, 0, 0, DS18B20_10bit]    'Skip ROM search and write 10bit 														resolution to scratch pad    
    
Start_Convert:

    OWOUT   DQ, 1, [$CC, $44]                       ' Skip ROM search & do temp conversion
    
    
    delay = 0
    Button Temp_Up,   0, 255, 0, delay, 1, Up_Loop
    button Temp_Down, 0, 255, 0, delay, 1, Down_Loop  
    
'*****************************************************************************
' Check for still busy converting ( ~ 4500 fois ... )
'*****************************************************************************

waitloop: 

		INPUT DQ
		If NOT DQ Then waitloop
		
    
    OWOUT   DQ, 1, [$CC, $BE ]                       ' Skip ROM search & read scratchpad 														memory
    OWIN    DQ, 2, [R_Temp.Lowbyte, R_Temp.Highbyte]' Read two bytes / end comms
      
Convert_Temp:                                       

	IF R_Temp.15 THEN
	
		 R_Temp = ~R_Temp + 1
		 Sign = 1									'Signe -
		 
	ELSE			                       
	
   		 Sign = 0									'Sign  = "+"
   		 
   	ENDIF
   	
												
    TempC =  ( R_Temp & $7FF ) >> 4   				' Partie Entière
                  
    Float = ((R_Temp.Lowbyte & $0F ) * 25 )>> 2     ' Partie décimale 100èmes
    
    Tempeff = TempC*10 + Float/10					'Préparation 1/10 degrés

	gosub Aff
       
 GOTO    Start_Convert
    
                                                                 
Up_Loop:

    If Temp_Up = 0 Then
        Setpoint = Setpoint + 5
        lcdout $fe, $C0, "Setpoint = ", DEC2 (Setpoint/10),".",DEC1(SetPoint // 10)," "
        Gosub Show
        Pause 500
    Else
        Goto Start_Convert
    Endif
    Goto Up_Loop
    
    
Down_Loop:
                
    If Temp_Down = 0 Then
        Setpoint = Setpoint - 5
        lcdout $fe, $C0, "Setpoint = ",  DEC2 (Setpoint/10),".",DEC1(SetPoint // 10)," "
        Pause 500
        Gosub Show
    Else
        Goto Start_Convert
    Endif
    Goto Down_Loop    
   


'*****************************************************************************
'*****************************************************************************
'                              AFFICHAGE
'*****************************************************************************
'*****************************************************************************

'Motifs

'Small bar     LCDOUT  $FE,$40,$00,$00,$00,$00,$00,$04,$04,$04  ' Cust Char #0
'Mid bar       LCDOUT  $FE,$48,$00,$00,$00,$04,$04,$04,$04,$04  ' Cust Char #1
'Big bar       LCDOUT  $FE,$50,$04,$04,$04,$04,$04,$04,$04,$04  ' Cust Char #2
'Arrow 		   LCDOUT  $FE,$58,$04,$04,$0E,$0E,$0E,$1F,$1B,$11  ' Cust Char #3
'Inv Arrow     LCDOUT  $FE,$60,$11,$1B,$1F,$0E,$0E,$0E,$04,$04  ' Cust Char #4

'*****************************************************************************
Aff:'Affichage temp
'*****************************************************************************

'préparation chiffre : sign = 1 = valeur négative

Loscale = ( TempC /5 + Sign ) * 5  + Sign << 7
Decal = 0
Decal	= ( TempC // 5 ) << 1 

IF Sign THEN

	IF Float > 25 AND Float <= 75 then Decal = Decal - 1
	IF Float > 75 Then Decal = Decal - 2
	
ELSE
	
	IF Float > 25 AND Float <= 75 then Decal = Decal + 1
	IF Float > 75 Then Decal = Decal + 2
	
ENDIF

Hiscale = (TempC /5 + ( Sign ^1)) * 5 + Sign << 7

'Impression valeurs 1ère ligne

  LCDOUT	$FE, $81 ,SDEC2 Loscale,178,"C"," ",SDEC TempC,".",dec2 Float,$FE,$80 + 12,SDEC2 Hiscale,178,"C"
  
'Impression échelle 2ème ligne

 LCDOUT	$FE,$C0,$01,$00,$02,$00,$01,$00,$01,$00,$01,$00,$01,$00,$02,$00,$01,$00
  
'Impression index

 IF Tempeff < Setpoint THEN
 
	LCDOUT	$FE, $C2 + Decal,$03				'Index Chauffage
	
 ELSE
 
	LCDOUT	$FE, $C2 + Decal,$04				' Index Refroidissement
	
ENDIF

Show:

 IF Tempeff < Setpoint THEN
   
	high R_LED                                   ' Turn on Red LED C0  and turn off Green 														LED C6
	low G_LED
	
	IF Coldstart THEN Relay_hot = 1 : Relay_cold = 0 : Coldstart = 0
                       
 ELSE
	
    High G_LED                                   ' Turn on Green LED C6 and turn off Red 														LED C0
    low R_LED
    
    IF Coldstart THEN Relay_hot = 0 : Relay_cold = 1 : coldstart = 0
                           
 ENDIF
  
'*****************************************************************************
Drive:
'*****************************************************************************
 	
	IF Tempeff < (Setpoint - 5) AND Relay_hot = 0 THEN Relay_hot = 1 : Relay_cold = 0  'C7
	  
	IF Tempeff > (Setpoint + 5) AND Relay_cold = 0 THEN Relay_hot = 0 : Relay_cold = 1	'C1
	  
RETURN

    END
Some little improvements to work further on for the drive section ...

but the idea is here ...

Alain