Thermo 7 segments - little problem


Results 1 to 40 of 50

Threaded View

  1. #13
    Join Date
    Dec 2008
    Location
    Ploiesti, ROMANIA
    Posts
    582


    Did you find this post helpful? Yes | No

    Default Re: Thermo 7 segments - little problem

    My final code, using for thermometer with two DS18B20. Works fine !
    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 !!!
    Attached Images Attached Images  
    Last edited by fratello; - 22nd April 2011 at 07:50.

Similar Threads

  1. Windows 7 64 bit problem..can anyone help???
    By ljc4141 in forum mel PIC BASIC Pro
    Replies: 16
    Last Post: - 18th July 2011, 15:29
  2. LED Machine Tach For Tired Eyes
    By Archangel in forum mel PIC BASIC Pro
    Replies: 33
    Last Post: - 27th January 2010, 14:55
  3. adding with 7 segments
    By ruijc in forum mel PIC BASIC Pro
    Replies: 4
    Last Post: - 28th November 2007, 22:51
  4. 7 segments clock
    By the_apprentice in forum mel PIC BASIC Pro
    Replies: 5
    Last Post: - 27th April 2006, 18:45
  5. 7 segment digit problem (using Mister E's code)
    By jmgelba in forum mel PIC BASIC Pro
    Replies: 7
    Last Post: - 9th September 2005, 20:25

Members who have read this thread : 0

You do not have permission to view the list of names.

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts