Si...gracias Charly_29,bueno me parece bien lo ke dices,pero mi idea por ahora es no agregar el LCD hasta asegurarme de ke funciona con displays comunes para no complicar el programa(ya ke soy muy malo con los diagrama de flujo),yo hice mas o menos algo asi:mi idea era trabajar con el LM335 y representar en ultima instancia el valor de Tº en dos displays de 7 segmentos,numeros enteros sin decimales nada mas y positivos,digamos entre 0ºc y 50ºc,por ahora ke sea nada mas un sensor sin tomar ninguna decisión,a esto no he llegado aun,pero he podido representar en 3 displays de 7 segmentos el valor ke contiene el par de registros ADRES de 10 bits,mi programa terminado es el sig.:
;*****************************************************************************************************************
;Descripción *
;*****************************************************************************************************************
;*****************************************************************************************************************
;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
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
;*****************************************************************************************************************
;Progama principal. *
;*****************************************************************************************************************
INICIO BANCO1
clrf TRISB
clrf TRISC
clrf TRISD
movlw b'00001101' ;RA0 es una entrada funcionará como AN0.
movwf TRISA ;RA1-5 funcionaran como salidas 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
BANCO1
movf ADRESL,W
call CONVERSION
goto INICIO
;*****************************************************************************************************************
;Subrutinas *
;*****************************************************************************************************************
CONVERSION BANCO0
clrf unidad
clrf decena
clrf centena
movwf DATO
CENTENAS movlw .100
subwf DATO,W ;DATO-100=W.
btfss STATUS,C ;¿DATO es menor ke .100?
goto DECENAS ;Si.
movwf DATO ;No,salva el resto.
incf centena,F
goto CENTENAS
DECENAS movlw .10
subwf DATO,W
btfss STATUS,C ;¿DATO es menor ke .10?
goto UNIDADES ;Si.
movwf DATO ;Salva el resto.
incf decena,F
goto DECENAS
UNIDADES movf DATO,W
movwf unidad
clrf DATO
movlw .0
subwf ADRESH,W
btfsc STATUS,Z ;¿ADRESH=.0?
goto MUESTRA ;Si,no agrega nada.
movlw .1
subwf ADRESH,W
btfsc STATUS,Z ;¿ADRESH=.1?
goto SUMA_256 ;Si,suma 2 a centena,5 a decena y 6 a unidad.
movlw .2
subwf ADRESH,W
btfsc STATUS,Z ;¿ADRESH=.2?
goto SUMA_512 ;Si,suma 5 a centena,1 a decena y 2 a unidad.
movlw .7 ;No,es = a .3,suma 7 a centena,6 a decena y 8 a unidad.
addwf centena,F
movlw .247
addwf centena,W ;Comprueba si la suma resulto en mas de .10
btfss STATUS,C
goto $+2 ;No resulto mayor ke .10.
movwf centena ;Resulto mayor ke .10 deja el resto en centena.
movlw .6
addwf decena,F
movlw .247
addwf decena,W
btfss STATUS,C
goto $+3 ;No resulto ser mayor ke .10.
incf centena,F ;La suma superó el .10,incrementa la centena y deja el resto
movwf decena ;en decena.
movlw .8
addwf unidad,F
movlw .247
addwf unidad,W
btfss STATUS,C
goto $+3
incf decena
movwf unidad
movlw .247 ;Se pregunta si desborda la decena.
addwf decena,W
btfss STATUS,C
goto MUESTRA ;No desbordó,sale.
movwf decena
incf centena,F
goto MUESTRA
SUMA_256 movlw .2 ;No,es = a .3,suma 2 a centena,5 a decena y 6 a unidad.
addwf centena,F
movlw .247
addwf centena,W ;Comprueba si la suma resulto en mas de .10
btfss STATUS,C
goto $+2 ;No resulto mayor ke .10.
movwf centena ;Resulto mayor ke .10 deja el resto en centena.
movlw .5
addwf decena,F
movlw .247
addwf decena,W
btfss STATUS,C
goto $+3 ;No resulto ser mayor ke .10.
incf centena,F ;La suma superó el .10,incrementa la centena y deja el resto
movwf decena ;en decena.
movlw .6
addwf unidad,F
movlw .247
addwf unidad,W
btfss STATUS,C
goto $+3
incf decena
movwf unidad
movlw .247 ;Se pregunta si desborda la decena.
addwf decena,W
btfss STATUS,C
goto MUESTRA ;No desbordó,sale.
movwf decena
incf centena,F
goto MUESTRA
SUMA_512 movlw .5 ;No,es = a .3,suma 5 a centena,1 a decena y 2 a unidad.
addwf centena,F
movlw .247
addwf centena,W ;Comprueba si la suma resulto en mas de .10
btfss STATUS,C
goto $+2 ;No resulto mayor ke .10.
movwf centena ;Resulto mayor ke .10 deja el resto en centena.
movlw .1
addwf decena,F
movlw .247
addwf decena,W
btfss STATUS,C
goto $+3 ;No resulto ser mayor ke .10.
incf centena,F ;La suma superó el .10,incrementa la centena y deja el resto
movwf decena ;en decena.
movlw .2
addwf unidad,F
movlw .247
addwf unidad,W
btfss STATUS,C
goto $+3
incf decena
movwf unidad
movlw .247 ;Se pregunta si desborda la decena.
addwf decena,W
btfss STATUS,C
goto MUESTRA ;No desbordó,sale.
movwf decena
incf centena,F
MUESTRA movf unidad,W
call TABLA
goto $+3
movwf DATO
comf DATO,W
movwf PORTC
movf decena,W
call TABLA
goto $+3 ;Voy a trabajar con dispay's de catodo comun.
movwf DATO ;Aca invierto todo para trabajar con display's
comf DATO,W ;de anodo comun.Si trabajara con display's de catodo comun
movwf PORTB ;salto estas 2 instrucciones.
movf centena,W
call TABLA
goto $+3
movwf DATO
comf DATO,W
movwf PORTD
goto INICIO
TABLA addwf PCL,F ;Suma al contador de programa el valor de offset,o sea,el valor del dígito.
retlw 3F ;0 en código de 7 segmentos.
retlw 06
retlw 5B
retlw 4F
retlw 66
retlw 6D
retlw 7D
retlw 07
retlw 7F
retlw 6F
T_ADQUISICIÓN movlw .15 ;Le sobredimensiono y listo.
movwf TIMER1
decfsz TIMER1,F
goto $-1
return ;Pasaron algunas decenas de µseg.,retorna.
END
Ahora bien,del LM335 se ke entrega 10mv por ºK o sea ke
a 0º entrega 10mv*273=2.73V
y a 50º entregaria 10mv*(273+50)=3.23V lo cual pasado en terminos de ADRES me daria:
0ºC-------558 decimal aprox
50ºC-----660 decimal ,trazo la recta y obtengo esta ecuacion Cº=a*X+b=0.49*X-273,
bien ahora no se como haria para pasar esto a ºC ke pueda representar en 2 display de 7 segmentos
lo unico ke se me ocurre es juntar los datos de los 3 registros(centena,decena y unidad)en uno solo y asi poder seleccionar un
decimal BCD concreto de una tabla de 50 retlw....si ya han pasado por estos problemas y desean iluminarme el craneo un poco se los agradecere mucho...