'NOMBRE: 16F88_LCD_RTC 'VERSION: 1.0 'MICRO: PIC16f88A 'FECHA/AUTOR: 12/06 - By COS 'DESCRIPCION: MUESTRA EN EL DISPLAY LA FECHA Y LA HORA 'para transferir la hora al reloj dejar pulsada la tecla S1 '****************************************************************************
'--------------------Puertos del LCD-----------------------------------------
Define LCD_BITS = 4 'indicamos que el bus de datos del lcd sera de 4bit Define LCD_DREG = PORTA 'el bus de datos sera el puerto A Define LCD_DBIT = 0 'el bus de datos seran los 4 bit menos significativos del puerto A Define LCD_RSREG = PORTB 'el bit de nrol RS sera del puerto B Define LCD_RSBIT = 7 'se usara el RB7 como RS Define LCD_EREG = PORTB 'el bit de nrol E sera del puerto B Define LCD_EBIT = 6 'se usara el RB6 como E 'Define LCD_RWREG = PORTx 'el bit de nrol RW sera del puerto x(no se usa) 'Define LCD_RWBIT = n 'se usara el Rxn como RW (no se usa) Define LCD_COMMANDUS = 2000 'Tiempo de espera despues de ejecutar un comand del lcd en uSeg. Define LCD_DATAUS = 50 'Tiempo de espera despues de enviar un dato al LCD en uSeg. Define LCD_INITMS = 50 'Tiempo de espera despues de inicializar el Display, solo se ejecuta una vez en mSeg. ' '---------------------Puerto I2C--------------------------------------------- Symbol sda = PORTB.1 'asignamos nombre al pin que hara de SDA del puerto I2C Symbol scl = PORTB.4 'asignamos nombre al pin que hara de SCL del puerto I2C ' '***************DEFINICION DE VARIABLES************************************** ' '------------------Variables Programa---------------------------------------- Dim aux_4h As Byte 'contendra el nibble alto del dato leido por el I2C Dim aux_4l As Byte 'contendra el nibble bajo del dato leido por el I2C Dim i As Byte 'variable indice Dim reg(7) As Byte 'contendra los valores finales de fecha y hora en el sistema decimal '----------------------ASIGNACIONES------------------------------------------ '******************DEFINICION DE PUERTOS************************************* '-------------ASIGNACION DE I/O y valores de inicio de las salidas----------- ANSEL = %00000000 'los pin I/O digitales puerto A CMCON = 0x07 'comparador a off puerto A OSCCON = 0x7e 'set intrc To 8mhz, se usara reloj interno a 8Mhz TRISA = 0x00 'Puerto A como salidas TRISB = 0x00 'puerto B como salidas TRISA.4 = 1 'como entrada (RA4, adc) TRISA.6 = 1 'como entrada (RA6, tecla S1) TRISA.5 = 1 'como entrada (RA5, tecla S2) PORTB.3 = 1 'luz lcd a on (RB3) PORTA.7 = 1 'led amarillo a off PORTB.0 = 1 'led verde a off ' '***************Inicio Programa********************************************** Lcdinit 'inicializa el lcd sin cursor WaitMs 1000 'espera 1Seg Lcdout "16f88LCD_RTC/I2C" 'escribe en el lcd Lcdcmdout LcdLine2Home 'seleciona la linea dos como proxima para escritura Lcdout "Pruebas con I2C" 'escribe en el lcd WaitMs 3000 'espera 3Seg Lcdcmdout LcdClear '--------------------inicializacion del reloj--------------------------------- ' '------------Aqui escribimos los valores para cargar al RTC------------------- If RA6 = 0 Then 'si la tecla S1 esta pulsada pasaremos los datos al reloj I2CWrite sda, scl, 0xd0, 0, 0x00 'segundos, escrito en hex, porque coincide en este caso con BCD del RTC I2CWrite sda, scl, 0xd0, 1, 0x59 'minutos I2CWrite sda, scl, 0xd0, 2, 0x23 'horas I2CWrite sda, scl, 0xd0, 3, 0x01 'dia de la semana I2CWrite sda, scl, 0xd0, 4, 0x31 'dia del mes I2CWrite sda, scl, 0xd0, 5, 0x12 'mes I2CWrite sda, scl, 0xd0, 6, 0x06 'ao I2CWrite sda, scl, 0xd0, 7, 0x10 'salida a 1hz Endif ' '-----------------------Main Programa----------------------------------------- main: Gosub print_lcd 'actualiza la hora WaitMs 100 'pausa de 100mSeg. Goto main End ' '--------------------------FIN DEL MAIN---------------------------------------- ' '**********************Subrrutinas********************************************* ' 'lee la hora del RTC, la pasa a decimal y la envia al lcd print_lcd: i=0 While i <= 6 'se repite el codigo comprendido entre while y wend, mientras i sea menor o igual a 6 I2CRead sda, scl, 0xd0, i, reg(i) 'lectura de la direccion de memoria indicada del RTC, formato BCD aux_4l = reg(i) And %00001111 'eliminamos los bit de configuracion del RTC y dejamos solo el nibble bajo If i = 0 Then aux_4h = reg(i) And %01110000 'segundos, borrado de bit configuracion y almacena nibble alto If i = 1 Then aux_4h = reg(i) And %11110000 'minutos, almacena nibble alto If i = 2 Then aux_4h = reg(i) And %10110000 'horas, borrado de bit configuracion y almacena nibble alto If i = 3 Then aux_4h = reg(i) And %11110000 'dia_semana, almacena nibble alto If i = 4 Then aux_4h = reg(i) And %11110000 'dia_mes, almacena nibble alto If i = 5 Then aux_4h = reg(i) And %11110000 'mes, almacena el nibble alto If i = 6 Then aux_4h = reg(i) And %11110000 'ao, almacena el nibble alto aux_4h = ShiftRight(aux_4h, 4) 'convierte el nibble alto en bajo reg(i) = (aux_4h * 10) + aux_4l 'fusiona los nibbles alto y bajo en una sola variable en formato decimal i=i+1 'incrementa la variable indice con cada repeticion del bucle While/Wend Wend 'fin del bucle y salta a While Lcdcmdout LcdLine1Home 'cursor del lcd a la izquierda en la linea 1 If reg(2) < 10 Then Lcdout "0" 'si horas es inferior a 10 escribe el cero delante Lcdout #reg(2), ":" 'escribe la hora y el separador If reg(1) < 10 Then Lcdout "0" 'si minutos es inferior a 10 escribe el cero delante Lcdout #reg(1), ":" 'escribe los minutos y el separador If reg(0) < 10 Then Lcdout "0" 'si segundos es inferior a 10 escribe el cerodelante Lcdout #reg(0) 'escribe los segundos Lcdcmdout LcdLine2Home 'cursor del lcd a la izquierda en la linea 2 If reg(3) = 1 Then Lcdout "Dom" 'asigna el literal al dia de la semana If reg(3) = 2 Then Lcdout "Lun" If reg(3) = 3 Then Lcdout "Mar" If reg(3) = 4 Then Lcdout "Mie" If reg(3) = 5 Then Lcdout "Jue" If reg(3) = 6 Then Lcdout "Vie" If reg(3) = 7 Then Lcdout "Sab" Lcdout "/" 'escribe separador If reg(4) < 10 Then Lcdout "0" 'si dia del mes es inferior a 10 escribe cero Lcdout #reg(4), "/" 'escribe el dia del mes y el separador If reg(5) < 10 Then Lcdout "0" 'si mes es inferior a 10 escribe cero Lcdout #reg(5), "/20" 'escribe el mes, separador y los dos primeros digitos del ao de 4 digitos If reg(6) < 10 Then Lcdout "0" 'si ao es inferior a 10 escribe primero el cero Lcdout #reg(6) 'escribe el ao Return End