▷ Mostrar Fecha y Hora en LCD Utilizando el Módulo RTC DS1307 con PIC

Aprende a implementar un reloj digital completo que muestra fecha y hora en un display LCD 16x2 utilizando el módulo RTC DS1307 y el microcontrolador PIC16F628A programado en MicroCode. Este proyecto integra comunicación I2C, manejo de memoria EEPROM y visualización en tiempo real.

📋 Materiales Requeridos

🖥️ Componentes Electrónicos

  • PIC 16F628A: Microcontrolador principal
  • Módulo RTC DS1307: Reloj en tiempo real
  • LCD 16x2: Pantalla de visualización
  • Cristal de 32.768 kHz: Reloj para el RTC
  • Potenciómetro 1kΩ: Ajuste de contraste del LCD
  • Resistencia 4.7kΩ: Pull-up para líneas I2C
  • Pila de 3V: Respaldo de alimentación para RTC

🔌 Diagrama de Conexiones

El diagrama esquemático muestra la integración completa del PIC16F628A, el módulo RTC DS1307, y el display LCD 16x2:

Diagrama de conexiones: PIC16F628A con RTC DS1307 y LCD 16x2

📌 Conexión PIC - LCD 16x2

El LCD se conecta al PIC en modo de 4 bits para ahorrar pines. Las líneas de control se conectan a través de PORTB, mientras que los datos se transmiten por PORTA:

PORTB.0 → RS (Selección de Registro)
PORTB.1 → E  (Habilitación)
PORTA.0 → D4 (Dato 4)
PORTA.1 → D5 (Dato 5)
PORTA.2 → D6 (Dato 6)
PORTA.3 → D7 (Dato 7)

🔗 Conexión RTC DS1307 - PIC

El módulo RTC se comunica con el PIC a través del protocolo I2C (Two-Wire Communication). Las líneas SDA y SCL deben conectarse correctamente:

Conexiones del módulo RTC DS1307 con pines I2C del PIC
PORTB.6 → SDA (Línea de Datos I2C)
PORTB.7 → SCL (Línea de Reloj I2C)
⚡ Importante: Las resistencias de pull-up de 4.7kΩ son necesarias en las líneas SDA y SCL si el módulo RTC no las incluye. La pila de 3V mantiene el RTC funcionando incluso sin alimentación principal.

💻 Código Fuente - MicroCode

El código implementa la lectura del RTC a través de I2C y muestra la información en el LCD. Incluye inicialización del RTC y actualización continua de la hora:

; Configurar pines analógicos como digitales
cmcon = 7

; Definición de pines del LCD
define LCD_DREG PORTA 
define LCD_DBIT 0 
define LCD_RSREG PORTB 
define LCD_RSBIT 0 
define LCD_EREG PORTB 
define LCD_EBIT 1

; Configuración I2C sin resistencia pull-up en SCL
DEFINE I2C_SCLOUT 1

; Definición de pines I2C
CPIN VAR Portb.7 ; Pin señal de reloj I2C (SCL)
DPIN VAR Portb.6 ; Pin de datos I2C (SDA)

; Variables para almacenar datos del RTC
segu VAR BYTE    ; Segundos (0-59)
minu VAR BYTE    ; Minutos (0-59)
hora VAR BYTE    ; Horas (0-23)
diaS VAR BYTE    ; Día de la semana (1-7)
diaF VAR BYTE    ; Día del mes (1-31)
mes VAR BYTE     ; Mes (1-12)
anio VAR BYTE    ; Año (00-99)
actualizado VAR BIT ; Bandera de actualización

; Leer estado de EEPROM para determinar si es la primera ejecución
READ 0, actualizado

; Si es la primera vez, grabar valores iniciales en el RTC
IF actualizado = 0 THEN grabarRTC

