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