Adjuntaré el código para que puedan verlo.
	
	
	
		
				
			
		Código:
	
	#include <16F877A.h>
 
/* Palabra de configuracion*/
 
#FUSES XT,PUT, NOBROWNOUT,NOLVP,CPD // //Oscilador del tipo XT.                    
 
#device ADC=10
/*DEFINIMOS LA FRECUENCIA DEL OSCILADOR*/
#use delay(crystal=2000000) ////Frecuencia de 2 MHz para el cristal de cuarzo.
#include <math.h>              //Libreria necesaria para operaciones matematicas.
#include <kbd.c>
 
/////////////////////////////////////////////////////////////////////////////////////
//------------------------configuracion del LCD------------------------------------//
////////////////////////////////////////////////////////////////////////////////////
 
                                       ///////////////////////////////
#define LCD_ENABLE_PIN  PIN_B1         //        Asignamos los      //
#define LCD_RS_PIN      PIN_B2         //           pines           //
#define LCD_RW_PIN      PIN_B3         //            del            //
#define LCD_DATA4       PIN_B4         //            LCD            //
#define LCD_DATA5       PIN_B5         //                           //
#define LCD_DATA6       PIN_B6         ///////////////////////////////
#define LCD_DATA7       PIN_B7 
#include <lcd.c>
 
#use fast_io(c)//declaramos la librería para la configuración del registro tris
#use fast_io(b)//le damos eficiencia al puertoB
#use fast_io(d)// EFICIENCIA AL PUERTO D PARA MUESTRA DELA SEÑAL DE MUESTREO
#byte PIR1 = 0x0C
#bit TMR1IF = PIR1.0
 
////////////////////////////////////////////////////////////////////////////////
int1 cambio=0; //Variable de control de cambio.                               //
///////////////////////////////////////////////////////////////////////////////
 
/////////////////////////////////////////////////////////////////////////////////////////
////Variables creadas destinadas para la medicion de Temperatura en distintas unidades.//
//------------------------CONFIGURAMOS LAS VARIABLES-----------------------------------//
/////////////////////////////////////////////////////////////////////////////////////////
 
int16 sensor;
float cent;//centigrados
float kelv;//kelvin
float Farh;//faranheit
int   code=2;
 
///////////////////////////////////////////////////////////////////////////////////////
//// -----------------------------Disposición del teclado---------------------------///
//////////////////////////////////////////////////////////////////////////////////////
 