; Ciclo principal de lectura continua
INICIO:

    ; Leer todos los registros del RTC (dirección $D0)
    I2CREAD DPIN, CPIN, %11010000, 0, [segu]
    I2CREAD DPIN, CPIN, %11010000, 1, [minu]
    I2CREAD DPIN, CPIN, %11010000, 2, [hora]
    I2CREAD DPIN, CPIN, %11010000, 3, [diaS]
    I2CREAD DPIN, CPIN, %11010000, 4, [diaF]
    I2CREAD DPIN, CPIN, %11010000, 5, [mes]
    I2CREAD DPIN, CPIN, %11010000, 6, [anio]

    ; Limpiar LCD y posicionar cursor
    LCDOUT $FE, 1, $FE, 2

    ; Mostrar día de la semana
    IF diaS = $1 THEN LCDOUT "Dom."
    IF diaS = $2 THEN LCDOUT "Lun."
    IF diaS = $3 THEN LCDOUT "Mar."
    IF diaS = $4 THEN LCDOUT "Mie."
    IF diaS = $5 THEN LCDOUT "Jue."
    IF diaS = $6 THEN LCDOUT "Vie."
    IF diaS = $7 THEN LCDOUT "Sab."
    
    ; Mostrar día del mes
    LCDOUT " ", HEX2 diaF, "/"
    
    ; Mostrar mes (nombre abreviado)
    IF mes = $1 THEN LCDOUT "ene"
    IF mes = $2 THEN LCDOUT "feb"
    IF mes = $3 THEN LCDOUT "mar"
    IF mes = $4 THEN LCDOUT "abr"
    IF mes = $5 THEN LCDOUT "may"
    IF mes = $6 THEN LCDOUT "jun"
    IF mes = $7 THEN LCDOUT "jul"
    IF mes = $8 THEN LCDOUT "ago"
    IF mes = $9 THEN LCDOUT "sep"
    IF mes = $10 THEN LCDOUT "oct"
    IF mes = $11 THEN LCDOUT "nov"
    IF mes = $12 THEN LCDOUT "dic"
    
    ; Mostrar año (formato 20XX)
    LCDOUT "/20", HEX2 anio
    
    ; Segunda línea: mostrar hora:minuto:segundo
    LCDOUT $FE, $C0, HEX2 hora, ":", HEX2 minu, ":", HEX2 segu
    
    ; Pausa de 500ms antes de siguiente lectura
    PAUSE 500 
    
    ; Volver al inicio del ciclo
    GOTO INICIO

; Subrutina: Grabar valores iniciales en el RTC
grabarRTC:

    ; Grabar 00 segundos
    I2CWRITE DPIN, CPIN, %11010000, 0, [$00]
    PAUSE 10
    
    ; Grabar 32 minutos
    I2CWRITE DPIN, CPIN, %11010000, 1, [$32]
    PAUSE 10
    
    ; Grabar 15 horas
    I2CWRITE DPIN, CPIN, %11010000, 2, [$15]
    PAUSE 10
    
    ; Grabar día jueves (5)
    ; D=1, L=2, M=3, Mi=4, J=5, V=6, S=7
    I2CWRITE DPIN, CPIN, %11010000, 3, [$5]
    PAUSE 10
    
    ; Grabar día 21 del mes
    I2CWRITE DPIN, CPIN, %11010000, 4, [$21]
    PAUSE 10
    
    ; Grabar enero (mes 1)
    I2CWRITE DPIN, CPIN, %11010000, 5, [$1]
    PAUSE 10
    
    ; Grabar año 21 (2021)
    I2CWRITE DPIN, CPIN, %11010000, 6, [$21]
    PAUSE 10
    
    ; Marcar en EEPROM que ya se grabó el RTC
    WRITE 0, 1
    
    ; Volver al ciclo principal
    GOTO INICIO

🔍 Explicación Detallada del Código

📊 Lectura I2C del RTC

El RTC DS1307 almacena los datos de tiempo en registros secuenciales accesibles a través de I2C:

  • Dirección I2C: $D0 (escritura) / $D1 (lectura)
  • Registro 0: Segundos (00-59)
  • Registro 1: Minutos (00-59)
  • Registro 2: Horas (00-23)
  • Registro 3: Día de semana (1-7)
  • Registro 4: Día del mes (01-31)
  • Registro 5: Mes (01-12)
  • Registro 6: Año (00-99)

🔄 Ciclo de Actualización

