Muy buenas noches soy nuevo en el foto y tengo un problema con una lcd y 3 7 segmentos catodo comun multiplexados, el problema esta en los delay ya que con el delay de la lcd mis 3 7 segmentos se vuelven mas lentos y si le quito ese delay la lcd no imprimi 100 % bien y la necesito asi. Mi otra alternativa fue una interrupcion interna por Rb0 me funciona pero las variables que necesito que cambien ya no lo hacen y solo recibe solo una y no las 3 ya que es una comunicacion serial por rs232. Ajunto codigo cualquier ayuda seria excelente. Muchas gracias
CODIGO:
#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;
int8 sacaNumero(int8 numero)
{
int8 valores[] = {
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
};
return valores[numero];
}
#int_RDA
void int_serie()
{
dato = getc();
if(dato == 'F') Fotoc = getc();
else if(dato == 'T' ) Lm35=getc();
else if(dato == 'P') Pot=getc();
}
#INT_EXT
void int_cambio()
{
h=0;
do
{
h++;
output_d(0);
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);
}while(h<200);
}
void main()
{
port_b_pullups(true);
enable_interrupts(INT_RDA); //Habilito la interrupcion de la funcion
enable_interrupts(int_ext); //indica que la interrupción es externa
ext_int_edge(L_to_H);
enable_interrupts(GLOBAL);//Habilito interrupción USART
lcd_init();
set_tris_D(0x00);
while(TRUE)
{
printf(lcd_putc,"\f");
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;
output_low(PIN_C0);
output_low(PIN_C2);
output_high(PIN_C1);
output_d(sacaNumero(num2));
delay_ms(5);
output_low(PIN_C0);
output_low(PIN_C1);
output_high(PIN_C2);
output_d(sacaNumero(num3));
delay_ms(5);
output_low(PIN_C1); //De aqui hacia abajo con mutacion de los transistores
output_low(PIN_C2);
output_high(PIN_C0);
output_d(sacaNumero(num1));
delay_ms(5);
}
}