Thermo 7 segments - little problem


Results 1 to 40 of 50

Threaded View

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


    Did you find this post helpful? Yes | No

    Default Hi ! Me again :) ...

    I made this schematic; I use this code. Works fine, but.... I don't know how to display "minus sign" for negative temperatures. I try differents variants, but without results...Any advice it's wellcome ! Thanks in advance !
    Code:
    ' *************************************************************
    ' * For use with EXPERIMENTING WITH THE PICBASIC PRO COMPILER *
    ' *			                                            *
    ' *  This source code may be freely used within your own      *
    ' *  programs. However, if it is used for profitable reasons, *
    ' *        please give credit where credit is due.	        *
    ' *  And make a reference to myself or Rosetta Technologies   *
    ' *							                    *
    ' *			              Les. Johnson		        *
    ' *************************************************************
    '
    ' Common Anode seven segment display multiplexer
    ' Displays the contents of the variable D_NUMBER on five common Anode displays
    ' using a TMR0 interrupt 
    ' ***********************************************************************
    @ DEVICE pic16F648A, XT_OSC, WDT_OFF, PWRT_OFF, BOD_OFF, MCLR_OFF, LVP_OFF, CPD_OFF       
    
      CMCON = 7                
      VRCON = 0
      INTCON = 0
    Include "Modedefs.bas"
    
    ' ** Setup the Crystal Frequency, in mHz **
    
    	Define 	OSC		4 		   	' Set Xtal Frequency
    
    ' ** Declare the Variables **
    	LEDS		  	Var	Byte		      ' The amount of LEDs in the display
    	O_C		    	Var	Byte		      ' Used by the interrupt for time sharing
    	Counter		Var	Word		      ' General purpose counter
    	Del		    	Var	Word		      ' General purpose delay loop variable
    	D_Number		Var	Word		      ' The number to display on the LEDS
    	DP		    	Var	Byte		      ' Position of the decimal point
    	Disp_Patt		Var	Byte		      ' Pattern to output to PortC
    	Num		    	Var	Byte[5]	      ' Array to hold each digits value
    	Digit0		Var	PortA.0		' Controls the first DIGIT on the LED
    	Digit1		Var	PortA.1		' Controls the second DIGIT on the LED
    	Digit2		Var	PortA.2		' Controls the third DIGIT on the LED
    	Digit3		Var	PortA.3		' Controls the fourth DIGIT on the LED
          
    	temperature       var   word
    	TempC             Var   word
    	Temp	            Var   byte
          Float             Var   word
    	V		      Var   word		  
    	Twist             Var   bit
    	Dummy             Var   byte
          Sign              var   byte
    	busy              var   bit
    	DS18B20_12bit 	CON %01111111           ' 750ms,   0.0625°C  
    	DQ			var PortA.4
    
    
    ' ** Declare the bits and flags of the various registers **
    
    	T0IE		Var	INTCON.5	      	' Timer0 Overflow Interrupt Enable
    	T0IF		Var	INTCON.2	      	' Timer0 Overflow Interrupt Flag
    	GIE		Var	INTCON.7	        	' Global Interrupt Enable
    	PS0		Var	OPTION_REG.0	    	' Prescaler division bit-0
    	PS1		Var	OPTION_REG.1	    	' Prescaler division bit-1
    	PS2		Var	OPTION_REG.2	    	' Prescaler division bit-2
    	PSA		Var	OPTION_REG.3	   	' Prescaler Assignment (1= assigned to WDT)
                                  			'    (0= assigned to oscillator)
    	T0CS		Var	OPTION_REG.5	  	' Timer0 Clock Source Select (0=Internal clock) 
                                 				'    (1=External PORTA.4)
                                  
                                  
    ' Set TMR0 to interrupt
    	GIE=0				      		' Turn off global interrupts
    	While GIE=1:GIE=0:Wend				' Make sure they are off
    	PSA=0							' Assign the prescaler to external oscillator
    	PS0=0							' Set the prescaler
    	PS1=1							' to increment TMR0
    	PS2=0							' every 64th instruction cycle
    	T0CS=0						' Assign TMR0 clock to internal source
    	TMR0=0						' Clear TMR0 initially
    	T0IE=1						' Enable TMR0 overflow interrupt
    	GIE=1							' Enable global interrupts
    
    On Interrupt Goto Mult_Int				' Point to the interrupt handler
    
    	TrisB=0						' Make PortB outputs
    	TrisA.0=0:TrisA.1=0:TrisA.2=0			' Make only the specific bits of PortA outputs					
    	TrisA.3=0:TrisA.4=1
    	PortA=0:PortB=0			      	' Clear PortB and PortA
    	O_C=0							' Clear the time share variable 
    
    
    
    
    OWOut DQ, 1, [$CC, $4E, 0, 0, DS18B20_12bit]
     Output DQ              		' Make Pin Output
     DQ=0						' OneWire line Low
     PauseUs 480                    	' Keep down for 480 µS  
     Input DQ                       	' Make Pin Input
     PauseUs 70                     	' Wait 70 µS
    
    
    W1: 
        OWIN DQ,4,[busy]            	' Check for still busy converting
        IF busy = 0 THEN W1         	' Still busy?  then loop
    
    ' ** THE MAIN PROGRAM STARTS HERE **
    	
    Main:	
    OWOut DQ, 1, [$CC, $44] 
    OWOut DQ, 1, [$CC, $BE]
    OWIn DQ, 2, [temperature.byte0, temperature.byte1]         
    If Temperature.15 then       
      Temperature= ~Temperature +1
      Twist = 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 Twist then
      V= 10000 - Temperature            		' 25 C=12500  0 C=10000  -10 C=9000 
      Twist = 0
    else
      V= 10000 + Temperature
    EndIf
    
    If V >= 10000 then                     		' Above 0 C.      
      Temperature=V-10000
      sign = " "                   
    else                                   
      Temperature=10000-V                   		' Below 0 C. 
      sign= "-"
    EndIf
    	D_Number=Temperature/10			      ' Place the value to display into D_NUMBER
    	DP=0					            ' Disable the decimal point
    	Gosub Display				      ' Display the value
    	 For Del=0 to 100			      	' Pause 10ms
    	 Pauseus 100				      ' using smaller delays
    	 Next
    
    Inf:	
    Goto Main				              	' Do it forever
    
    ' Build up the seperate digits of variable D_NUMBER
    ' into the array NUM. Each LED is assigned to each array variable.
    ' LED-0 (right) displays the value of NUM[0]
    ' LED-1 (middle) displays the value of NUM[1]
    ' LED-2 (lef) displays the value of NUM[2]
    ' The decimal point is placed by loading the variable DP
    ' with the LED of choice to place the point (0..5). where 1 is the farthest right LED
    ' and 0 disables the decimal point.
    Display:
    	For LEDS=3 to 0 step -1 				' Loop for 4 digits (0-9999)
    	Disable							' Disable the interrupt while we calculate
    	Num[LEDS]=D_Number dig LEDS 				' Extract the seperate digits into the array
    	If D_Number<10 and LEDS=1 then Num[LEDS]=10	' Zero Suppression for the second digit
    	If D_Number<100 and LEDS=2 then Num[LEDS]=10	' Zero Suppression for the Third digit
    	If D_Number<1000 and LEDS=3 then Num[LEDS]=10	' Zero Suppression for the Forth digit
    	Enable							' Re-enable the interrupt
    	Next	
    
    
    
    ' INTERRUPT HANDLER 
    ' Multiplexes the 4-digits
    ' 
            Disable         			' Disable all interupts during the interrupt handler
    Mult_Int: 
    	Lookup Num[O_C],[192,249,164,176,153,146,131,248,128,152,255],Disp_Patt ' Decode the segments for the LED
    
    ' Process the first display (farthest right)
    	If O_C=0 then				' If it is our turn then
    	Digit3=0					' Turn OFF the fourth LED
    	PortB=Disp_Patt				' Place the digit pattern on portC
    	If DP=1 then PortB.7=0			' Check the value of DP and Turn ON the decimal point
    	Digit0=1					' Turn ON the first LED
    	Endif
    ' Process the second display
    	If O_C=1 then				' If it is our turn then
    	Digit0=0					' Turn OFF the first LED
    	PortB=Disp_Patt				' Place the digit pattern on portC
    	If DP=2 then PortB.7=0			' Check the value of DP and Turn ON the decimal point
    	Digit1=1					' Turn ON the second LED
    	Endif
    ' Process the third display
    	If O_C=2 then				' If it is our turn then
    	Digit1=0					' Turn OFF the second LED
    	PortB=Disp_Patt				' Place the digit pattern on portC
    	If DP=3 then PortB.7=0			' Check the value of DP and Turn ON the decimal point
    	Digit2=1					' Turn ON the third LED
    	Endif
    ' Process the fourth display
    	If O_C=3 then				' If it is our turn then
    	Digit2=0					' Turn OFF the third LED
    	PortB=Disp_Patt				' Place the digit pattern on portC
    	If DP=3 then PortB.7=0			' Check the value of DP and Turn ON the decimal point
    	Digit3=1					' Turn ON the fourth LED
    	Endif
    
    	O_C=O_C+1					' Increment the time share counter
    	If O_C>=4 then O_C=0			' If it reaches 4 or over then clear it
    
    	T0IF=0    					' Reset TMR0 interrupt flag
            Resume					' Exit the interrupt
    	Enable					' Allow more interrupts
    Attached Images Attached Images  

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