Hola..aca dejo mi programa terminado con el cual puedo medir la Tº entre los 0 y 100ºC,por si a alguno le interesa,
si es asi y me ayudan a mejorarlo juntos mejor.Chau
;*****************************************************************************************************************
;Descripción *
;*****************************************************************************************************************
;Este programa visualiza en 3 display de 7 segmentos el valor de Tº en ºC entregado por el sensor LM335.
;Rango de operacion:(2,442V-5V),(0-100ºC),sensibilidad:1/4º
;*****************************************************************************************************************
;Definiciones,vectores,blokes,configuración de puertos y macros *
;*****************************************************************************************************************
list p=16f877
#include <p16f877.inc>
RADIX HEX
GO_DONE EQU 2 ;Indica si termino la conversión(0).
ADON EQU 0 ;Pone en marcha el modulo(1).
unidad EQU 20
decena EQU 21
centena EQU 22
DATO EQU 23
TIMER1 EQU 24
TEMPERATURA EQU 25
org 0
goto INICIO
BANCO0 macro
bcf STATUS,RP0
bcf STATUS,RP1
endm
BANCO1 macro
bsf STATUS,RP0
bcf STATUS,RP1
endm
BANCO2 macro
bcf STATUS,RP0
bsf STATUS,RP1
endm
BANCO3 macro
bsf STATUS,RP0
bsf STATUS,RP1
endm
#include <lcdiyda.lib> ;Rutina con los comandos de manejo del LCD.
;*****************************************************************************************************************
;Progama principal. *
;*****************************************************************************************************************
INICIO BANCO1
clrf TRISC
clrf TRISD
BANCO0
call TEMPO2 ;Espero hasta ke se estabilicen los voltajes.
movlw b'00000001'
call LCDI ;Rutina ke indica modo comando.
movlw b'00110000'
call LCDI
movlw b'00111000'
call LCDI
movlw b'00111100'
call LCDI
movlw b'00001100'
call LCDI
movlw b'00000110'
call LCDI
call TEMPO1 ;Fin de la inicialización del LCD.
clrf TEMPERATURA
STAR BANCO1
movlw b'00001101' ;RA0 es una entrada funcionará como AN0.
movwf TRISA ;RA1-5 funcionaran como entradas para las ref.
call T_ADQUISICIÓN
movlw b'10001111' ;Justificación a la derecha.
movwf ADCON1 ;RA0/AN0 y todo lo demás es I/O Digital.
BANCO0
movlw b'00000001' ;Pongo en marcha el modulo A/D y
movwf ADCON0 ;el canal analogo a emplear será AN0.
call T_ADQUISICIÓN
bsf ADCON0,GO_DONE ;El módulo A/D esta operativo
btfsc ADCON0,GO_DONE ;Ha finalizado la conversión?
goto $-1 ;No,espera.
movlw .0 ;Si.
subwf ADRESH,W
btfsc STATUS,Z
goto CUENTA_1 ;ADRESH=.0,o sea,Tº=(1/4.ADRESL)-29
movlw .1
subwf ADRESH,W
btfss STATUS,Z
goto Fuera_escala
CUENTA_2 bcf STATUS,C ;El carry siempre arranca en 1,lo borro pa' ke no joda.
BANCO1 ;ADRESH=.1,o sea,Tº=(1/4.ADRESL)+35
rrf ADRESL,W
bcf STATUS,C
BANCO0
movwf TEMPERATURA
rrf TEMPERATURA,W
bcf STATUS,C
addlw .35
movwf TEMPERATURA
call CONVERSION_II ;Descompone este registro en unidad,decena y centena
goto STAR ;y almacena estos datos en los registros del mismo nombre.
CUENTA_1 BANCO1
movlw .144
addwf ADRESL,W
btfss STATUS,C
goto Fuera_escala
movlw .0
subwf ADRESL,W
btfsc STATUS,Z
goto Fuera_escala ;La tensión medida es inferior a 2,73V.
bcf STATUS,C ;El carry siempre arranca en 1,lo borro pa' ke no joda.
rrf ADRESL,W
bcf STATUS,C
BANCO0
movwf TEMPERATURA
rrf TEMPERATURA,F
bcf STATUS,C
movlw .28 ;En realidad la ordenada=28,75
subwf TEMPERATURA,F
call CONVERSION_II
goto STAR
;*****************************************************************************************************************
;Subrutinas *
;*****************************************************************************************************************
CONVERSION_II BANCO0
clrf unidad
clrf decena
clrf centena
CENTENAS movlw .100
subwf TEMPERATURA,W ;TEMPERATURA-100=W.
btfss STATUS,C ;¿TEMPERATURA es menor ke .100?
goto DECENAS ;Si.
movwf TEMPERATURA ;No,salva el resto.
incf centena,F
goto CENTENAS
DECENAS movlw .10
subwf TEMPERATURA,W
btfss STATUS,C ;¿TEMPERATURA es menor ke .10?
goto UNIDADES ;Si.
movwf TEMPERATURA ;No,Salva el resto.
incf decena,F
goto DECENAS
UNIDADES movf TEMPERATURA,W
movwf unidad
clrf TEMPERATURA
MUESTRA movlw .128
call LCDI
movlw "T"
call LCDC ;Rutina ke indica modo dato y saca el caracter.
movlw "e"
call LCDC
movlw "m"
call LCDC
movlw "p"
call LCDC
movlw "e"
call LCDC
movlw "r"
call LCDC
movlw "a"
call LCDC
movlw "t"
call LCDC
movlw "u"
call LCDC
movlw "r"
call LCDC
movlw "a"
call LCDC
movlw "="
call LCDC
movf centena,W
sublw .0
btfsc STATUS,Z
goto $+3
addlw .48
call LCDC
movf decena,W
addlw .48
call LCDC
movf unidad,W
addlw .48
call LCDC
movlw b'01101111'
call LCDC
movlw "C"
call LCDC
goto STAR
Fuera_escala movlw .128
call LCDI
movlw "F"
call LCDC
movlw "u"
call LCDC
movlw "e"
call LCDC
movlw "r"
call LCDC
movlw "a"
call LCDC
movlw " "
call LCDC
movlw "d"
call LCDC
movlw "e"
call LCDC
movlw " "
call LCDC
movlw "e"
call LCDC
movlw "s"
call LCDC
movlw "c"
call LCDC
movlw "a"
call LCDC
movlw "l"
call LCDC
movlw "a"
call LCDC
goto STAR
T_ADQUISICIÓN movlw .15 ;Le sobredimensiono y listo.
movwf TIMER1
decfsz TIMER1,F
goto $-1
return ;Pasaron algunas decenas de µseg.,retorna.
END