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
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 lightingCode: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
Thanks for your contribution - steep learning curve but I'm getting there![]()





Bookmarks