include "sht11.inc"

;****************************
;*							*
;*							*
;*							*
;****************************
Sht11Inicializa
	bsf		STATUS, RP0				; register page 1
	bcf		SHT11_TRIS, SHT11_CLK	; SHT11_CLK es salida
	bsf		SHT11_TRIS, SHT11_DATA	; SHT11_DATA es entrada
	bcf		STATUS, RP0				; register page 0

	bcf		SHT11_PORT, SHT11_CLK	; a cero
	bsf		SHT11_PORT, SHT11_DATA	; a uno???

	clrf	HUMEDAD1
	clrf	HUMEDAD2
	clrf	TEMPERATURA1
	clrf	TEMPERATURA2

	return

;****************************
;*							*
;*							*
;*							*
;****************************
Sht11GetTemperatura
	call	Sht11TxStart
	movlw	0x03
	movwf	SHT11_COMMAND
	call	Sht11SendCommand2

	call	Sht11Read2Bytes
	;bcf		PORTB, 3

	call	Sht11ConvierteTemperatura

	return

;****************************
;*							*
;*							*
;*							*
;****************************
Sht11GetHumedad
	call	Sht11TxStart
	movlw	0x05
	movwf	SHT11_COMMAND
	call	Sht11SendCommand

	call	Sht11Read2Bytes
	;bcf		PORTB, 3

	call	Sht11ConvierteHumedad

	return

;****************************
;*							*
;*							*
;*							*
;****************************
Sht11TxStart
	bsf		STATUS, RP0				; register page 1
	bcf		SHT11_TRIS, SHT11_DATA	; SHT11_DATA es salida
	bcf		STATUS, RP0				; register page 0

	bsf		SHT11_PORT, SHT11_CLK
	bcf		SHT11_PORT, SHT11_DATA
	bcf		SHT11_PORT, SHT11_CLK
	nop

	bsf		SHT11_PORT, SHT11_CLK
	bsf		SHT11_PORT, SHT11_DATA
	bcf		SHT11_PORT, SHT11_CLK

	return

;****************************
;*							*
;*							*
;*							*
;****************************
Sht11SendCommand
	movlw	7
	movwf	SHT11_BITCOUNT

data_out
	bcf		SHT11_PORT, SHT11_DATA
	btfsc	SHT11_COMMAND, 7
	bsf		SHT11_PORT, SHT11_DATA

	nop

	bsf		SHT11_PORT, SHT11_CLK
	rlf		SHT11_COMMAND, F
	bcf		SHT11_PORT, SHT11_CLK

	decfsz	SHT11_BITCOUNT
	goto	data_out

	bcf		SHT11_PORT, SHT11_DATA
	btfsc	SHT11_COMMAND, 7
	bsf		SHT11_PORT, SHT11_DATA

	nop

	bsf		SHT11_PORT, SHT11_CLK

	bsf		STATUS, RP0				; register page 1
	bsf		SHT11_TRIS, SHT11_DATA	; SHT11_DATA es entrada
	bcf		STATUS, RP0				; register page 0

	bcf		SHT11_PORT, SHT11_CLK

	call	Sht11EsperaAck

	return

;****************************
;*							*
;*							*
;*							*
;****************************
Sht11Read2Bytes
	btfsc	SHT11_PORT, SHT11_DATA
	goto	Sht11Read2Bytes

	;bsf PORTB, 3

	movlw 8
	movwf SHT11_BITCOUNT

