Code:
'	@ DEVICE pic16F648A, INTRC_OSC_NOCLKOUT  	   ' System Clock Options	
	@ DEVICE pic16F648A, HS_OSC  	   ' System Clock Options	

    @ DEVICE pic16F648A, WDT_OFF	   ' Watchdog Timer
	@ DEVICE pic16F648A, PWRT_ON	   ' Power-On Timer
	@ DEVICE pic16F648A, BOD_ON       ' Brown-Out Detect
	@ DEVICE pic16F648A, MCLR_ON	   ' Master Clear Options (Internal)
	@ DEVICE pic16F648A, LVP_OFF	   ' Low-Voltage Programming
	@ DEVICE pic16F648A, CPD_OFF       ' Data Memory Code Protect
	@ DEVICE pic16F648A, PROTECT_OFF   ' Program Code Protection


DEFINE OSC 12
define LCD_LINES 4

Clr             CON 1
Comm            Con $FE
LINE1           con 2
LINE2           con $c0
LINE3           con $94
LINE4           con $d4
Offset          VAR BYTE
OffsetP         var byte
Interi          var word
Decimali_Temp   VAR word
Temporaneo      var byte
Valore          VAR byte
i               var byte
n               var byte
Sign            VAR BYTE
DQ              var portb.1
Recorded_Temp   var word
Dummy           var WORD
Decimali        var BYTE
Resto           var WORD
Stat            var bit
Cold_Bit        VAR Recorded_Temp.Bit11
Real_Cold       CON 1           
MyButton        var portb.0
LongPress       con 50		
RPM_Port        var portb.2
RPM             var WORD
ButtonPress     var word
x               var byte : x = -1

    Mybutton = 1            
    CMCON=%00000111			' Comparators OFF
	OPTION_REG.7=0			' Enable weak Pull-Ups (used for PressButton)

Begin:
        Pause 500   
        LCDOUT  254,64,31,31,31,31,0,0,0,0       ' Cust Char #0  
        LCDOUT  254,72,0,0,0,0,31,31,31,31       ' Cust Char #1  
        LCDOUT  254,80,31,31,31,15,7,3,1,0       ' Cust Char #2  
        LCDOUT  254,88,31,31,31,30,28,24,16,0    ' Cust Char #3  
        LCDOUT  254,96,0,16,24,28,30,31,31,31    ' Cust Char #4  
        LCDOUT  254,104,0,1,3,7,15,31,31,31      ' Cust Char #5
        'LCDOUT  254,112,31,31,31,31,31,31,31,31  ' Cust Char #6   
        LCDOUT  254,120,0,0,0,0,12,30,30,12      ' Cust Char #7    
    
Main:
    goto menu
end       

Elaborazione:
        IF cold_bit = real_cold then Elaborazione_Freddo
        sign = "+"
        gosub elaborazione_common
return

Elaborazione_Common:
        Dummy  = 625 * recorded_Temp
        Interi = div32 10
        Interi  = (Recorded_Temp & $0FF0) >> 4
        Decimali_Temp = ((Recorded_Temp.Lowbyte & $0F) * 625)
        Decimali = Decimali_Temp / 100
        Resto = Decimali_Temp // 100
        if (resto >= 50) then Decimali = Decimali + 1
return

Elaborazione_Freddo:
        Sign   = "-"            
        RECORDED_TEMP = ~recorded_Temp + 1
        gosub elaborazione_common
return

