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:
📌 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:
PORTB.6 → SDA (Línea de Datos I2C) PORTB.7 → SCL (Línea de Reloj I2C)
💻 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
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.
Publicar un comentario
¡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.