Sie sind auf Seite 1von 8

Escuela Politcnica Nacional Nombre: Alexander Viteri Paralelo: GR1 Control con Microprocesadores Implementar un reloj en tiempo real

que se muestre en un LCD 16x2, con tres botones para igualar utilizando el integrado DS1307. PROGRAMA EN BASCOM $regfile = "m164pdef.dat" $crystal = 8000000 $lib "mcsbyte.lbx" $lib "ds1307clock.lib" 'Config puertos Ddrc = 255 Ddrb.2 = 1 Ddrd.2 = 1 Ddrd.3 = 1 'Config pull up Portb.2 = 1 Portd.2 = 1 Portd.3 = 1 'Config interrupciones externas Eimsk = &B00000111 Config Int0 = Falling Config Int1 = Falling Config Int2 = Falling On Int0 Sel On Int1 Aumentar On Int2 Disminuir Enable Int0 Enable Int1 Enable Int2 'Config LCD Config Lcd = 16 * 2 Config Lcdbus = 4

Config Lcdpin = Pin , Db4 = Portc.2 , Db5 = Portc.3 , Db6 = Portc.4 , Db7 = Portc.5 , E = Portc.0 , Rs = Portc.1 Cls 'Config pines para I2C Config Sda = Portc.7 Config Scl = Portc.6 'Config direcciones del DS1307 Const Ds1307w = &HD0 Const Ds1307r = &HD1 'config de variables Dim Seg As Byte , Minu As Byte , Hour As Byte Dim Day As Byte , Month As Byte , Year As Byte Dim Hour_12 As Byte Dim Num_de_day As Byte Dim Meridiano As String * 2 Dim Nom_de_day As String * 3 Dim X As Byte SEI Do 'Leer datos del RTC I2cstart I2cwbyte Ds1307w I2cwbyte 0 I2cstart I2cwbyte Ds1307r I2crbyte Seg , Ack I2crbyte Minu , Ack I2crbyte Hour , Ack I2crbyte Num_de_day , Ack I2crbyte Day , Ack I2crbyte Month , Ack I2crbyte Year , Nack I2cstop Seg = Makedec(seg) : Minu = Makedec(minu) : Hour = Makedec(hour) Day = Makedec(day) : Month = Makedec(month) : Year = Makedec(year) 'Seleccion AM PM If Hour = 0 Then Hour_12 = 12 Meridiano = "AM"

Else Hour_12 = Hour Meridiano = "AM" End If If Hour = 12 Then Meridiano = "PM" If Hour > 12 Then Hour_12 = Hour - 12 Meridiano = "PM" End If 'Nombre del dia If Num_de_day = 1 Then Nom_de_day = "SUN" If Num_de_day = 2 Then Nom_de_day = "MON" If Num_de_day = 3 Then Nom_de_day = "TUE" If Num_de_day = 4 Then Nom_de_day = "WED" If Num_de_day = 5 Then Nom_de_day = "THU" If Num_de_day = 6 Then Nom_de_day = "FRI" If Num_de_day = 7 Then Nom_de_day = "SAT" 'Hora If Hour_12 < 10 And Minu < 10 And Seg < 10 Then Locate 1 , 2 : Lcd " " ; " " ; Hour_12 ; ":0" ; Minu ; ":0" ; Seg ; " " ; Meridiano End If If Hour_12 < 10 And Minu < 10 And Seg > 9 Then Locate 1 , 2 : Lcd " " ; " " ; Hour_12 ; ":0" ; Minu ; ":" ; Seg ; " " ; Meridiano End If If Hour_12 < 10 And Minu > 9 And Seg < 10 Then Locate 1 , 2 : Lcd " " ; " " ; Hour_12 ; ":" ; Minu ; ":0" ; Seg ; " " ; Meridiano End If If Hour_12 < 10 And Minu > 9 And Seg > 9 Then Locate 1 , 2 : Lcd " " ; " " ; Hour_12 ; ":" ; Minu ; ":" ; Seg ; " " ; Meridiano End If If Hour_12 > 9 And Minu < 10 And Seg < 10 Then Locate 1 , 2 : Lcd " " ; Hour_12 ; ":0" ; Minu ; ":0" ; Seg ; " " ; Meridiano End If If Hour_12 > 9 And Minu < 10 And Seg > 9 Then Locate 1 , 2 : Lcd " " ; Hour_12 ; ":0" ; Minu ; ":" ; Seg ; " " ; Meridiano End If If Hour_12 > 9 And Minu > 9 And Seg < 10 Then Locate 1 , 2 : Lcd " " ; Hour_12 ; ":" ; Minu ; ":0" ; Seg ; " " ; Meridiano End If If Hour_12 > 9 And Minu > 9 And Seg > 9 Then Locate 1 , 2 : Lcd " " ; Hour_12 ; ":" ; Minu ; ":" ; Seg ; " " ; Meridiano

