اطلاعیه

Collapse
No announcement yet.

تبدیل تاریخ میلادی به شمسی ds1307

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    تبدیل تاریخ میلادی به شمسی ds1307

    این برنامه ای هست که تو اکثر سایت ها میشه پیداش کرد ولی اینو به کجای برنامه اصلی باید اضافه کنم تا روی ال سی دی تاریخ شمسی رو نمایش بده؟ :mrgreen:

    [code=vb]
    $regfile = "m16def.dat"
    $crystal = 1000000
    $lib "mcsbyteint.lbx"

    Dim Myear As Integer 'input Miladi(gregorian) Year
    Dim Mday As Integer 'input Miladi Day
    Dim Mmonth As Integer 'input Miladi Month
    Dim Mdayofyear As Integer
    Dim Myear_ As Integer

    Dim Jday As Integer 'output Jalali(shamsi) Day
    Dim Jmonth As Integer 'output Jalali Month
    Dim Jyear As Integer 'output Jalali Year
    Dim Jdayofyear As Integer

    Dim Gnumdayofyear As Integer
    Dim Isleapyear As Bit
    Dim Isleapyearp As Bit

    Dim Iloop As Byte
    Dim Temp1 As Integer
    Dim Temp2 As Integer
    Dim Temp3 As Integer
    Dim Temp4 As Integer

    Dim Jmonth_a(12) As Byte
    Dim Mmonth_a(12) As Byte

    Mmonth_a(1) = 31
    '——–28 Ya 29 Agar Sall Kabiseh Bashad In Mah 29 Roz Mibashad—————— –
    Mmonth_a(2) = 28
    Mmonth_a(3) = 31

    Mmonth_a(4) = 30
    Mmonth_a(5) = 31
    Mmonth_a(6) = 30

    Mmonth_a(7) = 31
    Mmonth_a(8) = 31
    Mmonth_a(9) = 30

    Mmonth_a(10) = 31
    Mmonth_a(11) = 30
    Mmonth_a(12) = 31

    Gnumdayofyear = 365

    Myear = 2008 'sample Miladi(gregorian) Year
    Mday = 28 'sample Miladi Day
    Mmonth = 8
    Mdayofyear = 0 'sample Miladi Month
    '————–shart Kabiseh Bodane Sall———— -
    Temp1 = Myear Mod 4
    Temp2 = Myear Mod 100
    Temp3 = Myear Mod 400
    Temp4 = Temp1 And Temp2

    If Temp4 <> 0 Or Temp3 = 0 Then
    Mmonth_a(2) = 28
    Else
    Mmonth_a(2) = 29
    End If

    Myear_ = Myear - 1
    Temp1 = Myear_ Mod 4
    Temp2 = Myear_ Mod 100
    Temp3 = Myear_ Mod 400
    Temp4 = Temp1 And Temp2

    If Temp4 <> 0 Or Temp3 = 0 Then
    Reset Isleapyearp
    Else
    Set Isleapyearp
    End If

    Temp1 = Mmonth - 1

    For Iloop = 1 To Temp1
    Mdayofyear = Mmonth_a(iloop) + Mdayofyear
    Next
    Mdayofyear = Mday + Mdayofyear

    If Mdayofyear > 79 Then

    Temp1 = Mdayofyear - 79
    Jyear = Myear - 621

    If Temp1 < 186 Then

    Temp2 = Temp1 Mod 31
    Temp3 = Temp1 / 31

    If Temp2 = 0 Then
    Jmonth = Temp3
    Jday = 31
    Else
    Jmonth = Temp3 + 1
    Jday = Temp2
    End If

    Else

    Temp2 = Temp1 - 186
    Temp3 = Temp2 Mod 30
    Temp4 = Temp2 / 30

    If Temp3 = 0 Then
    Jmonth = Temp4 + 6
    Jday = 30
    Else
    Jmonth = Temp4 + 7
    Jday = Temp3
    End If

    End If

    Else

    Jyear = Myear - 622

    If Isleapyearp = 1 Then
    Mdayofyear = Mdayofyear + 11
    Else
    Mdayofyear = Mdayofyear + 10
    End If

    Temp2 = Mdayofyear Mod 30
    Temp3 = Mdayofyear / 30

    If Temp2 = 0 Then
    Jmonth = Temp3 + 9
    Jday = 30
    Else
    Jmonth = Temp3 + 10
    Jday = Temp2
    End If

    Waitms 1

    End If
    [/code]

    [move]لطفا راهنمایی فرمایید[/move]
    r.pسابق

    #2
    پاسخ : تبدیل تاریخ میلادی به شمسی ds1307

    دوست عزیز

    ds1307 قابلیت ذخیره تاریخ شمسی را ندارد
    بنابراین همواره تاریخ میلادی را محاسبه کرده و نگه میدارد.

    برای تبدیل به شمسی ابتدا تاریخ میلادی را خوانده و سپس اختلاف ماه و سال و روز میلادی با شمسی را از طریق یک آرایه یا lookup table محاسبه میکنید

    حال تنها کاری که باید بکنید باید تشخیص دهید که کدام یک از متغیر های تعریف شده مربوط به تاریخ میلادی است
    فرض کنید به عنوان مثال در برنامه نمونه ، a و b و c برای سال و ماه و تاریخ میلادی است

    حال قبل استفاده از این برنامه ابتدا با استفاده از توابع آماده تاریخ میلادی را از ds1307 خوانده و برابر متغیر های تعریف شده در برنامه قرار میدهید.
    و تاریخ شمسی محاسبه و در متغیر هایی که مربوط به آن است (که در این برنامه نمیدانم کدام است) قرار میگیرد

    و پایان

    دیدگاه


      #3
      پاسخ : تبدیل تاریخ میلادی به شمسی ds1307

      نوشته اصلی توسط ehsan_akbari
      دوست عزیز

      ds1307 قابلیت ذخیره تاریخ شمسی را ندارد
      بنابراین همواره تاریخ میلادی را محاسبه کرده و نگه میدارد.

      برای تبدیل به شمسی ابتدا تاریخ میلادی را خوانده و سپس اختلاف ماه و سال و روز میلادی با شمسی را از طریق یک آرایه یا lookup table محاسبه میکنید

      حال تنها کاری که باید بکنید باید تشخیص دهید که کدام یک از متغیر های تعریف شده مربوط به تاریخ میلادی است
      فرض کنید به عنوان مثال در برنامه نمونه ، a و b و c برای سال و ماه و تاریخ میلادی است

      حال قبل استفاده از این برنامه ابتدا با استفاده از توابع آماده تاریخ میلادی را از ds1307 خوانده و برابر متغیر های تعریف شده در برنامه قرار میدهید.
      و تاریخ شمسی محاسبه و در متغیر هایی که مربوط به آن است (که در این برنامه نمیدانم کدام است) قرار میگیرد

      و پایان
      خیلی ممنون از راهنمایی تون
      راهی که شما فرمودین رو قبلا امتحان کرده بودم ولی بازم چک میکنم خبرشو میدم
      ممنون :nice:

      اضافه شده در تاریخ :
      این برنامه ای که من گذاشتم درست کار نمیکنه یا حداقل من نتونستم
      از اساتید کسی تا حالا این تبدیلو انجام نداده؟
      لطفا راهنمایی اساسی کنین(یه نمونه برنامه) :mrgreen:
      مرسی :wow:
      r.pسابق

      دیدگاه


        #4
        پاسخ : تبدیل تاریخ میلادی به شمسی ds1307

        سلام
        همین برنامه ای که گذاشتی
        درسته و من ازش جواب گرفتم
        فقط یک نکته داره اینم اینه که Mdayofyear رو بعد از تبدیل حتما مساوی 0 قرار بدید
        پروردگارا: به من زيستني عطا کن که در لحظه مرگ بر بي ثمري لحظه اي که براي زيستن گذشته است حسرت نخورم، و مردني عطا کن که بر بيهودگيش سوگوار نباشم. بگذار تا آن را خود انتخاب کنم، اما آنچنان که تو دوست ميداري

        دیدگاه


          #5
          پاسخ : تبدیل تاریخ میلادی به شمسی ds1307

          نوشته اصلی توسط امیر حسنی کاخکی
          سلام
          همین برنامه ای که گذاشتی
          درسته و من ازش جواب گرفتم
          فقط یک نکته داره اینم اینه که Mdayofyear رو بعد از تبدیل حتما مساوی 0 قرار بدید
          میشه لطف کنین برنامه ای که شما ازش نتیجه گرفتین بزارین
          r.pسابق

          دیدگاه


            #6
            پاسخ : تبدیل تاریخ میلادی به شمسی ds1307

            [code=vb]$regfile = "m128def.dat"
            $crystal = 1000000
            $lib "ds1307clock.lib"
            Enable Interrupts
            Config Lcdpin = Pin , Db4 = Pinc.0 , Db5 = Pinc.1 , Db6 = Pinc.2 , Db7 = _
            Pinc.3 , Rs = Ping.0 , E = Ping.1
            Config Lcd = 20 * 4
            Cursor Off
            Config Sda = Portd.6
            Config Scl = Portd.7
            Const Ds1307w = &HD0
            Const Ds1307r = &HD1
            Config Clock = User


            Dim Weekday As Byte
            Dim Myear As Integer 'input miladi(gregorian) year
            Dim Mday As Integer 'input miladi day
            Dim Mmonth As Integer 'input miladi month
            Dim Mdayofyear As Integer
            Dim Myear_ As Integer

            Dim Jday As Integer 'Output jalali(shamsi) day
            Dim Jmonth As Integer 'Output Jalali month
            Dim Jyear As Integer 'Output Jalali year
            Dim Jdayofyear As Integer

            Dim Gnumdayofyear As Integer
            Dim Isleapyear As Bit
            Dim Isleapyearp As Bit

            Dim Iloop As Byte
            Dim Temp1 As Integer
            Dim Temp2 As Integer
            Dim Temp3 As Integer
            Dim Temp4 As Integer

            Dim Jmonth_a(12) As Byte
            Dim Mmonth_a(12) As Byte
            State = 0

            Mmonth_a(1) = 31
            Mmonth_a(2) = 28
            Mmonth_a(3) = 31

            Mmonth_a(4) = 30
            Mmonth_a(5) = 31
            Mmonth_a(6) = 30

            Mmonth_a(7) = 31
            Mmonth_a(8) = 31
            Mmonth_a(9) = 30

            Mmonth_a(10) = 31
            Mmonth_a(11) = 30
            Mmonth_a(12) = 31

            Gnumdayofyear = 365


            Do
            Gosub Getdatetime



            Temp1 = Myear Mod 4
            Temp2 = Myear Mod 100
            Temp3 = Myear Mod 400
            Temp4 = Temp1 And Temp2
            If Temp4 <> 0 Or Temp3 = 0 Then
            Mmonth_a(2) = 28
            Else
            Mmonth_a(2) = 29
            End If
            Myear_ = Myear - 1
            Temp1 = Myear_ Mod 4
            Temp2 = Myear_ Mod 100
            Temp3 = Myear_ Mod 400
            Temp4 = Temp1 And Temp2
            If Temp4 <> 0 Or Temp3 = 0 Then
            Reset Isleapyearp
            Else
            Set Isleapyearp
            End If
            Temp1 = Mmonth - 1
            For Iloop = 1 To Temp1
            Mdayofyear = Mmonth_a(iloop) + Mdayofyear
            Next
            Mdayofyear = Mday + Mdayofyear
            If Mdayofyear > 79 Then
            Temp1 = Mdayofyear - 79
            Jyear = Myear - 621
            If Temp1 < 186 Then
            Temp2 = Temp1 Mod 31
            Temp3 = Temp1 / 31
            If Temp2 = 0 Then
            Jmonth = Temp3
            Jday = 31
            Else
            Jmonth = Temp3 + 1
            Jday = Temp2
            End If
            Else
            Temp2 = Temp1 - 186
            Temp3 = Temp2 Mod 30
            Temp4 = Temp2 / 30
            If Temp3 = 0 Then
            Jmonth = Temp4 + 6
            Jday = 30
            Else
            Jmonth = Temp4 + 7
            Jday = Temp3
            End If
            End If
            Else
            Jyear = Myear - 622
            If Isleapyearp = 1 Then
            Mdayofyear = Mdayofyear + 11
            Else
            Mdayofyear = Mdayofyear + 10
            End If
            Temp2 = Mdayofyear Mod 30
            Temp3 = Mdayofyear / 30
            If Temp2 = 0 Then
            Jmonth = Temp3 + 9
            Jday = 30
            Else
            Jmonth = Temp3 + 10
            Jday = Temp2
            End If
            End If

            Locate 1 , 1
            Lcd "Miladi: " ; Myear ; "/" ; Mah ; "/" ; Rooz ; " "

            Locate 2 , 1
            Lcd "Shamsi: " ; Jyear ; "/" ; Jmonth ; "/" ; Jday ; " "
            Locate 3 , 1
            Lcd "Saat: " ; _hour ; ":" ; _min ; ":" ; _sec ; " "

            Mdayofyear = 0


            Waitms 300
            Loop
            End
            [/code]



            البته این رو من از کل برنامه خودم در آوردم شاید یک جایی چیزی کم یا زیاد شده باشه
            ولی کار میکنه
            پروردگارا: به من زيستني عطا کن که در لحظه مرگ بر بي ثمري لحظه اي که براي زيستن گذشته است حسرت نخورم، و مردني عطا کن که بر بيهودگيش سوگوار نباشم. بگذار تا آن را خود انتخاب کنم، اما آنچنان که تو دوست ميداري

            دیدگاه


              #7
              پاسخ : تبدیل تاریخ میلادی به شمسی ds1307

              [code=vb]Sub Shamsi
              'Public Shared Function Shamsi_date(byval Mo As Integer , Byval Da As Integer , Byval Ya As Integer , Byval F As Integer) As String

              Ytemp = Right(date$ , 2)
              Dtemp = Mid(date$ , 4 , 2)
              Mtemp = Left(date$ , 2)
              Da = Val(dtemp)
              Mo = Val(mtemp)
              Ya = Val(ytemp)
              Ya = Ya + 2000
              ' DateTime.Now
              Fmo = "01"

              If Mo = 1 Then

              Fya = Ya - 622
              Fya2 = Fya Mod 4
              If Fya2 = 3 Then Da = Da + 1
              Da = Da + 10
              Fmo = "10"
              If Da > 30 Then
              Fmo = "11"
              Da = Da - 30
              End If
              End If
              If Mo = 2 Then
              Reset Watchdog
              Fya = Ya - 622
              Fya2 = Fya Mod 4
              If Fya2 = 3 Then
              Da = Da + 1
              End If
              Da = Da + 11
              Fmo = "11"
              If Da > 30 Then
              Fmo = "12"
              Da = Da - 30
              End If
              End If
              If Mo = 3 Then
              Reset Watchdog
              Fya = Ya - 622
              Fya2 = Fya Mod 4
              If Fya2 = 3 Then
              Da = Da + 1
              End If
              Da = Da + 10
              Fmo = "12"
              Fya2 = Fya Mod 4
              If Fya2 = 3 Then
              If Da > 30 Then
              Fya = Ya - 621
              Fmo = "01"
              Da = Da - 30
              Da = Da - 1
              End If
              Else
              If Da > 29 Then
              Fya = Ya - 621
              Fmo = "01"
              Da = Da - 29
              End If
              End If
              End If
              If Mo = 4 Then
              Reset Watchdog
              Fya = Ya - 621
              Fya2 = Fya Mod 4
              If Fya2 = 3 Then
              Da = Da + 1
              End If
              Da = Da + 11
              Fmo = "01"
              If Da > 31 Then

              Fmo = "02"
              Da = Da - 31

              End If
              End If
              If Mo = 5 Then

              Fya = Ya - 621
              Fya2 = Fya Mod 4
              If Fya2 = 3 Then
              Da = Da + 1
              End If
              Da = Da + 10
              Fmo = "02"
              If Da > 31 Then

              Fmo = "03"
              Da = Da - 31

              End If
              Reset Watchdog
              End If
              If Mo = 6 Then

              Fya = Ya - 621
              Fya2 = Fya Mod 4
              If Fya2 = 3 Then
              Da = Da + 1
              End If
              Da = Da + 10
              Fmo = "03"
              If Da > 31 Then

              Fmo = "04"
              Da = Da - 31

              End If
              End If
              If Mo = 7 Then

              Fya = Ya - 621
              Fya2 = Fya Mod 4
              If Fya2 = 3 Then
              Da = Da + 1
              End If
              Da = Da + 9
              Fmo = "4"
              If Da > 31 Then
              Fmo = "5"
              Da = Da - 31

              End If
              End If
              If Mo = 8 Then

              Fya = Ya - 621
              Fya2 = Fya Mod 4
              If Fya2 = 3 Then
              Da = Da + 1
              End If
              Da = Da + 9
              Fmo = "5"
              If Da > 31 Then
              Fmo = "6"
              Da = Da - 31
              End If
              End If
              If Mo = 9 Then
              Fya = Ya - 621
              Fya2 = Fya Mod 4
              If Fya2 = 3 Then
              Da = Da + 1
              End If
              Da = Da + 9
              Fmo = "6"
              If Da > 31 Then
              Fmo = "7"
              Da = Da - 31
              End If
              End If
              If Mo = 10 Then

              Fya = Ya - 621
              Fya2 = Fya Mod 4
              If Fya2 = 3 Then
              Da = Da + 1
              End If
              Da = Da + 8
              Fmo = "7"
              If Da > 30 Then
              Fmo = "8"
              Da = Da - 30
              End If
              End If
              If Mo = 11 Then

              Fya = Ya - 621
              Fya2 = Fya Mod 4
              If Fya2 = 3 Then
              Da = Da + 1
              End If
              Da = Da + 9
              Fmo = "8"
              If Da > 30 Then
              Fmo = "09"
              Da = Da - 30
              End If
              End If
              If Mo = 12 Then

              Fya = Ya - 621
              Fya2 = Fya Mod 4
              If Fya2 = 3 Then
              Da = Da + 1
              End If
              Da = Da + 9
              Fmo = "09"
              If Da > 30 Then
              Fmo = "10"
              Da = Da - 30
              End If
              End If



              If Da < 10 Then
              Das = "0" + Str(da)
              Else
              Das = Str(da)
              End If

              ' Result = Trim(daname() + Das + "/" +(fmo) + "/" + Str(fya))

              End Sub
              [/code]

              سلام . این برنامه رو خودم نوشتم و کاملا هم درست کار میکنه و چند سال هم داره کار میکنه
              نوفن پردازش هوشمند

              دیدگاه


                #8
                پاسخ : تبدیل تاریخ میلادی به شمسی ds1307

                از پشه و امیر اقا ممنونم
                بلاخره مشکل حل شد :nice:
                فقط الان تاریخ 6 روز جلوترو از pcرو نشون میده به نظر شما اشکال از کجا میتونه باشه؟ oo:
                r.pسابق

                دیدگاه


                  #9
                  پاسخ : تبدیل تاریخ میلادی به شمسی ds1307

                  منظورتون رو نفهمیدم
                  شمسی جلو هست یا میلادی؟
                  کامپیوتر که شمسی نداره!!!!!!
                  من با همین تابع الان ساعتم درست کار میکنه!!!!!
                  پروردگارا: به من زيستني عطا کن که در لحظه مرگ بر بي ثمري لحظه اي که براي زيستن گذشته است حسرت نخورم، و مردني عطا کن که بر بيهودگيش سوگوار نباشم. بگذار تا آن را خود انتخاب کنم، اما آنچنان که تو دوست ميداري

                  دیدگاه


                    #10
                    پاسخ : تبدیل تاریخ میلادی به شمسی ds1307

                    نوشته اصلی توسط امیر حسنی کاخکی
                    منظورتون رو نفهمیدم
                    شمسی جلو هست یا میلادی؟
                    کامپیوتر که شمسی نداره!!!!!!
                    من با همین تابع الان ساعتم درست کار میکنه!!!!!
                    منظورم اینه که تاریخ میلادی که تو شبیه سازی هست از تاریخ کامپیوتر جلوتر هست
                    البته عمل تبدیل به درستی انجام میشه
                    از جوابتون و رفع مشکلات من بسیار ممنونم :nice:
                    r.pسابق

                    دیدگاه

                    لطفا صبر کنید...
                    X