Hi,
Thanks for your help... The following code works fine for just hours and minutes.
Posted here for reference should anyone else need this.
18F4520 - running with a 20mhz crystal - 4x20 LCD
Code:
ASM
__CONFIG _CONFIG1H, _OSC_HSPLL_1H
__CONFIG _CONFIG2L, _PWRT_ON_2L
__CONFIG _CONFIG2H, _WDT_ON_2H & _WDTPS_512_2H
__CONFIG _CONFIG3H, _MCLRE_ON_3H & _LPT1OSC_OFF_3H & _PBADEN_OFF_3H
__CONFIG _CONFIG4L, _LVP_OFF_4L & _XINST_OFF_4L
ENDASM
DEFINE OSC 48 ; config settings 18F4580, 20mhz crystal
ADCON1 = $0F
clear
RTCMin var byte ' Minutes
RTCHour var byte ' Hours
RTCCtrl var byte ' Control
SCLpin var PORTC.3 ' RTC pin - clk
SDApin var PORTC.4 ' RTC pin - data
Hours var byte
Minutes var byte
CounterA var byte ' General purpose Variable
CounterB var byte ' General purpose Variable
CounterC var byte ' General purpose Variable
CounterD var byte ' General purpose Variable
SetMN var byte ' Minutes
SetHR var byte ' Hours
'analog settings
ADCON0 = 0 'Set ADCON0
ADCON1 = %00001111 'Set D i/o
CMCON = 7 'Disable Comparators
PR2 = 249
'****************************************************************
'Port settings
CCP1CON = %00001100 '
CCP2CON = %00001100 '
TRISA = %11101111 'set PORTA as all output apart from 0,1,2
TRISB = %00000011
TRISD = %00000011 'set PORTB as all output apart from 0&1
DEFINE LCD_DREG PORTB ' LCD Data port
DEFINE LCD_DBIT 0 ' starting Data bit (0 or 4)
DEFINE LCD_EREG PORTB ' LCD Enable port
DEFINE LCD_EBIT 5 ' Enable bit (on EasyPIC 5 LCD)
DEFINE LCD_RSREG PORTB ' LCD Register Select port
DEFINE LCD_RSBIT 4 ' Register Select bit (on EasyPIC 5 LCD)
DEFINE LCD_BITS 4 ' LCD bus size (4 or 8 bits)
DEFINE LCD_LINES 4 ' number of lines on LCD
DEFINE LCD_COMMANDUS 2000 ' Command delay time in us
DEFINE LCD_DATAUS 50 ' Data delay time in us
setHR = 12
setMN = 01
' Save Minutes
' ------------
CounterA=SetMN
Gosub ConvertBCD
RTCMin=CounterB
'
' Save Seconds
' ------------
CounterA=SetHR
Gosub ConvertBCD
RTCHour=CounterB
I2cwrite SDApin,SCLpin,$D0,$01,[RTCMin,RTCHour] ; read DS1307 chip
main:
I2CREAD SDApin,SCLpin,$D0,$01,[RTCMin,RTCHour] ; read DS1307 chip
LCDOut $FE,$80
If RTCHour.6=1 then
CounterA=(RTCHour>>4)&$01 ' Work-Out 12 or 24 hour Display for Hours
else
CounterA=(RTCHour>>4)&$03
endif
CounterA=CounterA*10+(RTCHour&$0F) ' Display Hours appropriately for 12 or 24 hour Mode
If RTCHour.6=1 then
LCDOut $FE,$D4,#CounterA
else
LCDOut $FE,$D4,#CounterA Dig 1,#CounterA Dig 0
endif
LCDOut ":",#(RTCMin>>4)&$0F,#RTCMin&$0F," "
Goto main
ConvertBCD:
CounterB=CounterA DIG 1 ' CounterA is the entry variable
CounterB=CounterB<<4 ' CounterB holds the converted BCD result on exit
CounterB=CounterB+CounterA DIG 0
Return
It's all rough and ready... now to convert the Hours and minutes into the value for a counter and try this in my next version of aquarium lighting
Thanks for your contribution - steep learning curve but I'm getting there
Bookmarks