# Sensor de temperatura con lm35 y pic 16f877a



## erik (May 4, 2010)

Hola 
espero me puedan colaborar.
Tengo que implementar un sensor de temperatura con lm35, salida por visualizaciÓn dinÁmica (dos displays) su temperatura debe estar entre 0°y50°c, su entrada debe ser por el canal an2 del pic usar un voltaje de referencia(vref+) mayor a 3 voltios y menor a 4 voltios adjunto lo que tengo hasta el momento.
No se como incorporar el lm35 ael programa ni los voltajes.
Agradezco su colaboraciÓn.


----------



## HADES (May 4, 2010)

Que bueno amigo que hayas echo caso aqui pues si te pueden ayudar dejame analizar bien tu caso y dependiendo te paso alguna informacion ya que solo vi que lo colocaste ahora bien aqui dame un momento.........

Ayayayay,amigo te estas ganando la santa tabla de san cacho:

porque?bueno porque por lo visto no usaste el buscador lee este link que habla al respecto lm35 y el 16f877 que es lo que tenes alla arriba

https://www.forosdeelectronica.com/f24/programa-conversion-d-pic-16f877-6061/


----------



## FRYCK (May 4, 2010)

Hola  *ERIK* en que lenguaje esta trabajando te sirve pic c de ccs o tiene que ser en    .asm ?


----------



## erik (May 4, 2010)

tiene que ser en .asm es para pic 16f877a (assembler)


----------



## FRYCK (May 5, 2010)

hola *Erik* te  entrego algo de información  espero que no este equivocado  para que te guíes  si no entiendes algo me  avisas  espero no se aburran ya que es un poquito extenso 

sensor de temperatura lm35
Rango de temperatura de -55 ° a +150 ° C 
Factor de escala lineal +10.0 mV/°C
Funciona a partir de 4 Hasta 30 volts

MODULO CONVERTIDOR ANALÓGICO/DIGITAL (A/D)

El módulo de conversión Analógico/Digital dispone de cinco entradas para los dispositivos de 28 pines y ocho para dispositivos de 40 pines.
A través de la entrada analógica se aplica la señal analógica a un condensador de captura y retención (sample and hold) que después se introduce en el convertidor. El convertidor de aproximaciones sucesivas da como resultado una palabra de 10 bits.
El convertidor A/D puede seleccionar como tensión de referencia la alimentación interna VDD y masa o bien una externa que se introduzca entre VREF+ y VREF. Cuando se selecciona la tensión de referencia externa, hay que tener en cuenta que existen algunas limitaciones; el máximo voltaje aplicado a la patilla VREF+  será VDD+0,3V y el mínimo VDD-2,5V. En cuanto a la tensión VREF- la mínima tensión será VSS-0,3V y la máxima VREF+ –2V, así por ejemplo, si la tensión de alimentación es de 5V, la tensión VREF+ no podrá exceder de 5V. Por lo que el máximo voltaje en VREF-  será de 3V. Siempre se ha de cumplir que  VREF+  – VREF– <= 2V. 
En el caso de los micros de la serie 16 y 18 de microchip el  modulo ADC de el Pic  es de 10 bits de resolución el microcontrolado  me  aumentaría 1 bit cada  (VRF+ - VRF-)/2^10 en el caso  que tengamos  un voltaje  VREF– = Vss; y VREF+ =3V el  voltaje  por bit seria de 3V/1024 =  0,002929688V/bit = 2. 929688 mV/bit  
Lo que  quiere decir  que  el  registro del ADC me  aumentara en 1 por cada         2. 929688 mV/bit.
Acomodando las  escalas  si el   sensor lm35 me  entrega  10.0 mV/°C  y  el   ADC me   aumenta en  2. 932551mV   por bit y necesito   que  me  quede  uno a uno  la escala   puedo  buscar un factor que   me haga esto   y seria                              10.0 mV/C° / 2. 929688 mV/bit = 3,41333 o sea que  si  divido  el valor de la conversión A/D por este valor 3,41333  me  dará el valor de  la temperatura en grados  centígrados

Para realizar una conversión A/D deben seguirse los siguientes pasos:
1. Configurar el módulo conversor  A/D
• Configurar los pines que actúan como entradas analógicas, las señales que harán de tensión de referencia la que trabajarán como E/S digitales (ADDCON1).
• Seleccionar el canal de entrada. A/D (ADCON0).
• Seleccionar la fuente de la señal de reloj para la conversión A/D (ADON0).
•  Hacer  la selección del formato de justificación
• Activar el módulo de conversión A/D (ADCON0)

