درود بر همگي
دوستان من ميخوام با سون سگمنت ساعت و تاريخ ديجيتالي رو با ds1307 نمايش بدم اونم به صورت دائمي يعني هم تاريخ هم ساعت نمايش داده بشه يه سري دستورات رو استفاده کردم اما موقع شبيه سازي ايراد داره اگه ميشه کمک کنيد چطوري تابع تبديل تاريخ رو به اين برنامه اضافه کنم که جداگانه تاريخ رو هم برام نمايش بده؟
الان برنامه میلادی اون رو تست کردم جواب داده یعنی از آی ds1307 فراخونی کردم رو سون سگمنت هم نمایش میده کلیدهای تنظیمش درست کار میکنه(البته یکسری نویز میافته روش که اونم احتمالا از اصل نبودن آی سی و کریستالش میتونه باشه و اینکه رو بردبرد نصب شده و اتصالات محکم نیستند اما در کل جواب داده هم داخل پروتئوس هم عملی)
این برنامه به صورت میلادی:
کد:
$regfile = "m32def.dat"
$crystal = 1000000
Config Porta = Output
Config Portb = Output
Config Portd = Output
Config Pinc.5 = Input
Config Pinc.6 = Input
Config Pinc.7 = Input
$lib "Ds1307clock.lib"
Config Sda = Portc.1
Config Scl = Portc.0
Dim _sec As Byte
Dim _min As Byte
Dim _hour As Byte
Dim Y2 As Word
Dim Y1 As Word
Dim Mo2 As Word
Dim Mo1 As Word
Dim D2 As Word
Dim D1 As Word
Dim _day As Integer
Dim _month As Integer
Dim _year As Integer
Dim Weekday As Integer
Const Ds1307w = &HD0
Const Ds1307r = &HD1
Main:
Do
Gosub Ds1307
Gosub Saat
Gosub Key
Loop
Key:
Debounce Pinc.5 , 0 , Dayy , Sub
Debounce Pinc.6 , 0 , Monthh , Sub
Debounce Pinc.7 , 0 , Yearr , Sub
Return
Saat:
If _day > 31 Then _day = 0
_day = Makebcd(_day)
If _month > 12 Then _month = 0
_month = Makebcd(_month)
If _year > 99 Then _year = 0
_year = Makebcd(_year)
_day = Makedec(_day)
_month = Makedec(_month)
_year = Makedec(_year)
Y1 = _year / 10
Y2 = _year Mod 10
Mo1 = _month / 10
Mo2 = _month Mod 10
D1 = _day / 10
D2 = _day Mod 10
Set Portb.1
Reset Portb.2
Reset Portb.3
Reset Portb.4
Reset Portb.5
Reset Portb.6
Porta = Lookup(y2 , Dta)
Waitms 2
Reset Portb.1
Set Portb.2
Reset Portb.3
Reset Portb.4
Reset Portb.5
Reset Portb.6
Porta = Lookup(y1 , Dta)
Waitms 2
Reset Portb.1
Reset Portb.2
Set Portb.3
Reset Portb.4
Reset Portb.5
Reset Portb.6
Porta = Lookup(mo2 , Dta)
Waitms 2
Reset Portb.1
Reset Portb.2
Reset Portb.3
Set Portb.4
Reset Portb.5
Reset Portb.6
Porta = Lookup(mo1 , Dta)
Waitms 2
Reset Portb.1
Reset Portb.2
Reset Portb.3
Reset Portb.4
Set Portb.5
Reset Portb.6
Porta = Lookup(d2 , Dta)
Waitms 2
Reset Portb.1
Reset Portb.2
Reset Portb.3
Reset Portb.4
Reset Portb.5
Set Portb.6
Porta = Lookup(d1 , Dta)
Waitms 2
Return
Ds1307:
I2cstart ' Generate start code
I2cwbyte Ds1307w ' send address
I2cwbyte 0 ' start address in 1307
I2cstart ' Generate start code
I2cwbyte Ds1307r ' send address
I2crbyte _sec , Ack
I2crbyte _min , Ack ' MINUTES
I2crbyte _hour , Ack ' Hours
I2crbyte Weekday , Ack ' Day of Week
I2crbyte _day , Ack ' Day of Month
I2crbyte _month , Ack ' Month of Year
I2crbyte _year , Nack ' Year
I2cstop
_sec = Makedec(_sec) : _min = Makedec(_min) : _hour = Makedec(_hour)
_day = Makedec(_day) : _month = Makedec(_month) : _year = Makedec(_year)
Return
Dayy:
Incr _day
If _day > 31 Then _day = 0
_day = Makebcd(_day)
I2cstart
I2cwbyte Ds1307w
I2cwbyte 4
I2cwbyte _day
I2cstop
Return
Monthh:
Incr _month
If _month > 12 Then _month = 0
_month = Makebcd(_month)
I2cstart
I2cwbyte Ds1307w
I2cwbyte 5
I2cwbyte _month
I2cstop
Return
Yearr:
Incr _year
If _year > 99 Then _year = 0
_year = Makebcd(_year)
I2cstart
I2cwbyte Ds1307w
I2cwbyte 6
I2cwbyte _year
I2cstop
Return
Dta:
Data &HC0 , &HF9 , &HA4 , &HB0 , &H99 , &H92 , &H82 , &HF8 , &H80 , &H90 , &HBF
متغییرهای ساعت و دقیقه و ثانیه رو واسه ادامه کار تعریف کردم چون میخوام هم زمان هم تاریخ نمایش داده بشه ساعت هم مشکلی نداره برنامه اش هست میذارم الان مشکل تبدیل این تاریخ میلادی به شمسی هست
دوستان بیاند این بحث رو به نتیجه برسونیم