اول از ساعت ساده و تقویم میلادی شروع می کنیم
کد:
$regfile = "m8def.dat"
$crystal = 4000000
$framesize = 128
$hwstack = 128
$swstack = 128
$projecttime = 1
$lib "ds1307clock.lib"
Config Lcdpin = Pin , Db4 = Portd.1 , Db5 = Portd.2 , Db6 = Portd.3 , Db7 = Portd.4 , E = Portd.0 , Rs = Portc.5
Cursor Off
تا اینجا که امکانات رو تعریف کردم
'*******************************************************************************
Config Sda = Portb.0 : Config Scl = Portb.1
پایه های مربوط به ارتباط i2c را مشخص کردم
'*******************************************************************************
Dim S As Byte
Dim M As Byte
Dim H As Byte
Dim D As Word
Dim Y As Word
Dim Mo As Word
Dim W As Word
Dim Rooz As Integer
Dim Mah As Byte
Dim Sal As Word
Dim I As Byte
Dim Endm As Byte
متغیر ها رو تعریف کردم
Ddrb.2 = 0 : Portb.2 = 1
Ddrb.3 = 0 : Portb.3 = 1
Ddrb.4 = 0 : Portb.4 = 1
Ddrb.5 = 0 : Portb.5 = 1
Ddrb.6 = 0 : Portb.6 = 1
Ddrb.7 = 0 : Portb.7 = 1
Ddrc.0 = 0 : Portc.0 = 1
پول آپ برای کلید ها تعریف کردم
Cls
'*******************************************************************************
Aval:
Do
I2cstart ارتباط i2c را شروع کردم
I2cwbyte &HD0 ارسال دستور برای شروع نوشتن
I2cwbyte 0 مکان خواندن اطلاعات تعیین کردم
I2cstart ارتباط i2c را شروع کردم
I2cwbyte &HD1 ارسال دستور برای خواندن اطلاعات
I2crbyte S , Ack متغیر ثانیه را از حافظه 0 می خواند (در بالا تعیین کردم)
I2crbyte M , Ack متغیر دقیقه را از حافظه 1 بخوان
I2crbyte H , Ack ساعت
I2crbyte W , Ack ایام هفته را بخوان
I2crbyte D , Ack روز
I2crbyte Mo , Ack ماه
I2crbyte Y , Nack سال
I2cstop پایان ارتباط
'*******************************************************************************
S = Makedec(s) : M = Makedec(m) : H = Makedec(h)
D = Makedec(d) : Mo = Makedec(mo) : Y = Makedec(y)
Y = Y + 2000
اعداد رو به عدد قابل چاپ تبدیل می کنیم(شایدم یه چیز دیگه اگر کسی میدونه بگه) اگر این کار نکنیم میکرو قاطی می کنه
'*******************************************************************************
Locate 1 , 1
Lcd H ; ":" ; M ; ":" ; S ; " "
Locate 2 , 1
Lcd Y ; "/" ; Mo ; "/" ; D ; " "
نمایش اعدا روی ال سی دی
Debounce Pinb.2 , 0 , Second
Debounce Pinb.3 , 0 , Minot
Debounce Pinb.4 , 0 , Hour
Debounce Pinb.5 , 0 , Dey
Debounce Pinb.6 , 0 , Mont
Debounce Pinb.7 , 0 , Year
Debounce Pinc.0 , 0 , Yeard
تعریف کلید برای تنظیم ساعت و تاریخ
Loop
End 'end program
Second: زیر برنامه ثانیه وقتی کلید ثانیه بزنیم برنامه به اینجا پرش می کند
S = 0 ثانیه رو صفر می کنه
S = Makebcd(s) به عدد قابل ذخیره شده تبدیل می کنه
I2cstart ارتباط i2c شروع میشه
I2cwbyte &HD0 ارسال دستور برای شروع نوشتن روی آی سی
I2cwbyte 0 به مکان 0 حافظه بره
I2cwbyte S متغیر s را در حافظه آی سی بنویسه
I2cstop پایان i2c
Goto Aval به زیر برنامه ای که اول برنامه وجود داره پرش می کنه
Return
Minot: وقتی که کلید دقیقه را یزنیم برنامه به اینجا پرش می کنه
Incr M دقیقه را یکی اضافه کن
If M > 59 Then M = 0 اگر دقیقه از 59 بیشتر شد دقیقه را صفر کن
M = Makebcd(m) به عدد قابل ذخیره شدن تبدیل می کنه
I2cstart شروع ارتباط i2c
I2cwbyte &HD0 ارسال دستور برای نوشتن روی آی سی
I2cwbyte 1 به حافظه ی 1 پرش کن
I2cwbyte M متغیر m را روی آی سی بنویس
I2cstop پایان i2c
Goto Aval به اول برنامه پرش کن
Return
بقیه هم همین طور
Hour:
Incr H
If H > 23 Then H = 0
H = Makebcd(h)
I2cstart
I2cwbyte &HD0
I2cwbyte 2
I2cwbyte H
I2cstop
Goto Aval
Return
Dey:
Incr D
If D > 31 Then D = 0
D = Makebcd(d)
I2cstart
I2cwbyte &HD0
I2cwbyte 4
I2cwbyte D
I2cstop
Goto Aval
Return
Mont:
Incr Mo
If Mo > 12 Then Mo = 0
Mo = Makebcd(mo)
I2cstart
I2cwbyte &HD0
I2cwbyte 5
I2cwbyte Mo
I2cstop
Goto Aval
Return
Year:
Incr Y
Y = Makebcd(y)
I2cstart
I2cwbyte &HD0
I2cwbyte 6
I2cwbyte Y
I2cstop
Goto Aval
Return
Yeard:
Decr Y
Y = Makebcd(y)
I2cstart
I2cwbyte &HD0
I2cwbyte 6
I2cwbyte Y
I2cstop
Goto Aval
Return
اگر جاییش گنگه بگین تا بیشتر توضیح بدم
اگر فهمیدین حالا یه مبدل میلادی به شمسی اضافش می کنیم
برنامه به این شکل در میاد
کد:
$regfile = "m8def.dat"
$crystal = 4000000
$framesize = 128
$hwstack = 128
$swstack = 128
$projecttime = 1
$lib "ds1307clock.lib"
Config Lcdpin = Pin , Db4 = Portd.1 , Db5 = Portd.2 , Db6 = Portd.3 , Db7 = Portd.4 , E = Portd.0 , Rs = Portc.5
Cursor Off
'*******************************************************************************
Config Sda = Portb.0 : Config Scl = Portb.1
'*******************************************************************************
Dim S As Byte
Dim M As Byte
Dim H As Byte
Dim D As Word
Dim Y As Word
Dim Mo As Word
Dim W As Word
Dim Rooz As Integer
Dim Mah As Byte
Dim Sal As Word
Dim I As Byte
Dim Endm As Byte
Ddrb.2 = 0 : Portb.2 = 1
Ddrb.3 = 0 : Portb.3 = 1
Ddrb.4 = 0 : Portb.4 = 1
Ddrb.5 = 0 : Portb.5 = 1
Ddrb.6 = 0 : Portb.6 = 1
Ddrb.7 = 0 : Portb.7 = 1
Cls
'*******************************************************************************
Aval:
Do
I2cstart
I2cwbyte &HD0
I2cwbyte 0
I2cstart
I2cwbyte &HD1
I2crbyte S , Ack
I2crbyte M , Ack
I2crbyte H , Ack
I2crbyte W , Ack
I2crbyte D , Ack
I2crbyte Mo , Ack
I2crbyte Y , Nack
I2cstop
'*******************************************************************************
S = Makedec(s) : M = Makedec(m) : H = Makedec(h)
D = Makedec(d) : Mo = Makedec(mo) : Y = Makedec(y)
'*******************************************************************************
If Mo = 1 Then Rooz = D
If Mo = 2 Then Rooz = D + 31
If Mo = 3 Then Rooz = D + 59
If Mo = 4 Then Rooz = D + 90
If Mo = 5 Then Rooz = D + 120
If Mo = 6 Then Rooz = D + 151
If Mo = 7 Then Rooz = D + 181
If Mo = 8 Then Rooz = D + 212
If Mo = 9 Then Rooz = D + 243
If Mo = 10 Then Rooz = D + 273
If Mo = 11 Then Rooz = D + 304
If Mo = 12 Then Rooz = D + 334
If Rooz > 78 Then
Sal = Y + 79
Rooz = Rooz - 78
If Rooz > 186 Then
Rooz = Rooz - 186
Mah = 7
Else
Mah = 1
End If
If Mah > 6 Then Endm = 30 Else Endm = 31
Else
Sal = Y + 78
Mah = 10
If Rooz =< 78 Then Rooz = Rooz + 11
Endm = 30
End If
For I = 1 To 6
If Rooz > 30 Then Rooz = Rooz - Endm Else Exit For
Mah = Mah + 1
Next
Sal = Sal + 1300
'*******************************************************************************
Locate 1 , 1
Lcd H ; ":" ; M ; ":" ; S ; " "
Locate 2 , 1
Lcd Sal ; "/" ; Mah ; "/" ; Rooz ; " "
'*******************************************************************************
Debounce Pinb.2 , 0 , Second
Debounce Pinb.3 , 0 , Minot
Debounce Pinb.4 , 0 , Hour
Debounce Pinb.5 , 0 , Dey
Debounce Pinb.6 , 0 , Mont
Debounce Pinb.7 , 0 , Year
Loop
End 'end program
Second:
S = 0
S = Makebcd(s)
I2cstart
I2cwbyte &HD0
I2cwbyte 0
I2cwbyte S
I2cstop
Goto Aval
Return
Minot:
Incr M
If M > 59 Then M = 0
M = Makebcd(m)
I2cstart
I2cwbyte &HD0
I2cwbyte 1
I2cwbyte M
I2cstop
Goto Aval
Return
Hour:
Incr H
If H > 23 Then H = 0
H = Makebcd(h)
I2cstart
I2cwbyte &HD0
I2cwbyte 2
I2cwbyte H
I2cstop
Goto Aval
Return
Dey:
Incr D
If D > 31 Then D = 0
D = Makebcd(d)
I2cstart
I2cwbyte &HD0
I2cwbyte 4
I2cwbyte D
I2cstop
Goto Aval
Return
Mont:
Incr Mo
If Mo > 12 Then Mo = 0
Mo = Makebcd(mo)
I2cstart
I2cwbyte &HD0
I2cwbyte 5
I2cwbyte Mo
I2cstop
Goto Aval
Return
Year:
Incr Y
If Y > 23 Then Y = 0
Y = Makebcd(y)
I2cstart
I2cwbyte &HD0
I2cwbyte 6
I2cwbyte Y
I2cstop
Goto Aval
Return
این مبدل رو من ننوشتم
و هیچی ازش نمی فهمم
از توی همین سایت برداشتم اگر بپرسین بهتون میگن چکار کردن
حالا دقیق بگین چی می خواهین