'****************************************************************
'* Name : UNTITLED.BAS *
'* Author : PABLO DOMINGUEZ SUAREZ *
'* Notice : Copyright (c) 2014 *
'* : All Rights Reserved *
'* Date : 20/08/2014 *
'* Version : 1.0 *
'* Notes : INSOLADORA LED SMD 5050 *
'* : *
'****************************************************************
Device = 16F877A
Xtal 8
Declare Reminders = Off 'Los errores o avisos que pueda haber entre reminders off y on son ignoradas y no se muestran como aviso
Config CP_OFF, DEBUG_OFF, WRT_OFF, CPD_OFF, LVP_OFF, BODEN_OFF, PWRTE_OFF, WDT_ON, HS_OSC
Declare Reminders = On
Declare LCD_Type 0
Declare LCD_DTPin PORTD.4
Declare LCD_RSPin PORTC.7
Declare LCD_ENPin PORTC.6
Declare LCD_Lines 2
Declare SDA_Pin PORTC.4
Declare SCL_Pin PORTC.3
Declare Slow_Bus no
All_Digital true 'COMPARADORES ANALOGICOS Y CONVERTIDOR A/D DESACTIVADOS
Dim seg As Byte
Dim minu As Byte
Dim hora As Byte
Dim semana As Byte
Dim dia As Byte
Dim mes As Byte
Dim anio As Byte
Dim temperatura As Byte
Dim temperatura1 As Byte
Dim temp1 As Byte
Dim temp2 As Byte
Dim temp As Byte
Dim x As Bit 'bit para cambiar de formato 12/24H
Dim rebote As Bit
Dim posicion As Byte
Dim contador As Byte
Dim rhora As Bit
Dim rselec As Bit
Symbol leeclock=%11010001 '4 bits de mas peso indican la direccion fisica del RTC,el primer bit de menos peso"1" indica modo lectura
Symbol grabaclock=%11010000 '4 bits de mas peso indican la direccion fisica del RTC,el primer bit de menos peso"0" indica modo grabacion
Symbol formato=PORTE.2
Symbol selec=PORTE.1
TRISA = 0
TRISB = 0
TRISC = 0
TRISD = 0
TRISE = 1
'********************************
PORTA = 0
PORTB = 0
PORTC = 0
PORTD = 0
PORTE = 0
DelayMS 10
Cls
x=0
rebote=0
posicion=0
rselec=0
inicio:
'ESTABLECEMOS EL TIEMPO A MOSTRAR AL INICIO DEL PROGRAMA
seg=00
temp=seg
GoSub BIN_TO_BCD
seg=temp
minu=20
temp=minu
GoSub BIN_TO_BCD 'Convertimos todos los datos decimales en BCD para posteriormente grabarlos en la memoria del ds3231
minu=temp
hora=3
temp=hora
GoSub BIN_TO_BCD
hora=temp
semana=4
temp=semana
GoSub BIN_TO_BCD
semana=temp
dia=5
temp=dia
GoSub BIN_TO_BCD
dia=temp
mes=2
temp=mes
GoSub BIN_TO_BCD
mes=temp
anio=15
temp=anio
GoSub BIN_TO_BCD
anio=temp
configura:
BStart
BusOut grabaclock,14,[%00011100] '%11010000 "ES LA DIRECCION DE CONTROL" EL ULTIMO "0" INDICA ESCRITURA,PARA LEER PONEMOS "1"
DelayMS 15 '14 EN DECIMAL ES LA DIRECCION DE MEMORIA DONDE ESCRIBIMOS
BStop
BStart
BusOut grabaclock,$0h,[seg,minu,hora,semana,dia,mes,anio] 'SEG,MIN,HORAS:IMPORTANTE**ESTAN EN CODIGO BCD ,NO EN CODIGO BINARIO(01010101=55) OSEA 0101=5 0101=5 :->55
DelayMS 15
BStop
'INICIO DE LA LECTURA DEL RELOJ
Leer_tiempo:
BStart
BusIn leeclock,0,[seg,minu,hora,semana,dia,mes,anio] 'ESTABLECEMOS EN LA DIRECCION QUE VAMOS A LEER"11010001", "0" LEEMOS DE LA POSICION CERO DEL REGISTRO QUE ES LA LECTURA DE LOS SEG
DelayMS 15 ' Y "T" LA VARIABLE DONDE ALMACENAMOS EL VALOR DE LA LECTURA (OJO VALOR EN BCD)
BStop
BStart
BusIn %11010001,$11h,[temperatura] 'VALOR ENTERO
DelayMS 15
BStop
BStart
BusIn %11010001,$12h,[temperatura1] 'VALOR DECIMAL
DelayMS 15
BStop
'*****AHORA CONVERTIMOS TODAS LAS LECTURAS QUE ESTAN EN BCD A BINARIO PARA PODER MOSTRARLAS POSTERIORMENTE EN VALOR DECIMAL EN EL LCD
temp=seg
GoSub BCD_TO_BIN
seg=temp
temp=minu
GoSub BCD_TO_BIN
minu=temp
temp=hora
GoSub BCD_TO_BIN
hora=temp
temp=semana
GoSub BCD_TO_BIN
semana=temp
temp=dia
GoSub BCD_TO_BIN
dia=temp
temp=mes
GoSub BCD_TO_BIN
mes=temp
temp=anio
GoSub BCD_TO_BIN
anio=temp
Leer_temperatura:
temperatura1=temperatura1>>6 'DS3231 TIENE UNA RESOLUCION DE 0.25ºC.ESTA ALOJADO EN LAS POSICIONES 6 Y 7,OSEA BIT 6 Y 7.POR LO TANTO DESPLAZAMOS LOS BIT 6 POSICIONES
temperatura1=(temperatura1*25) 'PARA COLOCAR ESOS BIT EN LA POSICION 0 Y 1.LUEGO MULTIPLICAMOS POR 25 QUE ES LA RESOLUCION.MULTIPLICAMOS POR EL NUMERO ENTERO Y NO POR 0.25 PORQUE
temperatura1=Dig temperatura1,1 'AL MOSTAR EN EL LCD MOSTRAMOS EN VALOR EN ENTERO,LUEGO UN PUNTO"."Y DESPUES EL VALOR DECIMAL COMO SI FUESE UN ENTERO.POR ULTIMO COGEMOS EL SEGUNDO NUMERO
' GoSub lcd 'CON EL COMANDO DIG PARA MOSTRAR SOLO 1 NUMERO Y NO LOS 2.OSEA SI EL VALOR MEDIDO FUESE 50.SOLO MOSTRAMOS EL 5
' GoSub lcd
'cambio_hora: 'cambio de formato 12/24H
' If formato=1 And rebote=0 Then Toggle x:rebote=1
' If x=0 And hora>=12 Then hora=hora-12 '*******AÑADIR ESTA LINEA SI QUEREMOS MOSTRAR LA HORA EN FORMATO 12H Y NO EN 24H
' ' If x=0 And hora>=0 Then hora=hora+12
' If hora=24 then hora=0 'TENER EN CUENTA QUE POR DEFECTO ESTA CONFIGURADO EL REGISTRO PARA CONTAR EN FORMATO 24H
' If formato=0 Then rebote=0
' 'Return
GoSub lcd
If selec=1 Then GoSub horas
GoTo Leer_tiempo
horas:
Cursor 1,6
Print $FE,$0F
hora=hora+1
temp=hora
GoSub BIN_TO_BCD
hora=temp
BStart
BusOut grabaclock,$2h,[hora]
DelayMS 15
BStop
rhoras:
DelayMS 15
If selec=1 Then rhoras
t:
If selec=0 Then t
Print $FE, $0C
GoTo Leer_tiempo
'******************************************************
BCD_TO_BIN: ' Convert the BCD values into BIN
temp=((temp>>4)*10+(temp&%1111))
' seg=((seg>>4)*10+(seg&$0f)) 'CUALQUIERA DE LAS 3 FORMAS ES VALIDA ,SOLO CAMBIAMOS EL VALOR FINAL EN DECIMAL,BIN Y HEX $0F
'seg=((seg>>4)*10+(seg&15))
' hora=hora^%01000000)
Return
'******************************************************
BIN_TO_BCD:
'EJEMPLO SI EL VALOR FUESE 42 "DIG (VALOR)"
temp1 = Dig temp, 0 '00000010 '10=2 COGEMOS EL DECIMAL EN LA POSICION CERO.OSEA EL 2
temp2 = Dig temp, 1 '00000100 '100=4 AHORA COGEMOS EL DECIMAL EN LA SEGUNDA POSICION OSEA EL 4
temp2 = temp2 << 4 '01000000 EL 4 EN BINARIO ES = A 100,DESPLAZAMOS 4 BIT A LA IZQUIERDA Y NOS QUEDA 1000000
temp = temp1 ^ temp2 ' XOR THEM TOGTHER TO MAKE THE WHOLE BCD NUMBER YA TENEMOS EL CODIGO EN BCD
Return
lcd:
' Cursor 1,6 'COLOCA EL CURSOR EN LA LINEA 1 Y EN LA POSICION 5
' Print $FE,$0F:DELAYMS 700
' Print $FE, $0C
' Print At 1,6,$FE,$0F
Print $FE,$48,$00,$00,$00,$00,$00,$00,$00,$1F
Print $FE,$40,$1E,$12,$12,$1E,$00,$00,$00,$00 'SIMBOLO DE GRADOS C
Print At 1,17,1
Print At 1,5,Dec2 hora,":",Dec2 minu,":",Dec2 seg," "
Print At 2,1,Dec2 dia,"/",Dec2 mes,"/",Dec2 anio," ",Dec temperatura,".",Dec1 temperatura1,0,"C"
Return
End