Code:
@ DEVICE pic16F628A, XT_osc, WDT_OFF, PWRT_OFF, BOD_OFF, MCLR_ON, LVP_OFF, CPD_OFF, PROTECT_OFF ' for PBP 2.4
DEFINE OSC 4
INCLUDE "AllDigital.pbp"
TRISA= %11111000 ' RA0..3=Outputs RA4=Input
TRISB= %00001111 ' RB0..RB2=Inputs, RB3..RB7=Outputs
CMCON=7 ' Disable comparators
OPTION_REG=%00000111
INTCON=0
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
HzTimer Var Word
HH Var Byte
MM Var Byte
SS Var Byte
ZIUA VAR BYTE
LUNA VAR BYTE
X Var Byte
col Var Bit
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)
HzTimer = $7A12
HH=00 : MM=00 : SS=00 : ZIUA=01 : LUNA=01 : col=0 : Mode=0
Pause 500
LCDOUT $FE, 1, $FE, $0C ' Clear display, cursor off
Pause 100
'====================================
' Init Sensor 1
OWOUT DQ, 1, [$CC, $4E, 0, 0, DS18B20_1_12bit]
OWOut DQ, 1, [$CC, $48] ' Start temperature conversion
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] ' Start temperature conversion
OWOut DQ2, 1, [$CC, $B8]
OWOut DQ2, 1, [$CC, $BE]
Pause 50
OWIn DQ2, 2, [TempC2.byte0, TempC2.byte1]
Pause 50
OPTION_REG.7=1
TMR0=0
INTCON.2=0
'====================================
Pause 500
LCDOUT $FE, 1, $FE, $0C ' Clear display, cursor off
Pause 250
LCDOUT $FE, $80, " TERMO-CLOCK "
LcdOut $FE, $C0, "By NICULESCU DAN"
PAUSE 3000
LCDOUT $FE, 1, $FE, $0C
'====================================
MainLoop:
If PORTB.0=0 then ' Mode switch pressed
Pause 50 ' Debounce
LcdOut $FE, 1
LcdOut $FE, $C0, " SETTING" ' Show that command is accepted
PAUSE 500
LcdOut $FE, 1
If PORTB.0=0 then MainLoop ' Wait until button is released
Mode=Mode+1 ' Increment mode
ENDIF
If Mode=1 then ' SET HOUR
LcdOut $FE, $80, dec2 HH
LcdOut $FE, $C0, "HOUR SETTING"
if portb.1=0 then
HH=HH+1
IF HH=24 then
HH=0
ENDIF
Gosub Debounce
endif
if portb.2=0 then
IF HH = 0 then
HH=24
ENDIF
HH=HH-1
Gosub Debounce
endif
EndIf
If Mode=2 then ' SET MINUTES
LcdOut $FE, $80, dec2 HH,":",dec2 MM
LcdOut $FE, $C0, "MINUTES SETTING"
if portb.1=0 then
SS=0
MM=MM+1
IF MM=60 THEN
MM=0
ENDIF
Gosub Debounce
endif
if portb.2=0 then
SS=0
IF MM =<0 THEN
MM=60
ENDIF
MM=MM-1
Gosub Debounce
endif
EndIf
If Mode=3 then ' SET DAY
LcdOut $FE, $80, dec2 HH,":",dec2 MM,":",dec2 ss," ",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 HH,":",dec2 MM,":",dec2 ss," ",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 Mainloop
'====================================
Main :
ClockLoop : IF INTCON.2=0 THEN ClockLoop
INTCON.2=0
if portb.0=0 then Gosub MainLoop
HzTimer = HzTimer - $1000 'decrement timer
IF HzTimer<$1000 THEN
IF Col=1 THEN 'update time'
SS=SS+1
IF SS=60 THEN
SS=0
MM=MM+1
IF MM=60 THEN
MM=0
HH=HH+1
IF HH=24 THEN
HH=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
'==================================== display time with :
LcdOut $FE, $80, dec2 HH,":",dec2 MM,":",dec2 ss," ",DEC2 ZIUA,"/",DEC2 LUNA
ELSE
'==================================== display time without :
LcdOut $FE, $80, dec2 HH,":",dec2 MM," ",dec2 ss," ",DEC2 ZIUA,"/",DEC2 LUNA
ENDIF
Col=Col+1
HzTimer=HzTimer+$7A12
else
gosub ReadTemp
ENDIF
goto Main
' SUBROUTINES:
'====================================
ReadTemp:
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
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 "
Return
'====================================
Debounce :
For Delay= 1 to 200
Pause 1
next Delay
Return
'====================================
END ' Of program
and
Code:
@ DEVICE pic16F628A, XT_osc, WDT_OFF, PWRT_OFF, BOD_OFF, MCLR_ON, LVP_OFF
DEFINE OSC 4 ' using a 4MHz crystal
TRISA= %11111000 ' RA0..3=Outputs RA4=Input
TRISB= %00001111 ' RB0..RB2=Inputs, RB3..RB7=Outputs
DEFINE OSC 4 ' using a 4MHz crystal
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
DEFINE LCD_COMMANDUS 2000 ' Command delay time in us
DEFINE LCD_DATAUS 50 ' Data delay time in us
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)
' setup vars for clock
Time VAR BYTE ' accumulates TMR2 to PR2 match counts
Minutes VAR BYTE ' minutes
Hours VAR BYTE ' hours
Seconds VAR BYTE
Match VAR PIR1.1 ' TMR2 to PR2 match interrupt flag bit
CMCON = 7 ' disable comparators
INTCON = 0 ' not using interupts. Just monitoring int flag bits
Time = 0 ' clear TMR2 to PR2 match counter
Hours = 00 ' set clock starting hour here
Minutes = 00 ' set clock starting minutes here
Seconds = 0
PR2 = 249 ' 249 +1 extra cycle for TMR2 reset = 250*5*16*1uS=20mS
Match = 0 ' clear match flag
' setup & start TMR2
T2CON = %00100110 ' 1:5 postscale, 1:16 prescale, TMR2 on
Main:
' every 20mS the TMR2IF flag is set, and this routine is entered.
' Plenty of time to do other stuff.
IF Match THEN ' has TMR2 matched PR2? (should happen every 20mS)
Match = 0 ' yes. clear TMR2 to PR2 match flag bit
Time = Time + 1 ' increment 20mS count
IF Time = 50 THEN ' 50 x 20mS = 1 second
Time = 0 ' show time in 1 second intervals
LcdOut $FE, $80, DEC2 Hours, ":",DEC2 Minutes, ":",DEC2 Seconds,13,10
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 "
Gosub readtemp
Seconds = Seconds + 1
ENDIF
IF Seconds = 60 THEN ' has 60 seconds passed?
Seconds = 0
Minutes = Minutes + 1 ' increment minute count
IF Minutes = 60 THEN ' have 60 minutes passed?
Minutes = 0 ' yes. roll-over minutes 00
Hours = Hours + 1 ' update hours
IF Hours = 24 THEN Hours = 0 ' roll-over hours from 24 to 00
ENDIF ' end IF Minutes = 60
ENDIF ' end IF Seconds = 60
ENDIF ' end IF Match
GOTO Main
ReadTemp:
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
Sorry for long post... It's a proof of hard ( useless
Bookmarks