Hola!
Otra forma de hacerlo es implementando un reloj con el PIc, para ello te ayudas de un timer de 16 bits (timer1 en caso de los 16FXXXX o un timer0 en caso de 18FXXXX), yo lo he hecho en asm con 16f628 y con el 16F877 ahora lo he implementado en C para un 18F4550, ojala te sirva de algo, aqui te dejo el codigo
:
#include<p18f4550.h>
#include<delays.h>
#include<stdlib.h>
#include "D:\Enrique\curso_pic\codigoC\lcd.h"
#pragma config PLLDIV=5//CONFIG1L
#pragma config FCMEN = OFF,IESO = OFF,FOSC=HS //CONFIG1H
#pragma config PWRT = OFF,BORV = 0 //CONFIG2L
#pragma config WDT = OFF,WDTPS = 32768 //CONFIG2H
#pragma config MCLRE = ON,LPT1OSC = OFF,PBADEN = OFF, CCP2MX = OFF//CONFIG3H
#pragma config STVREN = OFF,LVP = OFF,XINST = OFF,DEBUG = OFF//CONFIG4L
#pragma config CP0 = OFF,CP1 = OFF,CP2 = OFF//CONFIG5L
#pragma config CPB = OFF,CPD = OFF//CONFIG5H
#pragma config WRT0 = OFF,WRT1 = OFF,WRT2 = OFF//CONFIG6L
#pragma config WRTB = OFF,WRTC = OFF,WRTD = OFF//CONFIG6H
#pragma config EBTR0 = OFF,EBTR1 = OFF,EBTR2 = OFF//CONFIG7L
#pragma config EBTRB = OFF//CONFIG7H
void interrupciones(void);//prototipo de la interrupción
static int seg=0,min=0,hor=0;
static char s,m,h;
//******************************************************//
// Vector de Interrupcion
//******************************************************//
#pragma code prioridad_nomal = 0X0008
void interrupcion_normal (void)
{
_asm goto interrupciones _endasm
}
#pragma code
//******************************************************//
// Rutina de Interrupcion
//******************************************************//
#pragma interrupt interrupciones
void interrupciones(void)
{
if(INTCONbits.INT0IF=1) //pregunta por bandera de interrupcion
{
TMR0H = 0X67,TMR0L = 0X69;
PORTB=~PORTB;
seg++;
if(seg==60)
{
seg=0;
min++;
if(min==60)
{
min=0;
hor++;
if(hor==10)
{
hor=0;
min=0;
seg=0;
}
}
}
}
while(BusyXLCD()); // Wait if LCD busy
WriteCmdXLCD(CLEAR); // Clear display
itoa(hor,h);
while(BusyXLCD());
putsXLCD(h);
while(BusyXLCD());
WriteDataXLCD(':');
itoa(min,m);
while(BusyXLCD());
putsXLCD(m);
while(BusyXLCD());
WriteDataXLCD(':');
while(BusyXLCD());
itoa(seg,s);
putsXLCD(s);
INTCONbits.TMR0IF = 0;
}
//******************************************************//
// Programa Principal
//******************************************************//
void main(void)
{
RCON = 0X00;//IPEN = 0
T0CON = 0X86;//TMR0ON=1 config del timer 0
//T08BIT=0 T0 a 16 bits
//T0CS=0 clock interno
//T0SE=0 low-to-high transition
//PSA=0 prescaler ON
//T0PS2=1 Prescaler = 1:128 (110)
//T0PS1=1
//T0PS0=0
TMR0H = 0X67,TMR0L = 0X69;//inicializamos registros del timer0
RCONbits.IPEN=0;//IPEN = 0 prioridad de interrupciones deshabilitada
INTCON = 0XA0;//configuramos la interrupcion del timer0
OpenXLCD(FOUR_BIT & LINES_5X7);
while(BusyXLCD());
WriteCmdXLCD(BLINK_OFF);
while(BusyXLCD());
WriteCmdXLCD(CLEAR);
itoa(hor,h);
while(BusyXLCD());
putsXLCD(h);
while(BusyXLCD());
WriteDataXLCD(':');
itoa(min,m);
while(BusyXLCD());
putsXLCD(m);
while(BusyXLCD());
WriteDataXLCD(':');
while(BusyXLCD());
itoa(seg,s);
putsXLCD(s);
while(1);
}
En el codigo anterior utilice un cristal de 20MHz y la libreria lcd.h la puedes encontrar en el foro
jeje
Pero te adelanto que las conexiones son al puerto D: E=RD0,RS=RD1, R/W=RD2, D4=RD4....D7=RD7 si lo piensas simular en proteus.. espero que te sirva de ayuda