I've directly given the registers the bcd values and monitored the bcd value of the register as it changes but it still increase's the tens of the hours by 4 when seconds=40, i have not addressed the unused bits in the registers, so i cannot see it being that.

i am lost for ideas



Code:
 @ device  pic16f870,WDT_OFF            'Watch Dog Timer Disabled
 @ device  pic16f870,PROTECT_OFF        'Code Protect Off
 @ device  pic16f870,XT_OSC             'Using External Oscillator
 @ device  pic16f870,BOD_OFF            'Brown Out Timer Disabled 
 @ device  pic16f870,PWRT_OFF           'Power On Timer Disabled
 @ device  pic16f870,LVP_OFF            'Low Voltage Programmed Disabled
 
DEFINE OSC 4
ADCON0.0=0
ADCON1=7 ' ALL PINS SET TO DIGITAL
TRISB = %00000000
TRISA = %00000000
TRISC.0=0


 
 
 'rtc pins

clk_pin var portc.5 
data_pin var portc.6

number var  word
display VAR PORTB
segment var PORTA
seg_number var byte
digit var byte
delay var word




'register address's 

 reg_seconds        CON  $02
 reg_minutes        con  $03
 reg_hours          con  $04
 reg_days           con  $05
 reg_weekdays       con  $06
 reg_months_century con  $07
 reg_years          con  $08
 reg_minute_alarm   con  $09
 reg_hour_alarm     con  $0A
 reg_day_alarm      con  $0B
 reg_weekday_alarm  con  $0C
 
 rtc_write var byte 
 rtc_read  var byte
 
 rtc_write=$a2
 rtc_read=$a3 
 
 
 
 'time variables
 
 bcdseconds var BYTE
 bcdminutes var BYTE
 bcdhours  var BYTE
 bcddays  var BYTE
 bcdyears var BYTE
  
 
 seconds var BYTE
 minutes var BYTE
 hours var BYTE
 days var BYTE
 years var BYTE
 
  
  
 '-----------------------------------------------------
  'initial time variable values
  
  seconds=%0100011 
  minutes=%0100011
  hours=%100011
 'days=23
 'years=7 
 
' -------------------------------------------------------

'write intial variable's to the relevant rtc registers  

init:

'bcd_encode:

'bcdseconds=seconds dig 1
'bcdseconds=bcdseconds<<4
'bcdseconds=bcdseconds+seconds dig 0

'bcdminutes=minutes dig 1
'bcdminutes=bcdminutes <<4
'bcdminutes=bcdminutes+minutes dig 0

'bcdhours=hours dig 1
'bcdhours=bcdhours<<4
'bcdhours=bcdhours+hours dig 0



pause 10  

I2CWrite data_pin,clk_pin,$A2,reg_seconds,[seconds,minutes,hours]
pause 100


clock_read:  


I2CRead data_pin,clk_pin,$A2,reg_seconds,[bcdseconds,bcdminutes,bcdhours]
pause 10

'bcd_decode:  'decodes bcd to decimal

'seconds=(bcdseconds>>4)*10+(bcdseconds & %00001111) 

'minutes=(bcdminutes>>4)*10+(bcdminutes & %00001111)

'hours=(bcdhours>>4)*10+(bcdhours & %00001111)




OUT:
pause 20
serout2 portc.1,16780,["(",HEX bcdhours,")","(",HEX bcdminutes,")","(",HEX bcdseconds,")"]
PORTC.0=1
PAUSE 100
PORTC.0=0


goto clock_read