
#define	SCL	PORTB,4
#define	SDA	PORTB,5

RegTX	equ	020h
RegRX	equ	021h

;Registros usados en Tx y Rx. (11 en total)
Hora	equ	022h
Minuto	equ	023h
Segundo	equ	024h
Dia	equ	025h
Mes	equ	026h
Ano	equ	027h


Inic1307	; Genera condición de inicio
	bcf	SCL
	nop
	bsf	SDA
	bsf	SCL
	nop
	bcf	SDA
	nop
	return
	
Fina1307	; Genera condición de parada
	bcf	SCL
	nop
	bcf	SDA
	bsf	SCL
	nop
	bsf	SDA
	nop
	return
	
Esc1307	; Configura el DS1307 y actualiza la hora.
	movlw	b'11010000'
	movwf	RegTX
	call	Inic1307
	call	Env1307		;Puntero en 00
	clrf	RegTX
	call	Env1307
	movf	Segundo,W
	movwf	Temp
	movlw	HIGH BinBCD
	movwf	PCLATH
	call	BinBCD
	movf	Decena,W
	movwf	RegTX
	swapf	RegTX,f
	movf	Unidad,W
	andwf	RegTX,f
	bcf	RegTX,7
	call	Env1307
	clrf	RegTX
	movf	Minuto,W
	movwf	Temp
	movlw	HIGH BinBCD
	movwf	PCLATH
	call	BinBCD
	movf	Decena,W
	movwf	RegTX
	swapf	RegTX,f
	movf	Unidad,W
	andwf	RegTX,f
	call	Env1307
	clrf	RegTX
	movf	Hora,W
	movwf	Temp
	movlw	HIGH BinBCD
	movwf	PCLATH
	call	BinBCD
	movf	Decena,W
	movwf	RegTX
	swapf	RegTX,f
	movf	Unidad,W
	andwf	RegTX,f
	bcf	RegTX,6
	call	Env1307
	call	Fina1307
	movlw	b'11010000'
	movwf	RegTX
	call	Inic1307
	call	Env1307		;Puntero en 04 (Date), no se envian datos
	movlw	.4		;de dias de la semana.
	movwf	RegTX
	call	Env1307
	movf	Dia,W
	movwf	Temp
	movlw	HIGH BinBCD
	movwf	PCLATH
	call	BinBCD
	movf	Decena,W
	movwf	RegTX
	swapf	RegTX,f
	movf	Unidad,W
	andwf	RegTX,f
	call	Env1307
	clrf	RegTX
	movf	Mes,W
	movwf	Temp
	movlw	HIGH BinBCD
	movwf	PCLATH
	call	BinBCD
	movf	Decena,W
	movwf	RegTX
	swapf	RegTX,f
	movf	Unidad,W
	andwf	RegTX,f
	call	Env1307
	clrf	RegTX
	movf	Ano,W
	movwf	Temp
	movlw	HIGH BinBCD
	movwf	PCLATH
	call	BinBCD
	movf	Decena,W
	movwf	RegTX
	swapf	RegTX,f
	movf	Unidad,W
	andwf	RegTX,f
	call	Env1307
	call	Fina1307
	return
	
Env1307	movlw	08	; Envía un dato al 1307
	movwf	Cont1307
Rota1307	rlf	RegTX,f
	bcf	SCL
	bcf	SDA
	btfsc	STATUS,C
	bsf	SDA
	nop
	nop
	nop
	nop
	bsf	SCL
	clrwdt
	nop
	nop
	nop
	nop
	decfsz	Cont1307,f
	goto	Rota1307
	bcf	SCL
	bsf	STATUS,RP0
	bsf	SDA
	bcf	STATUS,RP0
	nop
	nop
	bsf	SCL
	clrwdt
	nop
	nop
	nop
	nop
	clrwdt
	bcf	SCL
	nop
	nop
	bsf	STATUS,RP0
	bcf	SDA
	bcf	STATUS,RP0
	return
	
Lee1307	; Prepara el 1307 para leer y recibe un dato
	bsf	STATUS,RP0
	bsf	SDA
	bcf	STATUS,RP0
	movlw	08
	movwf	Cont1307
Rotb1307	bcf	SCL
	nop
	nop
	clrwdt
	nop
	nop
	bsf	SCL
	nop
	bcf	STATUS,C
	btfsc	SDA
	bsf	STATUS,C
	rlf	RegRX,f
	decfsz	Cont1307,f
	goto	Rotb1307
	bsf	STATUS,RP0
	bcf	SDA
	bcf	STATUS,RP0
	bcf	SDA
	nop
	bsf	SCL
	nop
	nop
	clrwdt
	nop
	nop
	bsf	SDA
	nop
	return



;*************************************************************************
;Convierte un dato BCD de Unidades y decenas a un solo registro decimal.
	ORG	300h
Decimal	movlw	.6
	movwf	Conta1
	movlw	02Dh	;Registro de Decenas de hora
	movwf	FSR1
	movlw	022h	;Registro de horas.
	movwf	FSR2