End If 'Fecha If Day < 10 And Month < 10 And Year < 10 Then Locate 2 , 2 : Lcd " " ; Day ; "/0" ; Month ; "/0" ; Year ; " " ; Nom_de_day End If If Day < 10 And Month < 10 And Year > 9 Then Locate 2 , 2 : Lcd " " ; Day ; "/0" ; Month ; "/" ; Year ; " " ; Nom_de_day End If If Day < 10 And Year < 10 And Month > 9 Then Locate 2 , 2 : Lcd " " ; Day ; "/" ; Month ; "/0" ; Year ; " " ; Nom_de_day End If If Day < 10 And Year > 9 And Month > 9 Then Locate 2 , 2 : Lcd " " ; Day ; "/" ; Month ; "/" ; Year ; " " ; Nom_de_day End If If Day > 9 And Month < 10 And Year < 10 Then Locate 2 , 2 : Lcd " " ; Day ; "/0" ; Month ; "/0" ; Year ; " " ; Nom_de_day End If If Day > 9 And Month < 10 And Year > 9 Then Locate 2 , 2 : Lcd " " ; Day ; "/0" ; Month ; "/" ; Year ; " " ; Nom_de_day End If If Day > 9 And Year < 10 And Month > 9 Then Locate 2 , 2 : Lcd " " ; Day ; "/" ; Month ; "/0" ; Year ; " " ; Nom_de_day End If If Day > 9 And Year > 9 And Month > 9 Then Locate 2 , 2 : Lcd " " ; Day ; "/" ; Month ; "/" ; Year ; " " ; Nom_de_day End If Loop Sel: X=X+1 If X > 5 Then X = 0 Return Aumentar: If X = 0 Then Gosub A_min If X = 1 Then Gosub A_hour If X = 2 Then Gosub A_day If X = 3 Then Gosub A_month If X = 4 Then Gosub A_year If X = 5 Then Gosub A_day_sem Return

Disminuir: If X = 0 Then Gosub D_min If X = 1 Then Gosub D_hour If X = 2 Then Gosub D_day If X = 3 Then Gosub D_month If X = 4 Then Gosub D_year If X = 5 Then Gosub D_day_sem Return A_min: Incr Minu If Minu > 59 Then Minu = 0 Minu = Makebcd(minu) I2cstart I2cwbyte Ds1307w I2cwbyte 1 I2cwbyte Minu I2cstop Return D_min: If Minu = 0 Then Minu = 60 Decr Minu Minu = Makebcd(minu) I2cstart I2cwbyte Ds1307w I2cwbyte 1 I2cwbyte Minu I2cstop Return A_hour: Incr Hour If Hour > 23 Then Hour = 0 Hour = Makebcd(hour) I2cstart I2cwbyte Ds1307w I2cwbyte 2 I2cwbyte Hour I2cstop Return

D_hour: If Hour = 0 Then Hour = 24 Decr Hour Hour = Makebcd(hour) I2cstart I2cwbyte Ds1307w I2cwbyte 2 I2cwbyte Hour I2cstop Return A_day: Incr Day If Month = 1 Or Month = 3 Or Month = 5 Or Month = 7 Or Month = 8 Or Month = 10 Or Month = 12 And Day > 31 Then Day = 1 If Month = 4 Or Month = 6 Or Month = 9 Or Month = 11 And Day > 30 Then Day = 1 If Month = 2 And Day > 28 Then Day = 1 Day = Makebcd(day) I2cstart I2cwbyte Ds1307w I2cwbyte 4 I2cwbyte Day I2cstop Return D_day: Decr Day If Month = 1 Or Month = 2 Or Month = 4 Or Month = 6 Or Month = 8 Or Month = 9 Or Month = 11 And Day = 1 Then Day = 31 If Month = 5 Or Month = 7 Or Month = 10 Or Month = 12 And Day = 1 Then Day = 30 If Month = 3 And Day = 1 Then Day = 28 Day = Makebcd(day) I2cstart I2cwbyte Ds1307w I2cwbyte 4 I2cwbyte Day I2cstop Return A_month: Incr Month If Month > 12 Then Month = 1 Month = Makebcd(month) I2cstart I2cwbyte Ds1307w

I2cwbyte 5 I2cwbyte Month I2cstop Return D_month: If Month = 1 Then Month = 13 Decr Month Month = Makebcd(month) I2cstart I2cwbyte Ds1307w I2cwbyte 5 I2cwbyte Month I2cstop Return A_year: Incr Year If Year > 99 Then Year = 0 Year = Makebcd(year) I2cstart I2cwbyte Ds1307w I2cwbyte 6 I2cwbyte Year I2cstop Return D_year: If Year = 0 Then Year = 100 Decr Year Year = Makebcd(year) I2cstart I2cwbyte Ds1307w I2cwbyte 6 I2cwbyte Year I2cstop Return A_day_sem: Incr Num_de_day If Num_de_day > 7 Then Num_de_day = 1 Num_de_day = Makebcd(num_de_day) I2cstart I2cwbyte Ds1307w I2cwbyte 3

I2cwbyte Num_de_day I2cstop Return D_day_sem: If Num_de_day = 1 Then Num_de_day = 8 Decr Num_de_day Num_de_day = Makebcd(num_de_day) I2cstart I2cwbyte Ds1307w I2cwbyte 3 I2cwbyte Num_de_day I2cstop Return Diagrama Circuital

Bibliografa: http://tinyurl.com/p3add6z

Das könnte Ihnen auch gefallen