high_byte
	rlf		SHT11_READ2, F
	bcf		SHT11_READ2, 0
	bsf		SHT11_PORT, SHT11_CLK

	btfsc	SHT11_PORT, SHT11_DATA
	bsf		SHT11_READ2, 0

	bcf		SHT11_PORT, SHT11_CLK

	decfsz	SHT11_BITCOUNT, F
	goto	high_byte

	bsf		STATUS, RP0				; register page 1
	bcf		SHT11_TRIS, SHT11_DATA	; SHT11_DATA es salida
	bcf		STATUS, RP0				; register page 0

	bcf		SHT11_PORT, SHT11_DATA
	nop
	bsf		SHT11_PORT, SHT11_CLK
	nop
	bcf		SHT11_PORT, SHT11_CLK
	
	bsf		STATUS, RP0				; register page 1
	bsf		SHT11_TRIS, SHT11_DATA	; SHT11_DATA es entrada
	bcf		STATUS, RP0				; register page 0

	movlw	8
	movwf	SHT11_BITCOUNT

low_byte
	rlf		SHT11_READ1, F
	bcf		SHT11_READ1, 0
	bsf		SHT11_PORT, SHT11_CLK

	btfsc	SHT11_PORT, SHT11_DATA
	bsf		SHT11_READ1, 0

	bcf		SHT11_PORT, SHT11_CLK

	decfsz	SHT11_BITCOUNT, F
	goto	low_byte

	bsf		STATUS, RP0				; register page 1
	bcf		SHT11_TRIS, SHT11_DATA	; SHT11_DATA es salida
	bcf		STATUS, RP0				; register page 0

	bsf		SHT11_PORT, SHT11_DATA
	nop
	bsf		SHT11_PORT, SHT11_CLK
	nop
	bcf		SHT11_PORT, SHT11_CLK

	return

;****************************
;*							*
;*							*
;*							*
;****************************
Sht11ConvierteTemperatura
	movlw	0xa0
	subwf	SHT11_READ1, W
	movwf	TEMPERATURA1

	movf	SHT11_READ2, W
	btfss	STATUS, C
	addlw	0 - 1
	movwf	TEMPERATURA2

	movlw	0x0f
	subwf	TEMPERATURA2, F

	return

;****************************
;*							*
;*							*
;*							*
;****************************
Sht11ConvierteHumedad
	movf	SHT11_READ1, W
	movwf	HUMEDAD1

	movf	SHT11_READ2, W
	movwf	HUMEDAD2

	bcf		STATUS, C
	rrf		HUMEDAD2, F
	rrf		HUMEDAD2

	bcf		STATUS, C
	rrf		HUMEDAD2, F
	rrf		HUMEDAD2

	bcf		STATUS, C
	rrf		HUMEDAD2, F
	rrf		HUMEDAD2

	bcf		STATUS, C
	rrf		HUMEDAD2, F
	rrf		HUMEDAD2

	bcf		STATUS, C
	rrf		HUMEDAD2, F
	rrf		HUMEDAD2

	return

;****************************
;*							*
;*							*
;*							*
;****************************
Sht11EsperaAck
	bsf		SHT11_PORT, SHT11_CLK
	nop
	bcf		SHT11_PORT, SHT11_CLK

	return






;****************************
;*							*
;*							*
;*							*
;****************************
Sht11GetByte
	clrf	SHT11_BYTE

	movlw	8
	movwf	SHT11_COUNTER

get_byte_loop
	bsf		SHT11_PORT, SHT11_CLK
	btfss	SHT11_PORT, SHT11_DATA
	goto	get_zero_bit
	bsf		SHT11_BYTE, 0
	goto	got_bit

get_zero_bit
	bsf		SHT11_BYTE, 0

got_bit
	bcf		SHT11_PORT, SHT11_CLK
	decfsz	SHT11_COUNTER, F
	goto	next_bit
	goto	byte_done

next_bit
	rlf		SHT11_BYTE, F
	goto	get_byte_loop

byte_done
	return

;****************************
;*							*
;*							*
;*							*
;****************************
Sht11SendAck
	bsf		STATUS, RP0
	bcf		SHT11_TRIS, SHT11_DATA	; output
	bcf		STATUS, RP0

	bcf		SHT11_PORT, SHT11_DATA
	bsf		SHT11_PORT, SHT11_CLK
	bcf		SHT11_PORT, SHT11_CLK

	bsf		STATUS, RP0
	bsf		SHT11_TRIS, SHT11_DATA	; input
	bcf		STATUS, RP0
	return
	
