Reloj digital Pic16F877a con lcd 2x16 y timer interno en C

Estimados disculpen las molestias, pero tengo una gran duda ya que no se como configurar el timer interno del pic 16F877a, para que me cumpla la función de reloj en tiempo real, es decir Horas/minutos/segundos.
Mi segundo problema concurre a que el programa que adjuntare mas adelante, lo cargue a la PIC 16f877a y lo conecte al LCD 2x16 y no proyecta nada, pensando que podía estar malo el LCD cargue un programa básico y para mi sorpresa el LCD lo proyecto sin ningún problema y e revisado la programación y no encuentro el error,o simule en proteus y corre sin ningún problema.
Lo estoy programando en mikroc y no ocupo macros, el cristal que tengo es de 4 mhz y utilizo un LCD 2x16 conectado a 4 bit.
Espero puedan ayudarme con el código de este programa y seguir adquiriendo conocimientos.
De ante mano muchas gracias.

PD: estoy programando en C

Adjunto el programa y la conexión en proteus
Código:
//Definición de pines del LCD
sbit LCD_RS at RB4_bit;
sbit LCD_EN at RB5_bit;
sbit LCD_D7 at RB3_bit;
sbit LCD_D6 at RB2_bit;
sbit LCD_D5 at RB1_bit;
sbit LCD_D4 at RB0_bit;
//Definición de los TRIS del LCD
sbit LCD_RS_Direction at TRISB4_bit;
sbit LCD_EN_Direction at TRISB5_bit;
sbit LCD_D7_Direction at TRISB3_bit;
sbit LCD_D6_Direction at TRISB2_bit;
sbit LCD_D5_Direction at TRISB1_bit;
sbit LCD_D4_Direction at TRISB0_bit;
void main( void )
{
//Declaración de variables.
unsigned int  PreI,Radc1,Radc2,Radc3,Radc4,Radc5,Radc6;
float Pre, Pre1;
char Text[16];
// Configuracion puerto D.
TRISD=0;
PORTD=0;
//Inicio del LCD.
Lcd_Init();
//Borrado del cursor.
Lcd_Cmd(_LCD_CURSOR_OFF);
//Impresión de texto de inicio.
Lcd_Out( 1, 4, "INTELLIGENT");
Lcd_Out( 2, 6, "CARPET");
delay_ms(3000);
Lcd_Init();
Lcd_Cmd(_LCD_CURSOR_OFF);
Lcd_Out( 1, 4, "CARGANDO");
Lcd_Out( 2, 6, "DATOS");
delay_ms(3000);
Lcd_Init();
Lcd_Cmd(_LCD_CURSOR_OFF);
//Impresión de texto de Variables.
Lcd_Out( 1, 1, "PESO :");
Lcd_Out( 2, 1, "HORA :");
while(1) //Bucle infinito.
{
//Lectura del canal 0 y Muestreo de datos para Promedio.
Radc1 = ADC_Read(0);
delay_ms(150);
Radc2 = ADC_Read(0);
delay_ms(150);
Radc3 = ADC_Read(0);
delay_ms(150);
Radc4 = ADC_Read(0);
delay_ms(150);
Radc5 = ADC_Read(0);
delay_ms(150);
Radc6 = ADC_Read(0);
delay_ms(150);
Pre = Radc1+Radc2+Radc3+Radc4+Radc5+Radc6/6;
Pre1 = 0.10861*Pre+10,5555;
//Se forza el resultado a la parte entera.
PreI = Pre1;
//Se convierte el número entero a una cadena de caracteres.
IntToStr( PreI, Text );
//Se imprime el resultado.
Lcd_Out( 1, 7, Text);
//Retardo de 100m segundos.
delay_ms(100);
//Sentencia if para SetPoint.
if (PreI=25)
PORTD.F0=1; //Prende el LED
else
PORTD.F0=0; //Apaga el Led
Lcd_Out( 2, 8, "XX:XX:XX");
delay_ms(100);
}
}
 

Adjuntos

  • proteus.jpg
    proteus.jpg
    204 KB · Visitas: 153
Última edición por un moderador:
Estimados :

juntos con saludarlos tengo un problema, estoy realizando un programa Mikroc con el pic16f877a en el cual hago entre otras cosas un oscilador con un pin configurado como salida y luego lo introduzco en una entrada... lo cual lo utilizo para incrementar un contador para mostrar la hora a tiempo real en un lcd.... mi problema es que no muestra la variable de minutos y hora, solo segundo... les agradecería si me ayudan y me orientan... Gracias. :)
 

Adjuntos

  • gordito.txt
    2.5 KB · Visitas: 79
  • gordito.jpg
    gordito.jpg
    79.5 KB · Visitas: 91
Gracias MrCarlos... pero realizo el cambio que tu me sugieres pero el software al compilar me indica el error de " demasiados parámetros "... que puede ser??? te agradezco el interes...
 
Hola lee

Viendo la Ayuda(Help) para: IntToStr
Tu Código:
IntToStr( segundos++, Text1 ); // Se convierte el número entero a una cadena de caracteres.
IntToStr( minutos++, Text2 ); //
IntToStr( horas++, Text3 ); //

Me Dice:
IntToStr(int input, char *output);
Pero Tú tienes definidos: horas, minutos y segundos como char

Tu Código:
unsigned int PreI,Radc1,Radc2,Radc3,Radc4,Radc5,Radc6; // Declaración de variables.
char segundos, minutos, horas, contador;
float Pre, Pre1;
char Text[16],Text1[16],Text2[16],Text3[16]; // Esto Creo está correcto.

Ahora para escribir en el LCD esas 3 variables creo que primero debes poner una mascarilla, yo no sé como, pero algo así:
Lcd_Out(##, ##, ## Text3, Text2, Text1);
O tal vez solo así:
Lcd_Out(Text3, Text2, Text1);

saludos
a sus ordenes
 
Hola lee, esta una solucion al problema del LCD.
Por otro lado, tendras que trabajar un poco mas con tu codigo pues asi como esta creo que no va por el buen camino.

Código:
//Se convierte el número entero a una cadena de caracteres.
        byteToStr( segundos++,Text1 );
        byteToStr( minutos++,Text2 );
        byteToStr( horas++,Text3 );

Lcd_Out(2,7,Text3);
Lcd_Out_cp(Text2);
Lcd_Out_cp(Text1);
delay_ms(10);
T0IF_bit=0;
 

Adjuntos

  • Dibujo.jpg
    Dibujo.jpg
    71.5 KB · Visitas: 111
Última edición:
Atrás
Arriba