Visualizzazione:
        select case Interi
            case is < 10
                GOSUB SEGNO
                n = 0 
                OFFSET = 5
                Valore = Interi
                gosub Cifre 
                OffsetP = 5 
                Gosub Punto
                N = 1
                OFFSET = 10
                Valore = Decimali
                GOSUB Cifre
            case is < 100
                offset = 0
                n = 1 
                Valore = Interi
                gosub Cifre
                OffsetP = 5
                gosub Punto
                N = 1
                OFFSET = 10
                Valore = Decimali
                GOSUB Cifre
            case is < 200
                offset = 0
                n = 2 
                Valore = Interi
                gosub Cifre
                offsetP = 10
                gosub Punto
                N = 0
                OFFSET = 15
                decimali_temp = decimali
                Decimali_temp = Decimali / 10
                Resto = Decimali // 10
                Decimali = Decimali_temp
                if (resto >= 5) then Decimali = Decimali + 1 
                Valore = Decimali
                GOSUB Cifre
            case is < 1000 
                offset = 0
                n = 2 
                Valore = Interi
                gosub Cifre
            case else 
                offset = 0
                n = 3
                valore = RPM
                gosub Cifre
            end select    
RETURN

Segno:
        SELECT CASE SIGN
             CASE "+"
                lcdout comm, $C2, $01, $FF, $01
                LCDOUT COMM, $96, $00, $FF, $00
             CASE "-"
                lcdout comm, $C2, $01, $01, $01
                LCDOUT COMM, $96, $00, $00, $00 
        END SELECT
RETURN

Cifre:
       For I = N to 0 STEP -1
        Temporaneo = Valore dig i 
        select case Temporaneo
            case 0 
                gosub Numero0
            case 1 
                gosub Numero1
            case 2 
                gosub Numero2
            case 3 
                gosub Numero3
            case 4 
                gosub Numero4
            case 5 
                gosub Numero5
            case 6 
                gosub Numero6
            case 7 
                gosub Numero7
            case 8
                gosub Numero8
            case 9 
                gosub Numero9
        end select
        OFFSET = OFFSET + 5
       next I
return 

GetButton:
	ButtonPress=0
	While MyButton=0
		If ButtonPress<255 then ButtonPress=ButtonPress+1
		Pause 50 ' This is also our Debounce value
	Wend
	If ButtonPress>0 then
		If ButtonPress=>LongPress then 
			ButtonPress=2
		else
            buttonpress = 1	
        endif
    endif
Return

Bottone:
    gosub getbutton
    if buttonpress = 1 then goto Menu
return

Temp_Wait:
    GOSUB BOTTONE
    owin dq, 4, [Stat]
        If stat = 0 then Temp_Wait
return

Menu:
    x = x + 1
    IF x > 5 then x = 0 
    branchl x,[Sommario,Oil_temp,h2o_temp,ext_temp,int_temp,rpm_window]
return

Temps_Common:
    owin dq, 2, [Recorded_Temp.LOWBYTE,Recorded_Temp.HIGHBYTE]    
    gosub Elaborazione
    gosub visualizzazione    
return
    
Sommario:
    gosub bottone
    gosub clrscr
    lcdout "Sommario"
    pause 100
goto sommario

RPM_Window:
    gosub bottone
    gosub clrscr
'    gosub Rpm_Count
'    interi = RPM
'    gosub visualizzazione
    lcdout "RPM_Window"
    pause 100
goto rpm_window

H2O_Temp:
        Owout DQ, 1, [$55,$28,$09,$B4,$F5,$00,$00,$00,$28,$44]
        gosub temp_wait
        owout dq, 1, [$55,$28,$09,$B4,$F5,$00,$00,$00,$28,$BE]        
    gosub clrscr
    LCDOUT comm, line1, "T", COMM, LINE2, "H", COMM, LINE3, "2", COMM, LINE4, "0"
    gosub temps_common
goto h2o_temp

Int_Temp:
    gosub bottone
    gosub clrscr
    sign = "+"
    Interi = 4
    decimali = 73
    gosub visualizzazione
    pause 100
goto int_temp

Ext_Temp:
    gosub bottone
    gosub clrscr
    Sign = "-"
    Interi = 9
    decimali = 24
    gosub visualizzazione
    pause 100
goto ext_temp

Oil_Temp:
        Owout DQ, 1, [$55,$28,$87,$8B,$F5,$00,$00,$00,$3A,$44]
        gosub temp_wait
        owout dq, 1, [$55,$28,$87,$8B,$F5,$00,$00,$00,$3A,$BE]          
    gosub clrscr
    LCDOUT comm, line1, "T", COMM, LINE2, "O", COMM, LINE3, "I", COMM, LINE4, "L"
    gosub temps_common
