I re-write the code posted by Mehmet (Thanks !) , because I intend to use interrupts. On ISIS work ...fine (little flicker ?!) . But...I wonder if the code it's right. I re-re-read MCSE help about using interrupts...and, of course, any advice it's wellcome. Thanks in advance !
Code:
'*********************************************************
'* *
'* Termometru 7 segmente *
'* cu intreruperi *
'* *
'*********************************************************
@ DEVICE pic16F628A, intOSC_osc_noclkout, WDT_OFF, PWRT_ON, MCLR_OFF, LVP_OFF, CPD_OFF, PROTECT_OFF
DEFINE NO_CLRWDT 1
DEFINE OSC 4
TRISA= %11110000 ' RA0..3=Outputs RA4...7=Input
TRISB= %00000000 ' RB0..RB7=Outputs
CMCON=7 ' Disable comparators
SEGMENT_A VAR PORTB.0
SEGMENT_B VAR PORTB.1
SEGMENT_C VAR PORTB.2
SEGMENT_D VAR PORTB.3
SEGMENT_E VAR PORTB.4
SEGMENT_F VAR PORTB.5
SEGMENT_G VAR PORTB.6
DP VAR PORTB.7
CATOD_0 VAR PORTA.0
CATOD_1 VAR PORTA.1
CATOD_2 VAR PORTA.2
CATOD_3 VAR PORTA.3
DQ VAR PORTA.4
OPTION_REG = %10000000
Temp var byte
DS18B20_12bit CON %01111111 ' 750ms, 0.0625°C
Temperature Var Word
TempC Var Word
I Var Byte
Sign Var Bit
Count_remain var Byte
Float Var Word
V Var Word ' Var. for display
Twist Var Bit
Dummy Var Byte
Busy var BIT ' Busy Status-Bit
DIGIT_0 VAR BYTE
DIGIT_1 VAR BYTE
DIGIT_2 VAR BYTE
DIGIT_3 VAR BYTE
OUTPUT SEGMENT_A
OUTPUT SEGMENT_B
OUTPUT SEGMENT_C
OUTPUT SEGMENT_D
OUTPUT SEGMENT_E
OUTPUT SEGMENT_F
OUTPUT SEGMENT_G
OUTPUT DP
OUTPUT CATOD_0
OUTPUT CATOD_1
OUTPUT CATOD_2
OUTPUT CATOD_3
SEGMENT_A = 0
SEGMENT_B = 0
SEGMENT_C = 0
SEGMENT_D = 0
SEGMENT_E = 0
SEGMENT_F = 0
SEGMENT_G = 0
DP = 0
CATOD_0 = 1 ; DISPLAYS 1. DIGIT
CATOD_1 = 1 ; DISPLAYS 2. DIGIT
CATOD_2 = 1 ; DISPLAYS 3. DIGIT
CATOD_3 = 1 ; DISPLAYS 4. DIGIT
'============================================================
ON INTERRUPT GOTO ISR
INTCON = %10100000
'============================================================
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
Pause 500
W1:
OWIN DQ,4,[busy] ' Check for still busy converting
IF busy = 0 THEN W1 ' Still busy? then loop
'============================================================
MAIN :
OWOUT DQ ,1,[$CC,$44]
OWOUT DQ ,1,[$CC,$BE]
OWIN DQ ,2,[Temperature.LOWBYTE , Temperature.HIGHBYTE]
Convert_Temp:
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
GoSub Sign_temp
Temperature = Temperature/10
GOSUB AFISARE
FOR I = 0 TO 4
GOSUB SCANNING
NEXT I
GOTO MAIN
'============================================================
' SUBROUTINES:
'============================================================
Sign_temp:
If V >= 10000 then ' Above 0 C.
Temperature=V-10000
sign = " "
Else
Temperature=10000-V ' Below 0 C.
sign= "-"
EndIf
Return
'============================================================
AFISARE : ' transfer the registers to diplay
IF TEMPERATURE DIG 3 = 0 THEN
DIGIT_3 = " "
ELSE
DIGIT_3 = TEMPERATURE dig 3
ENDIF
IF sign = 1 THEN
DIGIT_3 = "-"
ENDIF
IF TEMPERATURE DIG 2 = 0 THEN
DIGIT_2 = " "
ELSE
DIGIT_2 = TEMPERATURE dig 2
ENDIF
DIGIT_1 = TEMPERATURE dig 1
DIGIT_0 = TEMPERATURE dig 0
Return
DISABLE
ISR:
'============================================================
SCANNING : ' SCAN THE DISPLAYS
TEMP = DIGIT_3 : GOSUB TABLO
CATOD_3 = 0 : PAUSE 1 : CATOD_3 = 1
TEMP = DIGIT_2 : GOSUB TABLO
CATOD_2 = 0 : PAUSE 1 : CATOD_2 = 1
TEMP = DIGIT_1 : GOSUB TABLO
CATOD_1 = 0 : DP = 1 : PAUSE 1 : CATOD_1 = 1 : DP = 0
TEMP = DIGIT_0 : GOSUB TABLO
CATOD_0 = 0 : PAUSE 1 : CATOD_0 = 1
Return
'============================================================
TABLO : ' TABLE , CONVERTS THE DATAS TO 7 SEGMENT CODE
SELECT CASE TEMP
CASE 0
SEGMENT_A = 1
SEGMENT_B = 1
SEGMENT_C = 1
SEGMENT_D = 1
SEGMENT_E = 1
SEGMENT_F = 1
SEGMENT_G = 0
CASE 1
SEGMENT_A = 0
SEGMENT_B = 1
SEGMENT_C = 1
SEGMENT_D = 0
SEGMENT_E = 0
SEGMENT_F = 0
SEGMENT_G = 0
CASE 2
SEGMENT_A = 1
SEGMENT_B = 1
SEGMENT_C = 0
SEGMENT_D = 1
SEGMENT_E = 1
SEGMENT_F = 0
SEGMENT_G = 1
CASE 3
SEGMENT_A = 1
SEGMENT_B = 1
SEGMENT_C = 1
SEGMENT_D = 1
SEGMENT_E = 0
SEGMENT_F = 0
SEGMENT_G = 1
CASE 4
SEGMENT_A = 0
SEGMENT_B = 1
SEGMENT_C = 1
SEGMENT_D = 0
SEGMENT_E = 0
SEGMENT_F = 1
SEGMENT_G = 1
CASE 5
SEGMENT_A = 1
SEGMENT_B = 0
SEGMENT_C = 1
SEGMENT_D = 1
SEGMENT_E = 0
SEGMENT_F = 1
SEGMENT_G = 1
CASE 6
SEGMENT_A = 1
SEGMENT_B = 0
SEGMENT_C = 1
SEGMENT_D = 1
SEGMENT_E = 1
SEGMENT_F = 1
SEGMENT_G = 1
CASE 7
SEGMENT_A = 1
SEGMENT_B = 1
SEGMENT_C = 1
SEGMENT_D = 0
SEGMENT_E = 0
SEGMENT_F = 0
SEGMENT_G = 0
CASE 8
SEGMENT_A = 1
SEGMENT_B = 1
SEGMENT_C = 1
SEGMENT_D = 1
SEGMENT_E = 1
SEGMENT_F = 1
SEGMENT_G = 1
CASE 9
SEGMENT_A = 1
SEGMENT_B = 1
SEGMENT_C = 1
SEGMENT_D = 1
SEGMENT_E = 0
SEGMENT_F = 1
SEGMENT_G = 1
CASE "-"
SEGMENT_A = 0
SEGMENT_B = 0
SEGMENT_C = 0
SEGMENT_D = 0
SEGMENT_E = 0
SEGMENT_F = 0
SEGMENT_G = 1
CASE "h"
SEGMENT_A = 0
SEGMENT_B = 0
SEGMENT_C = 1
SEGMENT_D = 0
SEGMENT_E = 1
SEGMENT_F = 1
SEGMENT_G = 1
CASE "o"
SEGMENT_A = 0
SEGMENT_B = 0
SEGMENT_C = 1
SEGMENT_D = 1
SEGMENT_E = 1
SEGMENT_F = 0
SEGMENT_G = 1
CASE "b"
SEGMENT_A = 0
SEGMENT_B = 0
SEGMENT_C = 1
SEGMENT_D = 1
SEGMENT_E = 1
SEGMENT_F = 1
SEGMENT_G = 1
CASE " "
SEGMENT_A = 0
SEGMENT_B = 0
SEGMENT_C = 0
SEGMENT_D = 0
SEGMENT_E = 0
SEGMENT_F = 0
SEGMENT_G = 0
END SELECT
RETURN
INTCON.2=0
RESUME
ENABLE
'============================================================
END
PS: Remove .txt extension from attachament, for using in iSIS.
Bookmarks