El programa implementa un ciclo continuo que:

  • Lee todos los registros del RTC cada 500ms
  • Procesa los valores y realiza conversiones de formato
  • Muestra la información en el LCD en dos líneas
  • Repite el ciclo indefinidamente
Variable Propósito Rango
segu Almacena segundos 00-59
minu Almacena minutos 00-59
hora Almacena horas 00-23
diaS Día de la semana 1-7
mes Número de mes 1-12

💡 Características Principales del Sistema

  • Comunicación I2C: Protocolo de dos hilos para sincronización confiable
  • Batería de respaldo: Mantiene la hora incluso sin alimentación principal
  • EEPROM interna: Detecta si es la primera ejecución y configura el RTC automáticamente
  • Formato legible: Muestra fecha con nombres de meses y días de semana
  • Actualización continua: Refresco cada 500ms para precisión
  • Hora en formato 24H: Muestra horas de 00 a 23

🔧 Configuración Personalizada

Para establecer una hora y fecha diferente, modifica los valores en la subrutina grabarRTC:

; Ejemplo: Cambiar a las 10:45:30, 15 de marzo de 2024
I2CWRITE DPIN, CPIN, %11010000, 0, [$30] ; 30 segundos
I2CWRITE DPIN, CPIN, %11010000, 1, [$45] ; 45 minutos
I2CWRITE DPIN, CPIN, %11010000, 2, [$10] ; 10 horas
I2CWRITE DPIN, CPIN, %11010000, 3, [$5]  ; Jueves (5)
I2CWRITE DPIN, CPIN, %11010000, 4, [$15] ; 15 del mes
I2CWRITE DPIN, CPIN, %11010000, 5, [$3]  ; Marzo (3)
I2CWRITE DPIN, CPIN, %11010000, 6, [$24] ; 2024

⚙️ Consejos de Implementación

✅ Buenas Prácticas

  • Verificar alimentación: Asegurar 5V al PIC y 3V al módulo RTC
  • Pila de respaldo: Usar batería CR2032 de 3V para mantener la hora
  • Resistencias pull-up: Necesarias en líneas I2C si el módulo no las incluye
  • Cristal de 32.768 kHz: Esencial para precisión del reloj
  • Delays en I2C: Respetar pausas de 10ms entre escrituras

⚠️ Solución de Problemas

  • LCD no muestra: Verificar conexiones y ajustar contraste con potenciómetro
  • Hora no se actualiza: Revisar conexiones I2C (SDA/SCL)
  • Valores incorrectos: Validar formato hexadecimal de los valores escritos
  • RTC se reinicia: Verificar que la batería está conectada correctamente
  • Comunicación I2C lenta: Revisar resistencias pull-up
📥 Descarga el Código y Simulación

Accede al código fuente completo, simulación en Proteus y documentación técnica del proyecto

🎓 Lo que has Aprendido

Al completar este proyecto, dominas la comunicación I2C con módulos RTC, el manejo de displays LCD 16x2, la lectura y escritura en memoria EEPROM, y la implementación de reloj en tiempo real. Estas habilidades son fundamentales para sistemas de monitoreo, dataloggers y aplicaciones embebidas con marca de tiempo.

💬 ¿Tienes dudas sobre la implementación? ¡Comparte tus preguntas en los comentarios y te ayudamos a resolverlas! Si lograste implementar el proyecto correctamente, cuéntanos tu experiencia.

0/Deja un comentario/Comentarios

¡Hola! Nos alegra mucho que hayas llegado hasta aquí y que estés leyendo este artículo en Edeptec.
Este formulario es un espacio abierto para ti: puedes dejar un comentario con tus dudas, sugerencias, experiencias o simplemente tu opinión sobre el tema tratado.

» ¿Te resultó útil la información?
» ¿Tienes alguna experiencia personal que quieras compartir?
» ¿Se te ocurre algún tema que te gustaría ver en próximos artículos?

Recuerda que este espacio es para aprender y compartir, por eso te animamos a participar de manera respetuosa y constructiva. Tus comentarios pueden ayudar a otros lectores que están en el mismo camino, ya sea en electrónica, programación, deportes o tecnología.

¡Gracias por ser parte de esta comunidad de aprendizaje! Tu participación es lo que hace crecer este proyecto.