2. Activar si, se desea, la interrupción  del módulo conversor A/D
3. Esperar el tiempo requerido para la adquisición
4. Inicio de la conversión
5. Tiempo de espera para terminar la conversión A/D que puede detectarse
6. Leer el par de registros ARDESH:ADRESL donde se encuentran los 10 bits que resultan de la conversión y poner a cero el flag ADIF.
7. Para una nueva conversión volver a los pasos 1 y 2, El tiempo de conversión por bit está definido por TAD, se exige un mínimo de 2*TAD para realizar una nueva conversión.

te anexo  un ejemplo realizado en Pic c de CCS y la  simulación en  Proteus.

saludos


----------



## erik (May 6, 2010)

FRYCK muchísimas gracias por su información voy a revisarla bien,y trabajare en ello haber que obtengo, me es de gran utilidad su colaboración. gracias.


----------



## ElTox (May 6, 2010)

hola pues aprovecho este tema abierto para ver si me pudieran echar una ayudadita ^^, yo también ando con el Termómetro con el LM35 y el PIC16F877A, hice ya el código en CCS C y la simulación en Proteus, todo anda bien, el problema es que al ser mi primer proyecto con PIC no estoy muy seguro de como conectarlo, voy a utilizar un LCD de 16x2 (JHD-162ASTNGLED), les agradecería si me pudieran dar una ayudadita ^^

Adjunto el código y la simulación del termo, también un pequeño diagrama de el, si me pudieran decir que es lo que le falta para que este funcionando físicamente


----------



## FRYCK (May 7, 2010)

ElTox dijo:


> hola pues aprovecho este tema abierto para ver si me pudieran echar una ayudadita ^^, yo también ando con el Termómetro con el LM35 y el PIC16F877A, hice ya el código en CCS C y la simulación en Proteus, todo anda bien, el problema es que al ser mi primer proyecto con PIC no estoy muy seguro de como conectarlo, voy a utilizar un LCD de 16x2 (JHD-162ASTNGLED), les agradecería si me pudieran dar una ayudadita ^^
> 
> Adjunto el código y la simulación del termo, también un pequeño diagrama de el, si me pudieran decir que es lo que le falta para que este funcionando físicamente



hola  *ElTox*  a que te refieres con  "pudieran decir que es lo que le falta para que este funcionando físicamente" si es  como se conecta  todo lcd  sensor   pic para conecta  la lcd   basese en los  datasheet o en la simulacion te  anexo  un par de cositas  en tu  simulacion  para  que no se te olviden 

saludos


----------



## ElTox (May 7, 2010)

en sí, me refiero al PIC el lcd el lm35 los conecte como viene en su datasheet y de ahí al PIC con los pines que se definieron para tal propósito, la cuestión es que había leído por ahí que los pines no utilizados deberían declararse como outputs para un 16F84, ¿es lo mismo para el 16F877A?


----------



## FRYCK (May 7, 2010)

ElTox dijo:


> en sí, me refiero al PIC el lcd el lm35 los conecte como viene en su datasheet y de ahí al PIC con los pines que se definieron para tal propósito, la cuestión es que había leído por ahí que los pines no utilizados deberían declararse como outputs para un 16F84, ¿es lo mismo para el 16F877A?



Hola *ElTox*  creo  que  eso  es mas  un modo de  hacer las  cosas  que  una necesidad a  alguien le  gusta  hacerlo  así  ya tendrá sus motivos para ello.  Pero si me   vaso  en los  datashet de microchip  tanto en el pic 16f84 como en el 16f877  los pines  viene por defecto  como entrada  y en  mi caso yo no los  modifico cuando  no los utilizo 
saludos


----------



## innolab (May 14, 2010)

FRYCK dijo:


> hola *Erik* te entrego algo de información espero que no este equivocado para que te guíes si no entiendes algo me avisas espero no se aburran ya que es un poquito extenso
> 
> sensor de temperatura lm35
> Rango de temperatura de -55 ° a +150 ° C
> ...


 gracias por el aporte


----------



## sadmon (Jun 6, 2010)

hola disculpa alguien me podria pasar el codigo  en asm lo nesecito urgentemente , thx


----------



## HADES (Jun 6, 2010)

sadmon dijo:


> hola disculpa alguien me podria pasar el codigo  en asm lo nesecito urgentemente , thx



