;DS16B20.asm
;programa para leer temperatura con el sensor DS18B20 mediante la
;subrutina Tempe que se encuentra en el programa 
;DS18B20.inc, para salida en LCD 16 x 1

	processor 16f84
	include	  <p16f84.inc>
	__config  _XT_OSC & _WDT_OFF & _PWRTE_ON

	CBLOCK	0XC
	Digito1
	Digito2
	Punto
	Digito3
	ENDC

#DEFINE	BANCO0	BCF	STATUS,RP0
#DEFINE	BANCO1	BSF	STATUS,RP0
#DEFINE	RS	PORTA,1
#DEFINE	EN	PORTA,2
#DEFINE	PUERTO	PORTB

eight	equ	H'38'	;constantes usadas en LCD
clear	equ	H'01'
home	equ	H'03'
cursor	equ	H'0F'
renglon1	equ 	H'80'
renglon2	equ 	H'C0'
SinCurso	equ	H'0c'

LCD	MACRO		;INICIALIZA LCD
	BANCO1
	bcf	RS
	bcf	EN
	movlw	0x0
	movwf	PUERTO
	BANCO0
	bcf	RS
	bcf	EN
	movlw	eight		;envía 5 comandos
	call 	puco
	movlw	clear
	call 	puco
	movlw	home
	call 	puco
	movlw	cursor
	call 	puco
	movlw	renglon1		
	call	puco
	ENDM

SEGREN	MACRO		;inicializa lcd para
	BANCO1		;segundo renglon
	bcf	RS
	bcf	EN
	movlw	0x0
	movwf	PUERTO
	BANCO0
	bcf	RS
	bcf	EN
	movlw	eight
	call 	puco
	movlw	SinCurso	;sin cursor
	call 	puco
	movlw	renglon2		
	call	puco
	ENDM

	org	0
	goto	Inicio

Mensaje	addwf	PCL,F
MenTe	DT "TEMPE =",0X00
Grado	DT h'd6',"C" ,0X00 ;caracteres °, y C 
			 ;0xd6 = 214
Inicio	btfsc	R_Band,2
	goto	SeRe
	LCD
	goto	Salud
SeRe	SEGREN
Salud	call	Tempe
	call	Desple
	goto	cabo

Desple	LCD
	movlw	MenTe
	call	LCDMen
	SEGREN
	btfsc	R_Band,0	; es Neg?
	goto	EsPos
EsNeg	movlw	menos
	call	puda
EsPos
	;movf	R_Cen,w
	;movwf	PORTB
	;call	puda
Decenas	movf	Digito1,w
	movwf	PORTB
	call	puda
Unidade	movf	Digito2,w
	movwf	PORTB
	call	puda
	btfsc	R_Band,1	;si esta bandera es 1 hay fraccion
	call	DeFrac
	goto	Nomas
DeFrac	movlw	punto	;se pone solo si hay fraccion
	call	puda
	movfw	Digito3	;si existe es un 5
	call	puda
	movlw	blanco
	call	puda
	movlw	Grado
	call	Celsius
	return
Nomas	movlw	blanco
	call	puda
	movlw	blanco
	call	puda
	movlw	blanco
	call	puda
	movlw	Grado
	call	Celsius
	return
LCDMen	movwf	R_Apunta
	movlw	Mensaje
	subwf	R_Apunta,f
	decf	R_Apunta,f
OtroCar	movf	R_Apunta,w
	call	Mensaje
	movwf	R_Valor
	movf	R_Valor,f
	btfsc	STATUS,Z
	goto	FinMen
NoUlti	call	puda
	incf	R_Apunta,f
	goto	OtroCar
FinMen	return

Celsius	movwf	R_Apunta
	movlw	Mensaje
	subwf	R_Apunta,f
	decf	R_Apunta,f
Mas	movf	R_Apunta,w
	call	Mensaje
	movwf	R_Valor
	movf	R_Valor,f
	btfsc	STATUS,Z
	goto	FinCel
Falta	call	puda
	incf	R_Apunta,f
	goto	Mas
FinCel	return

puco:	movwf	PORTB	;escribe comando en puertoB
	bcf	RS
	call	Habil
	call 	Ret50m	;50 milisegundos
	return
puda:	movwf	PORTB	;escribe dato en puertoB
	bsf	RS
	call	Habil
	call 	Ret50m	;50 milisegundos
	return
Habil	bsf	EN
	nop
	bcf	EN
	return

Visual	btfsc	R_Signo,0
	goto	cabo
SigMas	movfw	R_Dec
	movwf	PORTB
	call	puda
	return

cabo	call	Ret1s
	goto	Inicio

include	"DS18B20.inc"

	end