char const map_keys[4][4] = {{\'7\',\'8\',\'9\',\'A\'},
                             {\'4\',\'5\',\'6\',\'B\'},
                             {\'1\',\'2\',\'3\',\'C\'},
                             {\'*\',\'0\',\'#\',\'D\'}};
 
 
////////////////////////////interrupcion timer1 //////////////////////////////////////
 
#INT_TIMER1    
void  interrupcion_tmr1() // funcion que se ejecutara al desbordar timer1    
{
   set_timer1(34286);  //se vuelve a cargar valor de timer1
   output_toggle(pin_d0); //(SALIDA DELA SEÑAL CONFIGURANDO)
   sensor=read_adc();                   //LEE LA CONVERCION ANALOGA DIGITAL ADC
   cent = (float)(sensor)*500.0/1023.0 ;//VALOR EN C° DE CONVERSION
   kelv = cent+273.15;                  //VALOR CONVERTIDO °C  A °K
   farh = cent*1.8+32.0;                //VALOR CONVERTUDO °C A F
}
 
//////////////////////////////////////////////////////////////////////////////////////
 
#INT_EXT          //  (DIRECTICA)se refiere a interrupcion por puerto RB0
void interrupcion_rb0(void)//FUNCION QUE SE EJECUTAR AL DEBORDAR EL RB0
{
   int aux,i,j,scancode;
   aux = 0B11111110;
   output_c(aux);
 
   for (i=0;i<4;i++) //una secuencia de números reunidos en una sola variable.
                     //es un array
   {                     //////////////////////////////
      if(!input(pin_c4)) // codigo de funcionamiento //
      {                  // de teclado matricial 4x4 //
         j=0;            //por metodo de interrupcion//
         break;           //////////////////////////7//
      }
      if(!input(pin_c5))
      {
         j=1;
         break;
      }
      if(!input(pin_c6))
      {
         j=2;
         break;
      }
      if(!input(pin_c7))
      {
         j=3;
         break;
      }
      aux <<=1;   
      output_c(aux);
   }
   scancode=map_keys[i][j];
   if(scancode==\'*\'){      //Integrantes
      code=0b00000001;
   }
   if(scancode==\'8\'){      //Temp en °C
      code=0b00000010;
   }
   if(scancode==\'6\'){      //Temp en °K
      code=0b00000100;
   }
   if(scancode==\'C\'){      //Temp en °F
      code=0b00001000;
   }
   output_c(0b11110000);
 
}
 
////////////////////////////////////////////////////////////////////////////////////////
 
#int_ccp1
void ccp1_int(){                 //Funcion de interrupcion.
  if(++cambio==1){
    setup_ccp1(CCP_COMPARE_CLR_ON_MATCH);  //Modo comparacion, cambio a 0.
  } else{
    setup_ccp1(CCP_COMPARE_SET_ON_MATCH);//Modo comparacion, cambio a 1.
  }
  set_timer1(0);     //Borrado
  CCP_1=199;         //Inicializacion del registro CCPR2 para un duty del 50%.
}
 
////////////////////////////////////////////////////////////////////////////////////////////////////
 
void main()
{
   set_tris_a(0b11111111);//Configurando las lineas del puerto A como entradas.
   set_tris_b(0b00000001); //Puerto con solo 1 linea como entrada.
   set_tris_c(0b11110000); //Puerto C con 4 entradas y 4 salidas.
   set_tris_d(0b11111110);   //Puerto D con 1 linea como salida.
   output_c(0b11110000);   //Puerto D con 1 linea como salida.
 
   setup_adc_ports(AN0_AN1_AN3);
   setup_adc(ADC_CLOCK_INTERNAL);
   output_toggle(pin_d0);
   set_adc_channel(3);
   ext_int_edge(H_TO_L);// interrupcion externa  y la activa con flanco de bajada
                        //RESUMIENDO Cambio de estado de alto a bajo
 
///////////////////////////////////////////////////////////////////////////////////////////////////////////
 
disable_interrupts(global);
setup_timer_1(T1_INTERNAL | T1_DIV_BY_1);     //Configuracion timer 1.
setup_ccp1(CCP_COMPARE_SET_ON_MATCH);  //Configuracion inicial del modulo CCP.
CCP_1=199;
 
enable_interrupts(int_ccp1);    //Habilitacion interrupcion modulo CCP2.
enable_interrupts(global);     //Habilita la interrupción de forma global.
 
//////////////////////////////////////////////////////////////////////////////////  
  delay_ms(20);//RETARDO DE 30 MILISEGUNDOS
  lcd_init(); //inicializa el LCD
 
    /*Calculo:
      Desborde cada 800ms
      Predivisor timer1 =8;
      Periodo de instruccion = 2us
      Debemos cargar el timer1 con:
         timer1=2^16-(800ms)/(2us*4)
         timer1=15536
   */  
   setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);  //// preescalador de 8  
   set_timer1(15536);      // EL NUMERO HALLADO NOS INDICA EL INICIO DE LA INTERRUPCION
   enable_interrupts(INT_EXT);  //Habilita la interrupción RBO
   enable_interrupts(INT_TIMER1);  //HABILIT EL TIMER 0
   enable_interrupts(GLOBAL);  //Habilita la interrupción de forma global.
 
   while(TRUE)
     {
      if(bit_test(code,1))
      {
         lcd_gotoxy(1,1);
         printf(lcd_putc, "   TEMPERATURA   ");  
         lcd_gotoxy(1,2);
         printf(lcd_putc, "     %3.1f oC      ",cent); 
      } 
      if(bit_test(code,3))
      {
         lcd_gotoxy(1,1);
         printf(lcd_putc, "   TEMPERATURA   ");  
         lcd_gotoxy(1,2);
         printf(lcd_putc, "     %3.1f oF      ",farh); 
      }
      if(bit_test(code,2))
      {
         lcd_gotoxy(1,1);
         printf(lcd_putc, "   TEMPERATURA   ");  
         lcd_gotoxy(1,2);
         printf(lcd_putc, "     %3.1f oK      ",kelv);
      }
      if(bit_test(code,0))
      {  lcd_gotoxy(1,1);
         printf(lcd_putc, "   ..........  ");  //rellenar siempre con 16 espacios
         lcd_gotoxy(1,2);                       //
         printf(lcd_putc, "   ..........   ");  // si  se quiere mas rapido realizar un clear & home(\\f)
         delay_ms(900);
         lcd_putc("\\f");
 
         lcd_gotoxy(1,1);
         printf(lcd_putc, "     ..........     ");  //rellenar siempre con 16 espacios
         lcd_gotoxy(1,2);                       //
         printf(lcd_putc, "................");  // si  se quiere mas rapido realizar un clear & home(\\f)
         delay_ms(900);
         lcd_putc("\\f");
         lcd_gotoxy(1,1);
         printf(lcd_putc, "     .......  ");  //rellenar siempre con 16 espacios
         lcd_gotoxy(1,2);                       //
         printf(lcd_putc, " .......... ");  // si se quiere mas rapido realizar un clear & home(\\f)
         delay_ms(900);
         lcd_putc("\\f");
         lcd_gotoxy(1,1);
         printf(lcd_putc, "     ........      ");  //rellenar siempre con 16 espacios
         lcd_gotoxy(1,2);                       //
         printf(lcd_putc, " ...................");  //  si se quiere mas rapido realizar un clear & home(\\f)
         delay_ms(900);
 
 
      }
     }
   }
			
				Última edición por un moderador: 
			
		
	
								
								
									
	
								
							
							 
   
				 
						 
 
		 
 
		 
 
		 
 
		 
 
		 
 
		 
 
		 
 
		 
 
		