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: