#include <16f877a.h>
#device adc = 8 //Valor de la lectura en bit puede ser int y llega hasta int16
#fuses HS, NOPROTECT,NOWDT //HS crystal de 20M
#use delay (clock = 20M)
#use rs232(baud=9600, xmit=pin_c6, rcv=pin_c7)
#define LCD_RS PIN_B1
#define LCD_E PIN_B2 //Inicializo mi LCD
#define LCD_DB4 PIN_B4
#define LCD_DB5 PIN_B5
#define LCD_DB6 PIN_B6
#define LCD_DB7 PIN_B7
#include <lcd1.c>
#include <math.h>
#use standard_io(C)
#use standard_io(D)
#use standard_io(B)
float Fotoc, Lm35, Pot,P,x1,x2,x3,F,T;
char dato;
int8 num1,num2,num3;
int16 h=0;
enum Estado {
LETRA,
DATO_FOTO,
DATO_LM35,
DATO_POT
};
enum Displaynum {
UNIDADES,
DECENAS,
CENTENAS
};
enum Estado EstadoUART = LETRA;
enum Displaynum display = UNIDADES;
int8 BCDto7seg[10] = {
0b10111111, // 0
0b10000110, // 1
0b11011011, // 2
0b11001111, // 3
0b11100110, // 4
0b11101101, // 5
0b11111100, // 6
0b10000111, // 7 //Funcion en binario para mostrar los numeros en el 7segmentos
0b11111111, // 8
0b11101111, // 9
};
#int_RDA
void int_serie()
{
switch(EstadoUART)
{
case LETRA:
if(dato == 'F') EstadoUART = DATO_FOTO;
else if(dato == 'T' ) EstadoUART = DATO_LM35;
else if(dato == 'P') EstadoUART = DATO_POT;
break;
case DATO_FOTO:
Fotoc = dato;
EstadoUART = LETRA;
break;
case DATO_LM35:
Lm35 = dato;
EstadoUART = LETRA;
break;
case DATO_POT:
Pot = dato;
EstadoUART = LETRA;
break;
}
}
#INT_TMR
void int_timer(void)
{
switch(displaynum)
{
case UNIDADES:
output_low(PIN_C1);
output_low(PIN_C2);
output_high(PIN_C0);
output_d(BCDto7seg[num1]);
break;
case DECENAS:
output_low(PIN_C0);
output_low(PIN_C2);
output_high(PIN_C1);
output_d(BCDto7seg[num2]);
break;
case CENTENAS:
output_low(PIN_C1);
output_low(PIN_C0);
output_high(PIN_C2);
output_d(BCDto7seg[num3]);
break;
}
}
void main(void)
{
port_b_pullups(true);
enable_interrupts(INT_RDA); //Habilito la interrupcion de la funcion
ext_int_edge(L_to_H);
enable_interrupts(GLOBAL);//Habilito interrupción USART
lcd_init();
set_tris_D(0x00);
while(TRUE)
{
printf(lcd_putc
,"Variacion Potenciometro"); P = ((5 * Pot) / 255);
num1=P;
x1=P-num1;
x2=x1*10;
num2=x2;
x3=x2-num2;
num3=x3*10;
delay_ms(1000);
F = (5 * Fotoc) / 255; //conversion voltaje
T=Lm35*1.960784314; //conveersion temperatura
printf(lcd_putc
, "\fFotocel: %f V \nLm35: %f 'C",F
,T
);
delay_ms(200);
output_high(pin_a0);
delay_ms(200);
output_low(pin_a0);
delay_ms(300);
}
}