Conver	movf	FSR1,W
	movwf	FSR
	movf	INDF,W
	movwf	Temp
	rlf	Temp,f
	rlf	Temp,f
	addwf	Temp,f
	rlf	Temp,f
	incf	FSR1,f
	movf	FSR1,W
	movwf	FSR
	movf	INDF,W
	addwf	Temp,f
	movf	FSR2,W
	movwf	FSR
	movf	Temp,w
	movwf	INDF
	clrwdt
	incf	FSR1,f
	incf	FSR2,f
	decfsz	Conta1,f
	goto	Conver
	return	
;*********************************
;Devuelve cada dato decimal en 2 digitos BCD Unidad y decena: (Tomado de 36s628 de AMK)

BinBCD	;bcf	INTCON,GIE
	movf	Temp,W
	movwf	Unidad
	clrf	Decena
;	movlw	7F
;	subwf	Unidad,w
;	btfsc	STATUS,C
;	call	Negativ
	movlw	64
	subwf	Unidad,w
	btfsc	STATUS,C
	goto	Supera
gtenth	movlw	.10
	subwf	Unidad,w
	btfss	STATUS,C
	goto	over
	movwf	Unidad
	incf	Decena,f
	goto	gtenth
over	bsf	INTCON,GIE
	return
Supera	movlw	0B
	movwf	Unidad
	movwf	Decena
	;bcf	INTCON,GIE
	return
;Negativ	movlw	0FF
;	xorwf	Unidad,f
;	movlw	1
;	addwf	Unidad,f
;	movlw	0A

;	movwf	Decena
;	bsf	INTCON,GIE
;	retlw	0
	


;Lee la hora actual.
Fecha	movlw	HIGH Inic1307
	movwf	PCLATH
	call	Inic1307
	movlw	b'11010000'
	movwf	RegTX
	movlw	HIGH Env1307
	movwf	PCLATH
	call	Env1307
	clrf	RegTX		;puntero en 00h
	movlw	HIGH Env1307
	movwf	PCLATH
	call	Env1307
	movlw	HIGH Fina1307
	movwf	PCLATH
	call	Fina1307
	movlw	b'11010001'
	movwf	RegTX
	movlw	HIGH Inic1307
	movwf	PCLATH
	call	Inic1307
	movlw	HIGH Env1307
	movwf	PCLATH
	call	Env1307
	movlw	HIGH Lee1307
	movwf	PCLATH
	call	Lee1307
	movf	RegRX,W
	andlw	b'11110000'
	movwf	DecSeg
	swapf	DecSeg,f
	movf	RegRX,W
	andlw	b'00001111'
	movwf	UniSeg
	movlw	HIGH Lee1307
	movwf	PCLATH
	call	Lee1307
	movf	RegRX,W
	andlw	b'11110000'
	movwf	DecMin
	swapf	DecMin,f
	movf	RegRX,W
	andlw	b'00001111'
	movwf	UniMin
	movlw	HIGH Lee1307
	movwf	PCLATH
	call	Lee1307
	movf	RegRX,W
	andlw	b'11110000'
	movwf	DecHor
	swapf	DecHor,f
	movf	RegRX,W
	andlw	b'00001111'
	movwf	UniHor
	movlw	HIGH Fina1307
	movwf	PCLATH
	call	Fina1307
	movlw	HIGH Inic1307
	movwf	PCLATH
	call	Inic1307
	movlw	b'11010000'
	movwf	RegTX
	movlw	HIGH Env1307
	movwf	PCLATH
	call	Env1307
	movlw	.4
	movwf	RegTX
	movlw	HIGH Env1307
	movwf	PCLATH
	call	Env1307
	movlw	HIGH Fina1307
	movwf	PCLATH
	call	Fina1307
	movlw	b'11010001'
	movwf	RegTX
	movlw	HIGH Inic1307
	movwf	PCLATH
	call	Inic1307
	movlw	HIGH Env1307
	movwf	PCLATH
	call	Env1307
	movlw	HIGH Lee1307
	movwf	PCLATH
	call	Lee1307
	movf	RegRX,W
	andlw	b'11110000'
	movwf	DecDia
	swapf	DecDia,f
	movf	RegRX,W
	andlw	b'00001111'
	movwf	UniDia
	movlw	HIGH Lee1307
	movwf	PCLATH
	call	Lee1307
	movf	RegRX,W
	andlw	b'11110000'
	movwf	DecMes
	swapf	DecMes,f
	movf	RegRX,W
	andlw	b'00001111'
	movwf	UniMes
	movlw	HIGH Lee1307
	movwf	PCLATH
	call	Lee1307
	movf	RegRX,W
	andlw	b'11110000'
	movwf	DecAno
	swapf	DecAno,f
	movf	RegRX,W
	andlw	b'00001111'
	movwf	UniAno
	call	Fina1307
	movlw	HIGH Decimal
	movwf	PCLATH
	call	Decimal
	return
	END