compañero en todo caso mejor hubieras pedido el archivo o codigo en .hex que por cierto no se si ya estara entre los que publicaron seria de buscar no? y otra cosa ojo en la forma en que escribis NUNCA se agrega al princio ni al final ni en medio lo de urgente!

Aqui no se aplica La Ley del Minimo Esfuerzo salu2!


----------



## Meta (Jun 6, 2010)

http://www.ucontrol.com.ar/forosmf/...asic/visual-basic-2008-expressrs232pic16f877/


----------



## electronRR (Ago 6, 2010)

ElTox dijo:


> hola pues aprovecho este tema abierto para ver si me pudieran echar una ayudadita ^^, yo también ando con el Termómetro con el LM35 y el PIC16F877A, hice ya el código en CCS C y la simulación en Proteus, todo anda bien, el problema es que al ser mi primer proyecto con PIC no estoy muy seguro de como conectarlo, voy a utilizar un LCD de 16x2 (JHD-162ASTNGLED), les agradecería si me pudieran dar una ayudadita ^^
> 
> Adjunto el código y la simulación del termo, también un pequeño diagrama de el, si me pudieran decir que es lo que le falta para que este funcionando físicamente



hola a todos esta bueno este diseño estuve analizando como seria el cambio para medir 3 temperaturas simultaneamente.  y si alguna supera un valor ejemplo 100 celsius avise en el display  saludos espero me puedan apoyar compañeros



FRYCK dijo:


> hola *Erik* te  entrego algo de información  espero que no este equivocado  para que te guíes  si no entiendes algo me  avisas  espero no se aburran ya que es un poquito extenso
> 
> sensor de temperatura lm35
> Rango de temperatura de -55 ° a +150 ° C
> ...



compañero saludos vi tu programa en c asi como esta puede leer 2 ? es que no pude ver el diagrama en proteus por la version ...  Quiero leer 2 o 3 temperaturas pero la verdad no se como leer varias temperaturas e imprimirlas en el lcd... saludos.


----------



## ennoia (Ago 8, 2010)

Buenos dias...

Veo que estoy en el hilo indicado, ya que yo en estos momentos me encuentro trabajando en mi Proyecto de Tesis con un 16F876A que utiliza el mismo Datasheet que el 877A.

Al igual que el primer post, yo necesito coilocar varios sensores al PIC para poder controlar via Mensajeria de Texto o llamadas cada vez que se active una alarma.

Me uno al tema ya que no sé nada de programación y estoy incursionando de apoco en el tema...

Cualquier aporte que pueda hacer lo haré y aprovecho de consultar si este código está bien realizado, ya que lo he probado en Proteus y ningún problema, pero no hay caso que pueda programarlo en el PIC... Siempre me arroja errores, cualquier programa que utilice.

Lo otro, los ejemplos creados en Proteus no los puedo abrir, podrían decir que versión de Proteus utilizaron para crearlos...

Aquí el código... (valga decir que es un extracto de muchos códigos encontrados en la web)


```
#include <16F876A.h>
#device *=16
#device adc=8

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES HS                       //Crystal 20MHz
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NODEBUG                  //No Debug mode for ICD
#FUSES BROWNOUT                 //Reset when brownout detected
#FUSES LVP                      //Low Voltage Programming on B3(PIC16) or B5(PIC18)
#FUSES NOCPD                    //No EE protection
#FUSES NOWRT                    //Program memory not write protected

#use delay(clock=20000000)
//#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
void main(){
while(1){
   output_high(PIN_B1);
   output_low(PIN_B2);
   delay_ms (25);
   output_low(PIN_B1);
   output_high(PIN_B2);
   delay_ms (25);
}
}
```

Dejo algunos datos de lo que he utilizado para el proyecto:

Placa programadora: JDM, UTI (SMARTEC)
Programa para quemar el PIC: PICProg, WinPin800, PICProg4U
SImulador: Proteus v7.2
Programa para escribir el programa: PCWHD Compiler v4.023

Saludos y gracias por todo...


----------



## electronRR (Ago 8, 2010)

Compañeros expertos en la programada ayudenos a usar las diferentes entradas del 877a  porque si al convertidor A-D solo es uno y hay que darle un tiempo de espera para andar midiendo las entradas ahi si no se que tiempo dar. Lo  mio es medir 2 temperaturas al mismo tiempo. pero al parecer tambien se  puede medir voltaje 14 vcd.   es decir 3 medidas al mismo tiempo. Donde puedemos estudiar este tema


