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



## javsepulvedaa (May 10, 2013)

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

```
//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);
}
}
```


----------



## lee (May 13, 2013)

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.


----------



## MrCarlos (May 14, 2013)

Hola javsepulvedaa

Quién Copiará a quien ??
*Lee* está haciendo lo mismo que Tú. Visitalo aquí:
https://www.forosdeelectronica.com/f24/problemas-reloj-tiempo-real-98375/#post802900

En tu código te falta especificar las variables que debe escribir en el LCD:
Lcd_Out( 2, 8, "XX:XX:XX");
Lcd_Out( 2, 8, "XX:XX:XX*",A, B, C*); POR EJEMPLO.

saludos
a sus ordenes


----------



## MrCarlos (May 14, 2013)

Hola lee

Quién Copiará a quien ??
*Javsepulvedaa* está haciendo lo mismo que Tú. Visítalo aquí:
https://www.forosdeelectronica.com/f24/reloj-digital-pic16f877a-lcd-2x16-timer-interno-c-98175/#post801673

y si juntas estas 3 lineas en una sola??
Lcd_Out( 2, 7, Text3); 
Lcd_Out( 2, 9, Text2);
Lcd_Out( 2, 10, Text1);

*Se podría hacer así ??*
Lcd_Out( 2, 7, Text3, Texto2, Texto1);
Crees que funcione ??

saludos
a sus ordenes


----------



## Fogonazo (May 14, 2013)

Ver el archivo adjunto 90294

MrCarlos dijo:


> *Quién Copiará a quien ??*


----------



## lee (May 14, 2013)

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...


----------



## MrCarlos (May 14, 2013)

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


----------



## Saint_ (May 17, 2013)

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.


```
//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;
```


----------