goto oil_Temp 

Rpm_Count:
    COUNT RPM_PORT, 500, RPM
    RPM = RPM * 2
RETURN 

Punto:
        LCDOUT Comm, ($D9 + OFFSET), $07 : return
Numero0:
        LCDOUT COMM, ($81 + OFFSET), $05, $FF, $FF, $04
        GOSUB COMBO1
        LCDOUT COMM, ($95 + OFFSET), $FF, COMM, ($98 + OFFSET), $FF
        LCDOUT COMM, ($D5 + OFFSET), $02, $FF, $FF, $03
        RETURN
Numero1:
        lcdout comm, ($82 + OFFSET), $05, $FF
        lcdout comm, ($C3 + OFFSET), $FF
        lcdout comm, ($97 + OFFSET), $FF
        lcdout comm, ($D7 + OFFSET), $FF        
        RETURN
Numero2:
        GOSUB COMBO2
        LCDOUT comm, ($C4 + OFFSET), $FF
        LCDOUT comm, ($95 + OFFSET), $05, $00, $00, $00
        LCDOUT comm, ($D5 + OFFSET), $FF, $01, $01, $01
        RETURN
Numero3:
        GOSUB COMBO2
        LCDOUT comm, ($C2 + OFFSET), $01, $01, $FF
        LCDOUT comm, ($96 + OFFSET), $00, $00, $FF
        GOSUB COMBO3
        RETURN 
Numero4:
        lcdout comm, ($81 + OFFSET), $FF
        GOSUB COMBO1
        GOSUB COMBO4
        GOSUB COMBO5
        return      
Numero5:
        LCDOUT COMM, ($81 + OFFSET), $05, $00, $00, $00
        GOSUB COMBO6
        GOSUB COMBO4
        GOSUB COMBO3
        RETURN    
Numero6:
        LCDOUT COMM, ($81 + OFFSET), $05, $00, $00
        GOSUB COMBO6
        LCDOUT COMM, ($95 + OFFSET), $FF, $00, $00, $04
        GOSUB COMBO7
        RETURN
Numero7:
        GOSUB COMBO2
        LCDOUT COMM, ($C3 + OFFSET), $01, $FF
        LCDOUT COMM, ($97 + OFFSET), $00, $FF
        GOSUB COMBO5
        RETURN
Numero8:
        GOSUB COMBO8
        LCDOUT COMM, ($C1 + OFFSET), $02, $01, $01, $03
        LCDOUT COMM, ($95 + OFFSET), $05, $00, $00, $04
        GOSUB COMBO7
        RETURN       
Numero9:
        GOSUB COMBO8
        LCDOUT COMM, ($C1 + OFFSET), $02, $01, $01, $FF
        GOSUB COMBO5
        LCDOUT COMM, ($D6 + OFFSET), $01, $01, $03
        RETURN
COMBO1:
        LCDOUT COMM, ($C1 + OFFSET), $FF, COMM, ($C4 + OFFSET), $FF
        RETURN
COMBO2:
        LCDOUT comm, ($81 + OFFSET), $00, $00, $00, $04
        RETURN
COMBO3:
        LCDOUT comm, ($D5 + OFFSET), $01, $01, $01, $03
        RETURN
COMBO4:
        LCDOUT comm, ($95 + OFFSET), $00, $00, $00, $FF
        RETURN
COMBO5:
        LCDOUT comm, ($D8 + OFFSET), $FF
        RETURN
COMBO6:
        LCDOUT COMM, ($C1 + OFFSET), $FF
        RETURN
COMBO7:
        LCDOUT COMM, ($D5 + OFFSET), $02, $01, $01, $03
        RETURN
COMBO8:
        LCDOUT COMM, ($81 + OFFSET), $05, $00, $00, $04
        RETURN
Clrscr:
    lcdout comm, clr
return