Code:
	;                          CATOD / ANOD COMUN 
;                         merge foarte bine !!!
;                        VARIANTA 2 SENZORI !!!
;                     by Niculescu Dan, APRIL 2011
;
;
'======================================================================================
;                                                              
;                        .oooO                                 
;                        (   )   Oooo.                         
;                         \ (    (   )
;                          \_)    ) /
;                                (_/
;
@ DEVICE pic16F628A, intOSC_osc_noclkout, WDT_OFF, PWRT_ON
DEFINE OSC 4
CMCON		= 7
VRCON 	= 0
INTCON	= 0
                                
    COMMON_0   	VAR PORTA.0
    COMMON_1   	VAR PORTA.1
    COMMON_2   	VAR PORTA.2
    COMMON_3   	VAR PORTA.3   
    DQ          VAR PORTA.4
    DQ2		      VAR PORTA.6
    DP          VAR PORTB.7
Temp   	        Var     Byte 		: Temp2   	      Var     Byte
Temperature     Var     Word 		: Temperature2    Var     Word
TempC           Var     Word 		: TempC2          Var     Word
I               Var     Byte 		: I2              Var     Byte
Sign            Var     Word 		: Sign2           Var     Word
Float           Var     Word 		: Float2          Var     Word
V		            Var     Word 		: V2		          Var     Word		   
Dummy           Var     Byte 		: Dummy2          Var     Byte
Busy		        Var     Bit  		: Busy2	          Var     Bit
Delay           Var     Word
Valoare         VAR     Word
Semn		        Var     Word
    DIGIT_0     VAR 	BYTE
    DIGIT_1     VAR 	BYTE
    DIGIT_2     VAR 	BYTE
    DIGIT_3     VAR 	BYTE
DS18B20_12bit    CON %01111111        ' 750ms,   0.0625°C 
DS18B20_12bit2   CON %01111111       ' 750ms,   0.0625°C 
TrisB=%00000000				 ' Make PortB outputs
TrisA=%11110000
PortA=0:PortB=0			     	 ' Clear PortB and PortA
'======================================================================================
' Init Sensor 1
 OWOUT DQ, 1, [$CC, $4E, 0, 0, DS18B20_12bit]
 OWOut DQ, 1, [$CC, $48]       		    ' Start temperature conversion
 OWOut DQ, 1, [$CC, $B8] 
 OWOut DQ, 1, [$CC, $BE] 
 Pause 50
 OWIn DQ, 2, [temperature.byte0, temperature.byte1]
' Init Sensor 2
 OWOUT DQ2, 1, [$CC, $4E, 0, 0, DS18B20_12bit2]
 OWOut DQ2, 1, [$CC, $48]       		    ' Start temperature conversion
 OWOut DQ2, 1, [$CC, $B8] 
 OWOut DQ2, 1, [$CC, $BE] 
 Pause 50
 OWIn DQ2, 2, [temperature2.byte0, temperature2.byte1]
 Pause 100
'======================================================================================    
Main :
If portA.7= 1 then
valoare=temperature
semn=sign
Endif
If portA.7= 0 then
valoare=temperature2
semn=sign2
Endif
Part1:
' Start temp.conv.Sensor1
 OWOut DQ, 1, [$CC, $44] 
 OWOut DQ, 1, [$CC, $BE]
 OWIn DQ, 2, [temperature.byte0, temperature.byte1]  
If Temperature.15 then       
  Temperature= ~Temperature +1
  Sign  = 1
Endif
 
Dummy = 625 * Temperature
TempC = DIV32 10 
TempC = (Temperature & $7FF) >> 4
Float = ((Temperature.Lowbyte & $0F ) * 25 )>>2
Temperature = TempC*100 + Float
If Sign=1 then
  V= 10000 - Temperature            
else
  V= 10000 + Temperature
EndIf
If V >= 10000 then                  
  Temperature=V-10000
  sign = " "                   
else                                   
  Temperature=10000-V             	
  sign = "-"
EndIf
Temperature=Temperature/10
'===================================== end part one
Part2 :	
' Start temp.conv.Sensor1
 OWOut DQ2, 1, [$CC, $44] 
 OWOut DQ2, 1, [$CC, $BE]
 OWIn DQ2, 2, [temperature2.byte0, temperature2.byte1]  
    
If Temperature2.15 then       
  Temperature2= ~Temperature2 +1
  Sign2  = 1
Endif
 
Dummy2 = 625 * Temperature2
TempC2 = DIV32 10 
TempC2 = (Temperature2 & $7FF) >> 4
Float2 = ((Temperature2.Lowbyte & $0F ) * 25 )>>2
Temperature2 = TempC2*100 + Float2
If Sign2=1 then
  V2= 10000 - Temperature2           
else
  V2= 10000 + Temperature2
EndIf
If V2 >= 10000 then                
  Temperature2=V2-10000
  sign2 = " "                   
else                                   
  Temperature2=10000-V2             	
  sign2 = "-"
EndIf
Temperature2=Temperature2/10
'===================================== end part two
Gosub Selectie
Gosub Display				' B for Common CATOD;without B for Common ANOD
Goto Main
'======================================================================================       
Selectie :
IF semn ="-" then					
    DIGIT_3="-"
    else
    DIGIT_3=" "
ENDIF
 
IF valoare DIG 2 = 0 THEN
    DIGIT_2 = " "
    ELSE
    DIGIT_2 = valoare dig 2
ENDIF
    DIGIT_1 = valoare dig 1
    DIGIT_0 = valoare dig 0
RETURN
'======================================================================================       
Display:					' For Common ANOD
for i=0 to 3
    TEMP = DIGIT_3 : gosub segments
    COMMON_3 = 1 :gosub DelayBetweenEachDigit : COMMON_3 = 0
     
    TEMP = DIGIT_2 : GOSUB segments
    COMMON_2 = 1 :gosub DelayBetweenEachDigit : COMMON_2 = 0
       
    TEMP = DIGIT_1 : GOSUB segments
    COMMON_1 = 1 :DP = 0 : gosub DelayBetweenEachDigit : COMMON_1 = 0 : DP = 1
  
    TEMP = DIGIT_0 : GOSUB segments
    COMMON_0 = 1 :gosub DelayBetweenEachDigit : COMMON_0 = 0
next i
RETURN
'======================================================================================       
Displayb:					' For Common CATOD
for i=0 to 3 
    TEMP = DIGIT_3 : gosub segmentsB
    COMMON_3 = 0 :gosub DelayBetweenEachDigit : COMMON_3 = 1
     
    TEMP = DIGIT_2 : GOSUB segmentsB
    COMMON_2 = 0 : gosub DelayBetweenEachDigit : COMMON_2 = 1
   
    TEMP = DIGIT_1 : GOSUB segmentsB
    COMMON_1 = 0 : DP = 1 : gosub DelayBetweenEachDigit : COMMON_1 = 1 : DP = 0
  
    TEMP = DIGIT_0 : GOSUB segmentsB
    COMMON_0 = 0 : gosub DelayBetweenEachDigit : COMMON_0 = 1
next i
RETURN
'======================================================================================       
segments:  ; CONVERTS DATES TO 7 SEGMENT CODE for Common ANOD
    
    SELECT CASE TEMP       
CASE 0 	 : PortB=%11000000 ; 0=ON ; 1=OFF
CASE 1 	 : PortB=%11111001
CASE 2 	 : PortB=%10100100      
CASE 3 	 : PortB=%10110000        
CASE 4 	 : PortB=%10011001
CASE 5 	 : PortB=%10010010        
CASE 6 	 : PortB=%10000010
CASE 7 	 : PortB=%11111000        
CASE 8 	 : PortB=%10000000       
CASE 9 	 : PortB=%10010000        
CASE "-"     : PortB=%10111111               
CASE " "     : PortB=%11111111        
    END SELECT   
RETURN
'======================================================================================       
segmentsB:  ; CONVERTS DATES TO 7 SEGMENT CODE for Common CATOD
    
    SELECT CASE TEMP       
CASE 0 	 : PortB=%00111111 ; 1=ON ; 0=OFF 
CASE 1 	 : PortB=%00000110
CASE 2 	 : PortB=%01011011      
CASE 3 	 : PortB=%01001111        
CASE 4 	 : PortB=%01100110
CASE 5 	 : PortB=%01101101        
CASE 6 	 : PortB=%01111101
CASE 7 	 : PortB=%00000111        
CASE 8 	 : PortB=%01111111       
CASE 9 	 : PortB=%01101111        
CASE "-"     : PortB=%01000000               
CASE " "     : PortB=%00000000        
    END SELECT   
RETURN
'====================================================================================== 
DelayBetweenEachDigit:
    ' DelayBetweenEachDigit
    ' ---------------------
    ' Produce delay of about 3 mSec 
    ' Fine tuned with MPLAB StopWatch to get MainLoop = 1 sec
    For delay=1 to 5 
	@ nop
	next DELAY
	@ nop
	@ nop
	@ nop                                   
      @ nop
	@ nop
	@ nop
	@ nop
    return      
'======================================================================================
END						' of story !!!
 
				
Bookmarks