Mira aquí como mostrar fecha y hora en un LCD utilizando el modulo RTC DS1307 y PIC, programado en MICROCODE
MATERIALES:
- PIC 16F628A
- Modulo RTC DS1307
- LCD 16x2
- Crystal de 32768KHz
- Potenciometro de 1k
- Resistencia de 4.7k
- Pila de 3v
DIAGRAMA DE CONEXIONES:

Conexión PIC/LCD 16x2:
Conectamos los pines del PIC con los del lcd de la siguiente manera:
PORTB.0 con RS
PORTB.1 con E
PORTA.0 con D4
PORTA.1 con D5
PORTA.2 con D6
PORTA.3 con D7
Conexión RTC BOARD/PIC

PORTB.6 con SDA
PORTB.7 con SCL
CÓDIGO EXPLICADO:
cmcon = 7; convertimos los pines analógicos en digitales ;Definimos los pines en donde ira conectado el 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 DEFINE I2C_SCLOUT 1 ;para que no necesite resistencia pull-up en SCL CPIN VAR Portb.7 ;pin señal de reloj I2C DPIN VAR Portb.6 ;pin de datos I2C segu VAR BYTE ;definir tamaño de variable segundos 1 a 255 minu VAR BYTE ;variable para los minutos hora VAR BYTE ;variable para las horas diaS VAR BYTE ;variable día de la semana diaF VAR BYTE ;variable día fecha del mes mes VAR BYTE ;variable mes anio VAR BYTE ;variable año de 2 dígitos actualizado VAR BIT ;variable para almacenar un 1 o 0 EEPROM 0,[0] ;memoria 0 con el valor inicial 0, sirve para ;indicar que nunca ha corrido este programa READ 0,actualizado ;carga el valor de la memoria EEPROM dirección 0 IF actualizado =0 THEN grabarRTC ;si es la 1ra vez que corre ir a grabar RTC ;caso contrario sólo leer el RTC INICIO: I2CREAD DPIN,CPIN,%11010000,0,[segu] ;leer los datos de mem. 0, I2CREAD DPIN,CPIN,%11010000,1,[minu] ;1,2,..y guardarlos en sus I2CREAD DPIN,CPIN,%11010000,2,[hora] ;respectivas variables I2CREAD DPIN,CPIN,%11010000,3,[diaS] I2CREAD DPIN,CPIN,%11010000,4,[diaF] I2CREAD DPIN,CPIN,%11010000,5,[mes] I2CREAD DPIN,CPIN,%11010000,6,[anio] 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." lcdout hex2 diaf ;mostrar día del mes LCDOUT "/" ;mostrar el mes 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" LCDOUT "/20" lcdout hex2 anio ; mostrar año /20 + 21 LCDOUT $fe,$c0,HEX2 hora,":", HEX2 minu,":", HEX2 segu ;mostrar la hora ; min y segs. en 2 dígitos (HEX2) PAUSE 500 GOTO inicio ;volver a leer los datos ; ************************ subrutina grabar ********************* grabarRTC: I2CWRITE DPIN,CPIN,%11010000,0,[$00] ;setear 00 segundos PAUSE 10 ;retardo para finalizar grabación I2CWRITE DPIN,CPIN,%11010000,1,[$32] ;setear 32 minutos PAUSE 10 I2CWRITE DPIN,CPIN,%11010000,2,[$15] ;setear las 15 horas PAUSE 10 I2CWRITE DPIN,CPIN,%11010000,3,[$5] ;setear día jueves, D=1,L=2 PAUSE 10 ;M=3, M=4, J=5, V=6, S=7 I2CWRITE DPIN,CPIN,%11010000,4,[$21] ;setear día 21 del mes PAUSE 10 I2CWRITE DPIN,CPIN,%11010000,5,[$1] ;setear mes enero PAUSE 10 I2CWRITE DPIN,CPIN,%11010000,6,[$21] ;setear año 21 PAUSE 10 WRITE 0,1 ;escribe en la memoria 0 el valor de 1 para que no ;se vuelva a grabar otra vez estos datos en el RTC GoTo INICIO
Publicar un comentario