----------



## ennoia (Ago 9, 2010)

Muchachos... Sé que es esto se va a salir del tema pero necesito colocarlo por que sé que será de utilidad para todos.

Para todo aquel que tenga el problema de que al programar el PIC salga:

*Verificación falló en la dirección de código 0000h !*

Se resuelve colocando DIRECTAMENTE EL PROGRAMADOR AL PUERTO SERIAL.

Yo siempre colocaba el Programador - Cable - Puerto Serial y siempre me aparecía este error.

Desde que hago esto (hoy) no he vuelto a tener problemas con la programación, y créanme, estuve TODO EL FIN DE SEMANA tratando de programa y nada...

Saludos...


----------



## tkmtkmtkm (Abr 2, 2011)

io solo quiero hacer un programa para un sensor de temperatura el LM35, con un convertidor analogico dital, tambien estoy usando el pic 16g877a, pero no tengo nada!!!! me podrian pasar porfis el archivo .ams       se los agradeciria mil =)


----------



## pandacba (Abr 2, 2011)

Digamos, hay que pasarte todo? vos queres hacer un progrma o copiarlo? por alli cuando entraste habia un reglamenteo del foro que seguramente no leiste y dice en uno de sus puntos sobre la ley del minimo esfuerso recibirlo todo a cambio de nada.... tu post creo que tiene el boleto picado a moderación de una....


----------



## Ana21 (Abr 23, 2012)

La explicación que nos da *FRICK* es de gran utilidad, yo la utilize para crear un sensor de temperatura con un LM35, un PIC16F877A y que se mostrara en °C en una LCD, cuando llegara a una temperatura igual o mayor a 23°C se debería activar un LED. En la imagen de abajo se muestra el resultado obtenido y el codigo generado en Ccompiler.


> #include "16f877A.h"
> #device adc=10
> #fuses XT, NOWDT
> #use delay (clock=4000000)
> ...



jejeje las conecciones no son del todo bien


----------



## lulouch (Jun 18, 2012)

hola tengo una consulta yo estoy haciendo una simulacion en proteus del termometro digital con lm35 y el pic 16f877a  con lcd  pero quisiera que en el LCD  apareciera el voltaje del lm35 con una etapa amplificadora para que me de de 0 a 5v  y aparte tambien  en la misma pantalla LCD 16x2 en las  2 lineas salga la variable de temperatura algo asi:
voltaje: 3.5v
temperatura:  52ºC
y como poder hacer para que en el salidas del pic 16f877a  el puerto D  salgan datos binarios del voltaje de entrada para asi poder añadirle un DAC  para con un voltimetro poder comprobar el voltaje del sensor.
les agradeceria si me ayudaran a poder programarlo con NIPLE. aqui adjuntare mi esquema en proteus.


----------



## Psyke (Oct 7, 2012)

Hola a todos, estoy iniciandome en el Conversor A/D de los PIC, y debido a ello tengo algunos problemitas para la programación. Quiero hacer un termómetro digital con un sensor LM35, PIC16F877A y 2 Displays de 7 Segmentos, si fuera posible quisiera utilizar 3, uno de los displays como decimal, pero por ahora me quiero concentrar en los números enteros para no hacer todo tan difícil. Además quiero hacer la salida del PIC en binario, o sea, utilizar un puerto completo para cada display, a fin de hacer las cosas un poco más fácil (perdón por mis desastrosas expresiones )

También me han dicho que use un Display LCD, ya que sería mucho mas fácil, pero quiero utilizar los de 7 segmentos porque aún no hice ningún proyecto con ellos y me parece muy "brusco" saltar de la nada a un Display LCD.

*Mi problema está en que no sé como "adaptar" la lectura del ADC a los displays. El programa que tengo hecho es una recopilación de algunos que vi en la Web, sumado a retoques míos. 
	
	




		Código:
	

#include <16F877A.h>
#device adc=10
#fuses XT,NOWDT,NOPUT,NOPROTECT,NOWRT,NOBROWNOUT
#use delay(clock=4000000)

void main ()
{
int16 q;
float p;
unsigned int Unidad, Decena;
int Numeros[10] = {0b00111111,0b00000110,0b01011011,0b01001111,0b01100110,0b01101101,0b01111101,0b00000111,0b01111111,0b01101111};

setup_adc_ports (AN0);
setup_adc(ADC_CLOCK_INTERNAL);
set_adc_channel(0);
delay_us(20);

Unidad=(int)p%10;
Decena=(int)p/10;

      while(true){
      q=read_adc();
      p=5.0*q/1024.0;
      delay_ms(100);
      output_b(Numeros[Decena]);
      output_d(Numeros[Unidad]);
  }
 
}

