Code:
@ DEVICE pic16F628A, XT_osc, WDT_OFF, PWRT_OFF, BOD_OFF, MCLR_ON, LVP_OFF
TRISA= %11111000 ' RA0..3=Outputs RA4=Input
TRISB= %00001111 ' RB0..RB2=Inputs, RB3..RB7=Outputs
CMCON=7 ' Disable comparators
OPTION_REG=%00000111
DEFINE LCD_DREG PORTB ' LCD on port B
DEFINE LCD_DBIT 4 ' Data bits B4..B7
DEFINE LCD_RSREG PORTA ' RS on PORTA
DEFINE LCD_RSBIT 1 ' RS on A1
DEFINE LCD_EREG PORTA ' E on PORTA
DEFINE LCD_EBIT 0 ' E on A0
DEFINE LCD_BITS 4 ' LCD 4 bit mode
DEFINE LCD_LINES 2 ' 2 line LCD display
TempC var word
Float var word
Sign var bit ' +/- sign
DQ var PORTA.4 ' One-wire data pin
TempC2 var word
Float2 var word
Sign2 var BIT ' +/- sign
DQ2 var PORTA.3 ' One-wire data pin
Delay var byte
Mode var byte
semn var word
semn2 var word
DS18B20_1_12bit CON %01111111 ; 750ms, 0.0625°C (default)
DS18B20_2_12bit CON %01111111 ; 750ms, 0.0625°C (default)
Ticks var byte ; Tick count (61 ticks=1 sec)
Hour var byte ; Hour variable
Minute var byte ; Minute variable
Second var byte ; Second variable
ZIUA var byte
LUNA var byte
Disp var byte ; Disp=1 to update display
PAUSE 500 ; Wait 0.5sec for LCD to initialize
Hour=0 : Minute=0 : Second=0
Ticks=0 : ZIUA=01 : LUNA=01
OPTION_REG=$05 ; Set prescaler
ON INTERRUPT GOTO ISR ; ISR routine
INTCON=$A0 ; Enable TMR
LCDOUT $FE, 1 ; Clear LCD
' Init Sensor 1
OWOUT DQ, 1, [$CC, $4E, 0, 0, DS18B20_1_12bit]
OWOut DQ, 1, [$CC, $48]
OWOut DQ, 1, [$CC, $B8]
OWOut DQ, 1, [$CC, $BE]
Pause 50
OWIn DQ, 2, [TempC.byte0, TempC.byte1]
Pause 50
' Init Sensor 2
OWOUT DQ2, 1, [$CC, $4E, 0, 0, DS18B20_2_12bit]
OWOut DQ2, 1, [$CC, $48]
OWOut DQ2, 1, [$CC, $B8]
OWOut DQ2, 1, [$CC, $BE]
Pause 50
OWIn DQ2, 2, [TempC2.byte0, TempC2.byte1]
Pause 50
LOOP:
If PORTB.0=0 then ' Mode switch preSeconded
Pause 50 ' Debounce
LcdOut $FE, 1
LcdOut $FE, $C0, " SETTING" ' Show that coMinuteand is accepted
PAUSE 500
LcdOut $FE, 1
If PORTB.0=0 then Loop ' Wait until button is released
Mode=Mode+1 ' Increment mode
ENDIF
If Mode=1 then ' SET HOUR
LcdOut $FE, $80, dec2 Hour
LcdOut $FE, $C0, "HOUR SETTING"
if portb.1=0 then
Hour=Hour+1
IF Hour=24 then
Hour=0
ENDIF
Gosub Debounce
endif
if portb.2=0 then
IF Hour = 0 then
Hour=24
ENDIF
Hour=Hour-1
Gosub Debounce
endif
EndIf
If Mode=2 then ' SET MINUTES
LcdOut $FE, $80, dec2 Hour,":",dec2 Minute
LcdOut $FE, $C0, "MINUTES SETTING"
if portb.1=0 then
Second=0
Minute=Minute+1
IF Minute=60 THEN
Minute=0
ENDIF
Gosub Debounce
endif
if portb.2=0 then
Second=0
IF Minute =<0 THEN
Minute=60
ENDIF
Minute=Minute-1
Gosub Debounce
endif
EndIf
If Mode=3 then ' SET DAY
LcdOut $FE, $80, dec2 Hour,":",dec2 Minute,":",dec2 Second," ",DEC2 ZIUA,"/"
LcdOut $FE, $C0, "DAY SETTING"
if portb.1=0 then
ziua=ziua+1
IF LUNA=2 THEN
IF ZIUA > 28 THEN
ZIUA=1
ENDIF
ENDIF
IF LUNA=4 OR LUNA=6 OR LUNA=9 OR LUNA=11 THEN
IF ZIUA > 30 THEN ZIUA=1
ELSE
IF ZIUA > 31 THEN ZIUA=1
ENDIF
Gosub Debounce
endif
if portb.2=0 then
ZIUA=ZIUA-1
IF ZIUA = 0 THEN ZIUA=31
Gosub Debounce
endif
EndIf
If Mode=4 then ' SET MONTH
LcdOut $FE, $80, dec2 Hour,":",dec2 Minute,":",dec2 Second," ",DEC2 ZIUA,"/",DEC2 LUNA
LcdOut $FE, $C0, "MONTH SETTING"
if portb.1=0 then
luna=luna+1
if luna>12 then
luna=1
endif
Gosub Debounce
endif
if portb.2=0 then
luna=luna-1
if luna<1 then
luna=12
endif
Gosub Debounce
endif
EndIf
If Mode > 4 then
LCDOUT $FE, $C0, "END SETTING"
PAUSE 1000
LCDOUT $FE, 1, $FE, $0C
mode=0
EndIf
If Mode > 0 then Loop
IF Disp=1 THEN
LcdOut $FE, $80, DEC2 Hour, ":",DEC2 Minute, ":",DEC2 Second," ",DEC2 ZIUA,"/",DEC2 LUNA
LCDOUT $FE, $C0, semn,DEC ABS TempC/100,".", DEC1 ABS TempC/10, 223,"C ", $FE, $C0 + 9, semn2,DEC ABS TempC2/100,".", DEC1 ABS TempC2/10, 223,"C "
Disp=0
ENDIF
GOTO LOOP
DISABLE
ISR:
Ticks=Ticks + 1
IF Ticks < 61 THEN NoUpdate
Ticks=0
Second=Second + 1 ; Update second
IF Second=60 THEN
Second=0
Minute=Minute + 1 ; Update Minute
IF Minute=60 THEN
Minute=0
Hour=Hour + 1 ; Update Hour
IF Hour=24 THEN
Hour=0
ZIUA=ZIUA+1
IF LUNA=2 THEN
IF ZIUA > 28 THEN
ZIUA=1
LUNA=3
ENDIF
ENDIF
IF LUNA=4 OR LUNA=6 OR LUNA=9 OR LUNA=11 THEN
IF ZIUA > 30 THEN
ZIUA=1
LUNA=LUNA+1
ENDIF
ENDIF
IF LUNA=1 OR LUNA=3 OR LUNA=5 OR LUNA=7 OR LUNA=8 OR LUNA=10 THEN
IF ZIUA > 31 THEN
ZIUA=1
LUNA=LUNA+1
ENDIF
ENDIF
IF LUNA=12 THEN
IF ZIUA > 31 THEN
ZIUA=1
LUNA=1
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
Disp=1 ; Set to update display
Gosub Read_temp
NoUpdate:
INTCON.2=0 ; Re-enable TMR0 interrupts
Resume
ENABLE ; Re-enable interrupts
END
;=================================
;Subrutine
Debounce:
FOR Delay=1 To 200
Pause 1 ; Delay 1ms inside a loop. This way,
NEXT Delay ; timer interrupts are not stopped
Disp=1 ; Set display flag to 1
RETURN
;==================================
Read_Temp:
OWOut DQ, 1, [$CC, $44]
OWOut DQ, 1, [$CC, $BE]
OWIn DQ, 2, [TempC.byte0, TempC.byte1]
Sign = TempC.15
TempC = ABS(TempC)
TempC = ((TempC >> 4)*100) + ((TempC & $F)*100 >> 4)
IF Sign THEN TempC = -TempC
IF TempC.15 THEN
Semn="-"
else
Semn="+"
endif
OWOut DQ2, 1, [$CC, $44]
OWOut DQ2, 1, [$CC, $BE]
OWIn DQ2, 2, [TempC2.byte0, TempC2.byte1]
Sign2 = TempC2.15
TempC2 = ABS(TempC2)
TempC2 = ((TempC2 >> 4)*100) + ((TempC2 & $F)*100 >> 4)
IF Sign2 THEN TempC2 = -TempC2
IF TempC2.15 THEN
Semn2="-"
else
Semn2="+"
endif
Return
;=====================================
END ; End of program
Bookmarks