;****************************
;*							*
;*							*
;*							*
;****************************
Sht11SendCommand2
	bsf		STATUS, RP0
	bcf		SHT11_TRIS, SHT11_DATA	; output
	bcf		STATUS, RP0
	
	bcf		SHT11_PORT, SHT11_CLK

	; connection reset
	bsf		SHT11_PORT, SHT11_DATA
	bsf		SHT11_PORT, SHT11_CLK
	bcf		SHT11_PORT, SHT11_CLK

	bsf		SHT11_PORT, SHT11_CLK
	bcf		SHT11_PORT, SHT11_CLK

	bsf		SHT11_PORT, SHT11_CLK
	bcf		SHT11_PORT, SHT11_CLK

	bsf		SHT11_PORT, SHT11_CLK
	bcf		SHT11_PORT, SHT11_CLK

	bsf		SHT11_PORT, SHT11_CLK
	bcf		SHT11_PORT, SHT11_CLK

	bsf		SHT11_PORT, SHT11_CLK
	bcf		SHT11_PORT, SHT11_CLK

	bsf		SHT11_PORT, SHT11_CLK
	bcf		SHT11_PORT, SHT11_CLK

	bsf		SHT11_PORT, SHT11_CLK
	bcf		SHT11_PORT, SHT11_CLK

	bsf		SHT11_PORT, SHT11_CLK
	bcf		SHT11_PORT, SHT11_CLK

	bsf		SHT11_PORT, SHT11_CLK
	bcf		SHT11_PORT, SHT11_CLK

	; transmission start
	bsf		SHT11_PORT, SHT11_DATA
	bsf		SHT11_PORT, SHT11_CLK

	bcf		SHT11_PORT, SHT11_DATA
	bcf		SHT11_PORT, SHT11_CLK
	bsf		SHT11_PORT, SHT11_CLK

	bsf		SHT11_PORT, SHT11_DATA

	movlw	8
	movwf	SHT11_BITCOUNT

send_bit_loop
	bcf		SHT11_PORT, SHT11_CLK
	btfss	SHT11_COMMAND, 7
	goto	SHT11SendZero
	bsf		SHT11_PORT, SHT11_DATA
	goto	SHT11SendBit

SHT11SendZero
	bcf		SHT11_PORT, SHT11_DATA

SHT11SendBit
	bsf		SHT11_PORT, SHT11_CLK
	rlf		SHT11_COMMAND, F
	decfsz	SHT11_BITCOUNT, F
	goto	send_bit_loop

	bcf		SHT11_PORT, SHT11_CLK
	
	bsf		STATUS, RP0
	bsf		SHT11_TRIS, SHT11_DATA	; input
	bcf		STATUS, RP0
	
	; ack
	bsf		SHT11_PORT, SHT11_CLK

wait_ack
	btfss	SHT11_PORT, SHT11_DATA ; deberia ser 0?
	goto	got_ack

	movlw   LCD_SET_DDRAM | LCD_ROW_0 | LCD_COL_0
	call    LcdWriteCommand
	movlw	'0'
	call    LcdWriteData
	return

got_ack
	bcf		SHT11_PORT, SHT11_CLK

	movlw	255
	movwf	SHT11_COUNTER

wait_data
	btfss	SHT11_PORT, SHT11_DATA
	goto	data_ready
	movlw   LCD_SET_DDRAM | LCD_ROW_0 | LCD_COL_1
	call    LcdWriteCommand
	movlw	'1'
	call    LcdWriteData
	return

data_ready
	call	Sht11GetByte
	movf	SHT11_BYTE, W
	movwf	TEMPERATURA1
	call	Sht11SendAck

	call	Sht11GetByte
	movf	SHT11_BYTE, W
	movwf	TEMPERATURA2
	call	Sht11SendAck

	call	Sht11GetByte

	return