*
Bueno, obviamente mi programa tiene muchos errores, y me gustaría que me digan cuales son y de ser posible cómo solucionarlos.

Espero no haberme olvidado de nada, y por las dudas dejo el DSN para el Isis Proteus

Desde ya, muchas gracias!


----------



## Psyke (Oct 7, 2012)

Bueno amigos, les comento que estuve hablando con un amigo estudiante de electrónica y me ayudó y me hizo razonar sobre como programar y conectar los componentes. Aún no lo hice en la vida real, solo lo simulé en Isis Proteus. Terminé usando un OpAmp (Amplificador Operacional) para aumentar el voltaje de salida del LM35. Les dejo el programa y la conexión para quien le sea de utilidad, mucha suerte a todos y me preguntan ante cualquier duda. Si, el de las dudas era yo pero quizás ahora pueda ayudar a otro, saludos.


----------



## victorpue (Nov 13, 2012)

hola ana21 ojala y veas este comentario. mi duda es como sacaste el valor "3.413333333" el cual esta incluido en la linea de codigo "conv=conv/3.413333333;"  .Espero tu respuesta y desde ya gracias.


----------



## Steron (Jul 2, 2013)

Hola, estoy programando un pic 16f877a en mikroc, lo que quiero es reflejar la temperatura en 2 displays de 7 segmentos. y pues la verdad es que no tengo idea. He leído sus comentarios y pues intentaré con ello, pero ojalá puedan ayudarme


----------



## MrCarlos (Jul 2, 2013)

Hola Steron

El circuito que estás por elaborar lo tienes en el archivo comprimido que subió psyke en su mensaje #24.

saludos
a sus ordenes


----------



## Steron (Jul 2, 2013)

Hola Carlos, Gracias. Ya pude resolver el detalle. Gracias por tu tiempo. Saludos


----------



## Steron (Jul 2, 2013)

Hola, otra duda. ¿Como puedo hacer que al presionar un push, todo mi sistema se apague, y que con otro push se encienda?. Esta pensando que con una condicionante, en este caso IF para lo que es mikroC. ¿Alguna sugerencia?


----------



## Psyke (Jul 2, 2013)

Mm, a mi se me ocurre que uses la interrupcion externa, entonces mediante el push haces entrar y salir del modo Sleep al microcontrolador


----------



## Steron (Jul 2, 2013)

Honestamente no se como hacerlo. Podrías echarme la mano?

Por cierto, aca está el código


----------



## nandoazul89 (Sep 20, 2013)

Hola, me sirvio de mucho la información de Psyke y los demas muchas gracias
Quisiera ver si me pueden ayudar puesto que quisiera ahorrar pines del microcontrolador y eh visto que se pueden miltiplexear los display...........alguien me puede ayudar, como se pogramaria? estoy utilizando Pic c Compiler, espero me puedan ayudar.
Les dejo una imagen de lo que eh visto en internet, igual seguiré investigando gracias.


----------



## fen2006 (Sep 26, 2013)

claro que se puede multiplexar el display solo tienes que enviar el numero que quieres mostrar y después activas la posición donde quieras que  aparezca el numero solo unos milisegundos. eso lo tengo pero en archivo asm


----------



## nandoazul89 (Sep 26, 2013)

que onda fen2006!
muchas gracias por responder
y bueno si pudieras facilitarme el archivo para ver como programarlo en PCC.
cualquier tipo de ayuda es bien recibida. 
gracias!


----------



## Eduardo Mota (Jun 30, 2014)

FRYCK dijo:


> hola *Erik* te  entrego algo de información  espero que no este equivocado  para que te guíes  si no entiendes algo me  avisas  espero no se aburran ya que es un poquito extenso
> 
> sensor de temperatura lm35
> Rango de temperatura de -55 ° a +150 ° C
> ...





disculpa, pero si quisera usar dos displays de 7 segmentos multiplexado con un 74LS48, la salida la pongo directamente en el portb o tendria que reeescribir las salidas de cada pin? es que lo quisera utilizar con un pic16f819, pero con este ejemplo le entenderia bien y gracias por la info


----------



## fen2006 (Jul 3, 2014)

