It's beyond on my understanding and mental capabilities
...
Code:
; Termometru 7 segmente
'======================================================================================
;@ DEVICE pic16F628A, intOSC_osc_noclkout, WDT_OFF, PWRT_ON, MCLR_OFF, LVP_OFF, CPD_OFF
DEFINE OSC 4
CMCON = 7
VRCON = 0
INTCON = 0
Common_4 VAR PORTA.0
Common_3 VAR PORTA.1
Common_2 VAR PORTA.2
Common_1 VAR PORTA.3
DP VAR PORTB.7
Temp Var byte
Temperature Var Word
TempC Var Word
I Var Byte
Sign Var Word
Float Var Word
V Var Word
Dummy Var Byte
Busy Var Bit
DIGIT_0 VAR BYTE
DIGIT_1 VAR BYTE
DIGIT_2 VAR BYTE
DIGIT_3 VAR BYTE
digit Var BYTE
DQ VAR PORTA.4
DQ_DIR var TRISA.4
command var byte
pis var byte
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
INCLUDE "DT_INTS-14.bas" ' Base Interrupt System
INCLUDE "ReEnterPBP.bas" ' Include if using PBP interrupts
ASM
INT_LIST macro ; IntSource, Label, Type, ResetFlag?
INT_Handler TMR1_INT, _show, PBP, yes
endm
INT_CREATE ; Creates the interrupt processor
ENDASM
T1CON = $31 ; Prescaler=8, TMR1ON
@ INT_ENABLE TMR1_INT ; enable Timer 1 interrupts
'======================================================================================
Gosub init1820 ' Init the DS1820
command = $cc ' Issue Skip ROM command
Gosub write1820
command = $44 ' Start temperature conversion
Gosub write1820
Gosub init1820 ' Do another init
command = $cc ' Issue Skip ROM command
Gosub write1820
MainLOOP:
command = $be ' Read the temperature
Gosub write1820
Gosub read1820
TEMPERATURE = ((tempERATURE>> 1)*100)+((TEMPERATURE.0*5)*10)
Gosub Selectie
Goto MainLOOP
'======================================================================================
Selectie :
IF sign ="-" then
DIGIT_3="-"
else
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
'======================================================================================
show:
for i=0 to 4
TEMP = DIGIT_3 : gosub segments
COMMON_1 = 1 : PAUSE 1 : COMMON_1 = 0
TEMP = DIGIT_2 : GOSUB segments
COMMON_2 = 1 : PAUSE 1 : COMMON_2 = 0
TEMP = DIGIT_1 : GOSUB segments
COMMON_3 = 1 : DP = 0 : PAUSE 1 : COMMON_3 = 0 : DP = 1
TEMP = DIGIT_0 : GOSUB segments
COMMON_4 = 1 : PAUSE 1 : COMMON_4 = 0
next i
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
@ INT_RETURN
'======================================================================================
' Initialize DS1820 and check for presence
init1820:
Low DQ ' Set the data pin low to init
Pauseus 500 ' Wait > 480us
DQ_DIR = 1 ' Release data pin (set to input for high)
Pauseus 100 ' Wait > 60us
If DQ = 1 Then
Pause 500
Goto mainLOOP ' Try again
Endif
Pauseus 400 ' Wait for end of presence pulse
Return
' Write "command" byte to the DS1820
write1820:
For pis = 1 To 8 ' 8 bits to a byte
If command.0 = 0 Then
Gosub write0 ' Write a 0 bit
Else
Gosub write1 ' Write a 1 bit
Endif
command = command >> 1 ' Shift to next bit
Next pis
Return
' Write a 0 bit to the DS1820
write0:
Low DQ
Pauseus 60 ' Low for > 60us for 0
DQ_DIR = 1 ' Release data pin (set to input for high)
Return
' Write a 1 bit to the DS1820
write1:
Low DQ ' Low for < 15us for 1
@ nop ' Delay 1us at 4MHz
DQ_DIR = 1 ' Release data pin (set to input for high)
Pauseus 60 ' Use up rest of time slot
Return
' Read temperature from the DS1820
read1820:
For pis = 1 To 16 ' 16 bits to a word
temperature = temperature >> 1 ' Shift down bits
Gosub readbit ' Get the bit to the top of temp
Next pis
If Temperature.15 then
Temperature= ~Temperature +1
Sign = 1
Endif
Return
' Read a bit from the DS1820
readbit:
temperature.15 = 1 ' Preset read bit to 1
Low DQ ' Start the time slot
@ nop ' Delay 1us at 4MHz
DQ_DIR = 1 ' Release data pin (set to input for high)
If DQ = 0 Then
temperature.15 = 0 ' Set bit to 0
Endif
Pauseus 60 ' Wait out rest of time slot
Return
end
ERROR Line 23: Redefinition of VAR. (DT_INTS-14.bas) ?!?
Can not be done a simple termometer with LED display ?
Bookmarks