si. conectas las salidas del pic al 74ls48 y una salida mas para cada display.


----------



## fernandab (Jun 8, 2017)

Hola, estoy realizando un trabajo final para la facultad, el cual consiste en un sensado de temperaturas con lm35 y un lcd 16x4
Lo habia realizado para el pic 18f4550 y me anduvo de diez, pero al querer realizarlo en el pic 16f877a me surgen algunos problemas en cuanto al código.
Este es el codigo del pic 18f4550, con las modificaciones que realice, pero cuando lo simulo en proteus no anda.


```
LIST P=16F877a
 INCLUDE <P16f877a.INC> 
;***Comienzo a definir variables***

; Oscilador utilizado 4MHz.-
; ************************************************
ByteAlto    equ 0x20    ; Registro para guardar Byte alto de la conversion.-
ByteBajo    equ 0x21    ; Regsitro para guardar Byte bajo de la conversion.-
Contador    equ 0x22    ; registro utilizado en demora.-
ASCII_H EQU 0x2B
ASCII_M EQU 0x2C
ASCII_L EQU 0x2D
HEXADECIMAL EQU 0x23    ;GUARDA EL DATOS DEL SENSOR
NUMASCCII   EQU 0x24    ;RESULTADO DE CONVERSION HEX A ASCCII

CONTA1       EQU    0124H
CONTA2       EQU    0125H
CONTA3       EQU    0126H
; ************************************************
			org     0x00
		    GOTO CONFIPIC
INICIO
        	CALL MENSAJE
PROCESO
			bsf     STATUS,5  ; Banco 1
			movlw   0x8E        ; Justificado a la derecha, Fosc/8, RA0 analógico, VDD, VSS.-
			movwf   ADCON1
			bcf     STATUS,5  ; Banco 0
			movlw   0x41        ; Fosc/8, Canal 0, módulo habilitado.-
			movwf   ADCON0
			call    Demora_20us ; Demora de adquision.-
			bsf     ADCON0,GO
Espera
			btfsc   ADCON0,GO   ; Espera a que termine conversion.-
			goto    Espera
			movf    ADRESH,0   ; Movemos resultado de la conversion.-
			addwf ADRESH,0
		    CALL Hex_Ascii    
		    CALL MOSTRAR_TEMPERATURA
		    ;BSF PORTB,2
			bsf     STATUS,5  ; Banco 1
			movf    ADRESL,0
			;movwf   ByteBajo
			bcf     STATUS,5  ; Banco 0.-
			bsf     ADCON0,ADON ; Apago modulo de conversion.-
	
		 	GOTO PROCESO
	;**** Demora ****
Demora_20us
			movlw   0x05 ;
			movwf   Contador ; Iniciamos contador1.-
Repeticion
			decfsz  Contador,1 ; Decrementa Contador1.-
			goto    Repeticion ; Si no es cero repetimos ciclo.-
			return              ; Regresa de la subrutina.-
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;; RUTINA PARA CONVERTIR HEX ASCCII ;;;;;;;;;;;;;;;;;;;;;;;

Hex_Ascii      ;cargar en W el dato hex

			movwf HEXADECIMAL 
			clrf ASCII_H ;Para BCD D'0'
			clrf ASCII_M ;Para BCD D'0'
			clrf ASCII_L ;Para BCD D'0'

Centenas	movlw D'100' ;D'100' --> W
			subwf HEXADECIMAL,0 ;HEXADECIMAL - D'100' --> W
			btfss STATUS,C ;¿ HEXADECIMAL es menor que D'100' ?
			goto Decenas ;Si
			movwf HEXADECIMAL ;Salva el resto
			incf ASCII_H,F ;Incrementa el contador de centenas BCD
			goto Centenas ;Vuelve por otros D'100'

Decenas		movlw D'10' ;D'10' --> W
			subwf HEXADECIMAL,0 ;HEXADECIMAL - D'10' --> W
			btfss STATUS,C ;¿ HEXADECIMAL es menor que D'10' ?
			goto Unidades ;Si
			movwf HEXADECIMAL ;Salva el resto
			incf ASCII_M,F ;Incrementa el contador de decenas BCD
			goto Decenas ;Vuelve por otros D'10'

Unidades	movf HEXADECIMAL,0 ;El resto pertenece
			movwf ASCII_L ;a las unidades BCD
			clrf HEXADECIMAL ;Pone a cero el registro HEXADECIMAL
            
Bcd_A_Ascii	movlw H'30' ;H'30' --> W
			iorwf ASCII_L,F ;Convierte de BCD a ASCII	
			iorwf ASCII_M,F ;Convierte de BCD a ASCII

			movf ASCII_H,F ;ASCII_H --> F
			btfsc STATUS,Z ;? ASCII_H es D'00' ?
			goto Espacio ;Si
			movlw H'30' ;H'30' --> W
			iorwf ASCII_H,F ;Convierte de BCD a ASCII
			return ;Retorna
 
Espacio
			movlw '0' ;A' ' --> W
			movwf ASCII_H ;A' ' --> ASCII_H
			return ;Retorna

;**********************************************************************
;     MOSTRAR MENSAJE DE BIENVENIDA
;**********************************************************************
MENSAJE
				NOP
   				MOVLW	    038H         ; Inicio LCD a 8 bits, 2 linea            
	      	    CALL      CONTROL
				MOVLW     0CH          ; sentido giro 0000 0101 
				CALL      CONTROL 
	            MOVLW     01H                         
                CALL      CONTROL      ; Limpia todo el display  y retorna el cursor a la posicion de inicio de LCD ... 
                CALL      RETARDO     ; Tiempo prudencial para que la lcd ermnie la instruccion anterior der borrado ...


                MOVLW     " "          
                CALL      DATO
                MOVLW     " "          
                CALL      DATO
                MOVLW     " "         
                CALL      DATO
                MOVLW     "S"          
                CALL      DATO    
                MOVLW     "E"          
                CALL      DATO 
                MOVLW     "N"         
                CALL      DATO    
                MOVLW     "S"          
                CALL      DATO          
                MOVLW     "A"          
                CALL      DATO    
                MOVLW     "D"         
                CALL      DATO           
                MOVLW     "O"         
                CALL      DATO    
                MOVLW     " "         
                CALL      DATO                
                MOVLW     "D"          
                CALL      DATO    
                MOVLW     "E"          
                CALL      DATO    
                MOVLW     " "          
                CALL      DATO                
                MOVLW     ""          
                CALL      DATO    
                MOVLW     ""         
                CALL      DATO
;************ SEGUNDA LINEA **************************
				MOVLW     " "          
                CALL      DATO
                MOVLW     " "          
                CALL      DATO
                MOVLW     " "         
                CALL      DATO
                MOVLW     " "          
                CALL      DATO    
                MOVLW     "T"          
                CALL      DATO 
                MOVLW     "E"         
                CALL      DATO    
                MOVLW     "M"          
                CALL      DATO          
                MOVLW     "P"          
                CALL      DATO    
                MOVLW     "E"         
                CALL      DATO           
                MOVLW     "R"         
                CALL      DATO    
                MOVLW     "A"         
                CALL      DATO                
                MOVLW     "T"          
                CALL      DATO    
                MOVLW     "U"          
                CALL      DATO    
                MOVLW     "R"          
                CALL      DATO                
                MOVLW     "A"          
                CALL      DATO    
                MOVLW     " "         
                CALL      DATO
		MOVLW     " "          
                CALL      DATO
                MOVLW     " "          
                
      	        CALL RETARDO
       	        CALL RETARDO
      	        CALL RETARDO
                CALL RETARDO
                CALL RETARDO
                CALL RETARDO
                CALL RETARDO
                   
	            MOVLW     01H                         
                CALL      CONTROL      ; Limpia todo el display  y retorna el cursor a la posicion de inicio de LCD ... 
                  
                CALL      RETARDO     ; Tiempo prudencial para que la lcd ermnie la instruccion anterior der borrado ...

                MOVLW     "T"          
                CALL      DATO    
                MOVLW     "E"          
                CALL      DATO 
                MOVLW     "M"          
                CALL      DATO    
                MOVLW     "P"          
                CALL      DATO  
		MOVLW     " "          
                CALL      DATO  
		MOVLW     "="          
                CALL      DATO  
		MOVLW     " "          
                CALL      DATO 
                MOVLW     B'10001100'                         
                CALL      CONTROL      ; POSICIONA EL CURSOR EN UNA CIERTA POSICION
  
				MOVLW     0xDF			;envia el simbolo de grados celsius
				CALL      DATO    
				MOVLW     'C'
				CALL      DATO
              RETURN

;**********************************************************************
;**********************************************************************
; MOSTRAR TEMPERATURA
;**********************************************************************
MOSTRAR_TEMPERATURA
 				NOP
                MOVLW     B'10001000'                         
                CALL      CONTROL        
                
                movf 	ASCII_H,0 ;envia las centenas de temperatura
				CALL      DATO    
				movf ASCII_M,0   ;envia las decenas de temperatura
				CALL      DATO    
				movf ASCII_L,0  ;envia las unidades de temperatura
				CALL      DATO    
				MOVLW     " "    
                CALL      DATO 
                CALL RETARDO

              RETURN

;**********************************************************************
;**********************************************************************
; CONTROL LCD 
;**********************************************************************
CONTROL 	     BCF	     PORTA,1        ; RS =  0 Control
              	 BSF	     PORTA,2        ; E    =  1 Habilito LCD ...
              	 NOP
              	 NOP
             	 NOP
        	     MOVWF    PORTD	        ; Saca dato puerto B
                 CALL     RETARDO1
                 CALL     RETARDO1
        	     BCF      PORTA,2        ; E   =  0    Desabilito LCD ...
        	     RETURN
;**********************************************************************
; DATO  LCD 
;**********************************************************************
DATO        	 BSF	     PORTA,1        ; RS =  1   Dato    
             	 BSF	     PORTA,2        ; E    =  1 Habilito LCD ...
             
             	 MOVWF    PORTD	        ; Saca dato puerto B
        	     CALL     RETARDO1
                 BCF      PORTA,2        ; E   =  0    Desabilito LCD ...
        	     RETURN     
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;**********************************************************************
; RETARDO1        TIEMPO DE WRITE Y READ DE DATO PARA LCD MODIFAMOS 019-025-30
;**********************************************************************
RETARDO1          MOVLW      0C8H
                  MOVWF      CONTA2         ;cargo el registro CONTA1 con AAh
CICLO22           MOVLW      01H    
                  MOVWF      CONTA3         ;cargo el registro CONTA1 con 01h

CICLO11           DECFSZ     CONTA3,1          ;decrementa el contenido CONTA3
                  GOTO       CICLO11            
            
                  DECFSZ     CONTA2,1          ;decrementa el contenido CONTA2
                  GOTO       CICLO22  
                  RETURN  
;**********************************************************************
; RETARDO
;**********************************************************************

RETARDO	 		MOVLW  0FFH				;CARGAMOS EN EL REGISTRO DE TRABAJO EN FF  UN DECREMENTO
				MOVWF  CONTA1			;LO MEVEMOS AL REGISTRO DE PROPOCITO GENERAL CONTA 1
CICLO3  		MOVLW  0FFH				;CARGA EN EL REGISTRO DE TRABAJO FF PARA UN DECREMENTO
				MOVWF  CONTA2			;LO MEVEMOS A LA ETIQUETA 
CICLO2  		MOVLW  01H				;CARGA EN EL REGISTRO DE TRABAJO PARA UN DECREMENTO
				MOVWF  CONTA3			;LO MUEVE AL REGISTRO
CICLO1  		DECFSZ CONTA3,1				;DECREMENTA EL REGISTRO Y DEJA EL RESULTADO EN ESE REGISTRO
				GOTO   CICLO1		        ;SI EL DECREMENTO ES CERO SALTA A LA ETIQUETA
				DECFSZ CONTA2,1			;DECREMENTA
				GOTO   CICLO2			;SIEL DECREMENTO ES CERO SALTA
				DECFSZ CONTA1,1			;DECREMENTA
				GOTO   CICLO3			;SI ES CERO SALTA
				RETURN					;RETORNA



;**********************************************************************
;******************** CONFIGURACION PIC *******************************
;**********************************************************************

CONFIPIC	
			NOP
			BANKSEL 0F00H
			MOVLW b'00000000'   ;pone el puerto b como salida
			MOVWF TRISB			;MOSTRAMOS POR EL PUERTO B
                        CLRF PORTB
				
			MOVLW b'00000000'   ;pone el puerto b como salida
			MOVWF TRISD		;MOSTRAMOS POR EL PUERTO D
                        CLRF PORTD



;*********************************************************************           
			
			MOVLW    0Fh
			MOVWF    ADCON1 
			MOVLW    07h
			MOVWF    CMCON 
			MOVLW    00h 
			MOVWF    TRISA
			CLRF        PORTA

            BSF      PORTA,2
            CALL     RETARDO
            BCF      PORTA,2
            CALL     RETARDO
            BSF      PORTA,2
            CALL     RETARDO
			GOTO INICIO
            
	END
```


----------

