logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[ATMEGA32][BASCOM] Algorytm tygodnia roku

wello 09 Paź 2009 12:20 4855 11
REKLAMA
  • #1 7107279
    wello
    Poziom 20  
    Witam serdecznie.
    Zaprojektowałem zegar na Atmedze32 z PCF8583. Projekt jest ukończony, wszystko ładnie hula, jednak chciałem dodać ostatni "bajer" i nie wiem jak to zrobić. Chodzi o algorytm, który obliczałby aktualny tydzień roku na podstawie aktualnej daty. Zgodnie z normą ISO8601 pierwszym tygodniem roku jest tydzień, który zawiera większą liczbę dni tygodnia w nowym roku, czyli jeżeli nowy rok rozpoczął się w dniach od poniedziałku do czwartku włącznie to jest to 1 tydzień nowego roku. Jeżeli natomiast pierwszym dniem nowego roku był piątek, sobota lub niedziela, to ten tydzień jest jeszcze 53-cim tygodniem roku poprzedniego a dopiero nadchodzący poniedziałek rozpoczyna pierwszy tydzień nowego roku.
    NIGDZIE, powtarzam NIGDZIE w internecie (czyt. google czy różne fora np. z algorytmami) nie ma przedstawionego algorytmu w jakimkolwiek języku, który mógłby to zadanie realizować. Rozwiązania szukam już 3-ci dzień. Są inne rozwiązania ale one tyczą się Windowsa i tam ludzie proponują pobierać po prostu numer tygodnia z kalendarza Windowsa ale ja potrzebuję algorytm, który obliczy mi tydzień roku na Atmedze mając jedynie aktualny dzień roku i aktualny dzień tygodnia.
    Napisałem algorytm obliczający dzień roku (dzisiaj jest 282 dzień roku), działa poprawnie, sprawdziłem w wielu przypadkach i w tym roku wylicza poprawnie, tj. pierwszym dniem roku był czwartek, a co za tym idzie jest to już pierwszy tydzień roku. Poniżej wklejam mój kod programu, który powinien obliczać tydzień roku jednak jest on niepoprawny. Jest to już chyba setna wersja tego kodu ;) Wiem, że jest on niezoptymalizowany i wiele rzeczy niepotrzebnie się powtarza oraz część jest jako komentarze ale nie o to tu chodzi ponieważ jest to pozostałość po tym od czego musiałem zacząć czyli od zera. I jeżeli znajdę odpowiedni algorytm to oczywiście sobie to wszystko poskracam. Jednak nie jestem w stanie wymyślić poprawnie obliczającego algorytmu. Liczę na Wasze podpowiedzi i z góry dziękuję za zainteresowanie, może ktoś z Was już coś takiego robił?
    PS. Wd_dec to numer dnia tygodnia dla PCF8583 czyli zakres jest od 0 do 6.

    
    Sub Tydzien_roku
    
    Modulo_7_z_dnia_roku = Dzien_roku Mod 7
    
    If Modulo_7_z_dnia_roku = 0 Then
        Pierwszy_dzien_tygodnia_roku = Wd_dec + 1
        If Pierwszy_dzien_tygodnia_roku = 7 Then
            Pierwszy_dzien_tygodnia_roku = 0
            Dopelnienie = Modulo_7_z_dnia_roku
        Elseif Pierwszy_dzien_tygodnia_roku = 1 Then
            Dopelnienie = Modulo_7_z_dnia_roku
        Elseif Pierwszy_dzien_tygodnia_roku = 2 Then
            Dopelnienie = Modulo_7_z_dnia_roku
        Elseif Pierwszy_dzien_tygodnia_roku = 3 Then
            Dopelnienie = Modulo_7_z_dnia_roku
        Elseif Pierwszy_dzien_tygodnia_roku = 4 Then
            Dopelnienie = Modulo_7_z_dnia_roku
        Elseif Pierwszy_dzien_tygodnia_roku = 5 Then
            Dopelnienie = Modulo_7_z_dnia_roku
        Elseif Pierwszy_dzien_tygodnia_roku = 6 Then
            Dopelnienie = Modulo_7_z_dnia_roku
        End If
    Elseif Modulo_7_z_dnia_roku = 1 Then
        Pierwszy_dzien_tygodnia_roku = Wd_dec
        Dopelnienie = 5
    Elseif Modulo_7_z_dnia_roku = 2 Then
        Pierwszy_dzien_tygodnia_roku = Wd_dec - 1
        If Pierwszy_dzien_tygodnia_roku = 255 Then
            Pierwszy_dzien_tygodnia_roku = 6
            Dopelnienie = Modulo_7_z_dnia_roku
        Elseif Pierwszy_dzien_tygodnia_roku = 0 Then
            Dopelnienie = Modulo_7_z_dnia_roku
        Elseif Pierwszy_dzien_tygodnia_roku = 1 Then
            Dopelnienie = Modulo_7_z_dnia_roku
        Elseif Pierwszy_dzien_tygodnia_roku = 2 Then
            Dopelnienie = Modulo_7_z_dnia_roku
        Elseif Pierwszy_dzien_tygodnia_roku = 3 Then
            Dopelnienie = Modulo_7_z_dnia_roku
        Elseif Pierwszy_dzien_tygodnia_roku = 4 Then
            Dopelnienie = Modulo_7_z_dnia_roku
        Elseif Pierwszy_dzien_tygodnia_roku = 5 Then
            Dopelnienie = Modulo_7_z_dnia_roku
        End If
    Elseif Modulo_7_z_dnia_roku = 3 Then
        Pierwszy_dzien_tygodnia_roku = Wd_dec - 2
        If Pierwszy_dzien_tygodnia_roku = 255 Then
            Pierwszy_dzien_tygodnia_roku = 6
            Dopelnienie = Modulo_7_z_dnia_roku
        Elseif Pierwszy_dzien_tygodnia_roku = 254 Then
            Pierwszy_dzien_tygodnia_roku = 5
            Dopelnienie = Modulo_7_z_dnia_roku
        Elseif Pierwszy_dzien_tygodnia_roku = 0 Then
            Dopelnienie = Modulo_7_z_dnia_roku
        Elseif Pierwszy_dzien_tygodnia_roku = 1 Then
            Dopelnienie = Modulo_7_z_dnia_roku
        Elseif Pierwszy_dzien_tygodnia_roku = 2 Then
            Dopelnienie = Modulo_7_z_dnia_roku
        Elseif Pierwszy_dzien_tygodnia_roku = 3 Then
            Dopelnienie = Modulo_7_z_dnia_roku
        Elseif Pierwszy_dzien_tygodnia_roku = 4 Then
            Dopelnienie = Modulo_7_z_dnia_roku
        End If
    Elseif Modulo_7_z_dnia_roku = 4 Then
        Pierwszy_dzien_tygodnia_roku = Wd_dec - 3
        If Pierwszy_dzien_tygodnia_roku = 255 Then
            Pierwszy_dzien_tygodnia_roku = 6
            Dopelnienie = 1
        Elseif Pierwszy_dzien_tygodnia_roku = 254 Then
            Pierwszy_dzien_tygodnia_roku = 5
            Dopelnienie = 1
        Elseif Pierwszy_dzien_tygodnia_roku = 253 Then
            Pierwszy_dzien_tygodnia_roku = 4
            Dopelnienie = 1
        Elseif Pierwszy_dzien_tygodnia_roku = 0 Then
            Dopelnienie = 1
        Elseif Pierwszy_dzien_tygodnia_roku = 1 Then
            Dopelnienie = 1
        Elseif Pierwszy_dzien_tygodnia_roku = 2 Then
            Dopelnienie = 1
        Elseif Pierwszy_dzien_tygodnia_roku = 3 Then
            Dopelnienie = 1
        End If
    Elseif Modulo_7_z_dnia_roku = 5 Then
        Pierwszy_dzien_tygodnia_roku = Wd_dec - 4
        If Pierwszy_dzien_tygodnia_roku = 255 Then
            Pierwszy_dzien_tygodnia_roku = 6
            Dopelnienie = 2
        Elseif Pierwszy_dzien_tygodnia_roku = 254 Then
            Pierwszy_dzien_tygodnia_roku = 5
            Dopelnienie = 2
        Elseif Pierwszy_dzien_tygodnia_roku = 253 Then
            Pierwszy_dzien_tygodnia_roku = 4
            Dopelnienie = 2
        Elseif Pierwszy_dzien_tygodnia_roku = 252 Then
            Pierwszy_dzien_tygodnia_roku = 3
            Dopelnienie = 2
        Elseif Pierwszy_dzien_tygodnia_roku = 0 Then
            Dopelnienie = 2
        Elseif Pierwszy_dzien_tygodnia_roku = 1 Then
            Dopelnienie = 2
        Elseif Pierwszy_dzien_tygodnia_roku = 2 Then
            Dopelnienie = 2
        End If
    Elseif Modulo_7_z_dnia_roku = 6 Then
        Pierwszy_dzien_tygodnia_roku = Wd_dec - 5
        If Pierwszy_dzien_tygodnia_roku = 255 Then
            Pierwszy_dzien_tygodnia_roku = 6
            Dopelnienie = Modulo_7_z_dnia_roku
        Elseif Pierwszy_dzien_tygodnia_roku = 254 Then
            Pierwszy_dzien_tygodnia_roku = 5
            Dopelnienie = Modulo_7_z_dnia_roku
        Elseif Pierwszy_dzien_tygodnia_roku = 253 Then
            Pierwszy_dzien_tygodnia_roku = 4
            Dopelnienie = Modulo_7_z_dnia_roku
        Elseif Pierwszy_dzien_tygodnia_roku = 252 Then
            Pierwszy_dzien_tygodnia_roku = 3
            Dopelnienie = Modulo_7_z_dnia_roku
        Elseif Pierwszy_dzien_tygodnia_roku = 251 Then
            Pierwszy_dzien_tygodnia_roku = 2
            Dopelnienie = Modulo_7_z_dnia_roku
        Elseif Pierwszy_dzien_tygodnia_roku = 0 Then
            Dopelnienie = Modulo_7_z_dnia_roku
        Elseif Pierwszy_dzien_tygodnia_roku = 1 Then
            Dopelnienie = Modulo_7_z_dnia_roku
        End If
    End If
    
    'Dopelnienie = Pierwszy_dzien_tygodnia_roku
    
    Dzien_roku = Dzien_roku + Dopelnienie
    Dzien_roku = Dzien_roku / 7
    'Dzien_roku = Int(dzien_roku)
    Tydzien_roku_integer = Dzien_roku
    'Tydzien_roku_single = Dzien_roku / 7
    'Tydzien_roku_single = Int(tydzien_roku_single)
    'Tydzien_roku_byte = Tydzien_roku_single
    
    If Pierwszy_dzien_tygodnia_roku < 4 Then
        Tydzien_roku_integer = Tydzien_roku_integer + 1
    Else
        Tydzien_roku_integer = Tydzien_roku_integer + 0
    End If
    
    End Sub
    
  • REKLAMA
  • Pomocny post
    #2 7107320
    Konto nie istnieje
    Konto nie istnieje  
  • REKLAMA
  • Pomocny post
    #3 7107375
    arnoldziq
    VIP Zasłużony dla elektroda
    Tu masz opis algorytmu : Link
  • REKLAMA
  • Pomocny post
    #4 7107381
    l3sz3k
    Poziom 18  
    Witam,
    Nie twierdź, że czegoś nie ma w internecie skoro tego nie znalazłeś.

    Dam Ci podpowiedź jak to policzyć:
    - musisz wyznaczyć ile w każdym miesiącu jest dni (31, 28/29, 31, 30 itd.)
    - musisz znać dzień 1 stycznia (np. czwartek) i określić ilość dni od 1 stycznia do najbliższej niedzieli. Jeśli ilość dni jest mniejsza od 4 to ten tydzień zalicza się to ostatniego tygodnia poprzedniego roku, a jeśli większa to jest to pierwszy tydzień tego roku ( od czwartku do niedzieli jest = 4dni i jest to pierwszy tydzień roku)
    - potem do aktualnego dnia dodajesz dni z poprzednich miesięcy i odejmujesz dni pierwszego niepełnego tygodnia roku.
    (np. aktualny dzień to 9 październik, czyli do 9 dodajesz 31 + 28 + 31 + 30 +31 +30 +31 + 31 +30 -4 = 278)
    - obliczoną ilość dni dzielisz przez 7 i dodajesz 1 lub 0 z tytułu pierwszego niepełnego tygodnia, wynik zaokrąglasz do pełnej liczby całkowitej (278 /7 = 39,71 + 1 = 40,71 po zaokrągleniu daje 41 tydzień)
  • #5 7107539
    wello
    Poziom 20  
    Dzięki za szybkie i szczegółowe podpowiedzi :) Poczytam, posprawdzam i dam znać czy ruszyło.
    Pozdro.
  • REKLAMA
  • #6 7107982
    wader_669
    Poziom 28  
    jak sie ruszy, to wstaw kod, napewno duzo uzytkownikow by bylo wdziecznych. Sam kiedys bede musial sie tym zajac ale narazie czasu brak.
  • #7 7112566
    wello
    Poziom 20  
    Na wstępie chciałbym podziękować osobom, które odpisały na moje zapytanie. Od razu powiem, że ich sposoby były mocno niepełne i nie działały (działały tylko dla, że się tak wyrażę, "normalnych" dat) jednak doprowadziły mnie do mety za co jeszcze raz dzięki :) Aby zrobić całkowicie poprawny algorytm skorzystałem ze strony http://kalender-365.de/kalendarz.php?yy=2009 za pomocą której sprawdzałem czy wszystko się zgadza. Mój algorytm sprawdziłem do 2037 roku (więcej nie trzeba bo co 28 lat kalendarz się powtarza). Sprawdzałem wszystkie początki i końce roku, zarówno pierwsze dni roku jak i ostatnie, oraz pierwsze i ostatnie dni pierwszego jak i ostatniego tygodnia roku bo to również sprawiało problemy o czym przekonać się można ze źródła kodu.

    Najpierw typy zmiennych:

    
    Dim Yy_dec As Byte 'Zmienna pobierana z PCF8583, wartość od 0-3 (0 - rok przestępny, inne - rok normalny).
    Dim Rok_przestepny As Byte
    Dim Mm_dec As Byte ' Zmienna numeru miesiąca roku pobierana z PCF8583 i skonwertowana z bcd na dec.
    Dim Dzien_roku As Word
    Dim Dd_dec As Byte ' Zmienna numeru dnia miesiąca pobierana z PCF8583 i skonwertowana z bcd na dec.
    Dim Modulo_7_z_dnia_roku As Word
    Dim Pierwszy_dzien_tygodnia_roku As Byte
    Dim Wd_dec As Byte ' Zmienna numeru dnia tygodnia pobierana z PCF8583 i skonwertowana z bcd na dec (0 - Poniedziałek, 6 - Niedziela).
    Dim Dzien_roku_dopelnienie As Word
    Dim Tydzien_roku_single As Single
    Dim Ulamek_tygodnia_roku As Single
    Dim Tydzien_roku_byte As Byte
    


    Na ekranie wyświetlam zmienną Dzien_roku oraz Tydzien_roku_byte.

    Aby obliczyć tydzień roku najpierw należy obliczyć dzień roku, zrealizowałem to za pomocą takiego algorytmu:

    
    Sub Dzien_roku
    
    If Yy_dec = 0 Then
        Rok_przestepny = 1
    Else
        Rok_przestepny = 0
    End If
    
    If Mm_dec = 1 Then
        Dzien_roku = Dd_dec
    Elseif Mm_dec = 2 Then
        Dzien_roku = 31 + Dd_dec
    Elseif Mm_dec = 3 Then
        Dzien_roku = 59 + Dd_dec
        Dzien_roku = Dzien_roku + Rok_przestepny
    Elseif Mm_dec = 4 Then
        Dzien_roku = 90 + Dd_dec
        Dzien_roku = Dzien_roku + Rok_przestepny
    Elseif Mm_dec = 5 Then
        Dzien_roku = 120 + Dd_dec
        Dzien_roku = Dzien_roku + Rok_przestepny
    Elseif Mm_dec = 6 Then
        Dzien_roku = 151 + Dd_dec
        Dzien_roku = Dzien_roku + Rok_przestepny
    Elseif Mm_dec = 7 Then
        Dzien_roku = 181 + Dd_dec
        Dzien_roku = Dzien_roku + Rok_przestepny
    Elseif Mm_dec = 8 Then
        Dzien_roku = 212 + Dd_dec
        Dzien_roku = Dzien_roku + Rok_przestepny
    Elseif Mm_dec = 9 Then
        Dzien_roku = 243 + Dd_dec
        Dzien_roku = Dzien_roku + Rok_przestepny
    Elseif Mm_dec = 10 Then
        Dzien_roku = 273 + Dd_dec
        Dzien_roku = Dzien_roku + Rok_przestepny
    Elseif Mm_dec = 11 Then
        Dzien_roku = 304 + Dd_dec
        Dzien_roku = Dzien_roku + Rok_przestepny
    Elseif Mm_dec = 12 Then
        Dzien_roku = 334 + Dd_dec
        Dzien_roku = Dzien_roku + Rok_przestepny
    End If
    
    End Sub
    


    Następnie algorytm obliczający najpierw pierwszy dzień tygodnia roku a następnie tydzień roku:

    
    Sub Tydzien_roku
    
    Modulo_7_z_dnia_roku = Dzien_roku Mod 7
    
    If Modulo_7_z_dnia_roku = 0 Then
        Pierwszy_dzien_tygodnia_roku = Wd_dec + 1
        If Pierwszy_dzien_tygodnia_roku = 7 Then
            Pierwszy_dzien_tygodnia_roku = 0
        End If
    Elseif Modulo_7_z_dnia_roku = 1 Then
        Pierwszy_dzien_tygodnia_roku = Wd_dec
    Elseif Modulo_7_z_dnia_roku = 2 Then
        Pierwszy_dzien_tygodnia_roku = Wd_dec - 1
        If Pierwszy_dzien_tygodnia_roku = 255 Then
            Pierwszy_dzien_tygodnia_roku = 6
        End If
    Elseif Modulo_7_z_dnia_roku = 3 Then
        Pierwszy_dzien_tygodnia_roku = Wd_dec - 2
        If Pierwszy_dzien_tygodnia_roku = 255 Then
            Pierwszy_dzien_tygodnia_roku = 6
        Elseif Pierwszy_dzien_tygodnia_roku = 254 Then
            Pierwszy_dzien_tygodnia_roku = 5
        End If
    Elseif Modulo_7_z_dnia_roku = 4 Then
        Pierwszy_dzien_tygodnia_roku = Wd_dec - 3
        If Pierwszy_dzien_tygodnia_roku = 255 Then
            Pierwszy_dzien_tygodnia_roku = 6
        Elseif Pierwszy_dzien_tygodnia_roku = 254 Then
            Pierwszy_dzien_tygodnia_roku = 5
        Elseif Pierwszy_dzien_tygodnia_roku = 253 Then
            Pierwszy_dzien_tygodnia_roku = 4
        End If
    Elseif Modulo_7_z_dnia_roku = 5 Then
        Pierwszy_dzien_tygodnia_roku = Wd_dec - 4
        If Pierwszy_dzien_tygodnia_roku = 255 Then
            Pierwszy_dzien_tygodnia_roku = 6
        Elseif Pierwszy_dzien_tygodnia_roku = 254 Then
            Pierwszy_dzien_tygodnia_roku = 5
        Elseif Pierwszy_dzien_tygodnia_roku = 253 Then
            Pierwszy_dzien_tygodnia_roku = 4
        Elseif Pierwszy_dzien_tygodnia_roku = 252 Then
            Pierwszy_dzien_tygodnia_roku = 3
        End If
    Elseif Modulo_7_z_dnia_roku = 6 Then
        Pierwszy_dzien_tygodnia_roku = Wd_dec - 5
        If Pierwszy_dzien_tygodnia_roku = 255 Then
            Pierwszy_dzien_tygodnia_roku = 6
        Elseif Pierwszy_dzien_tygodnia_roku = 254 Then
            Pierwszy_dzien_tygodnia_roku = 5
        Elseif Pierwszy_dzien_tygodnia_roku = 253 Then
            Pierwszy_dzien_tygodnia_roku = 4
        Elseif Pierwszy_dzien_tygodnia_roku = 252 Then
            Pierwszy_dzien_tygodnia_roku = 3
        Elseif Pierwszy_dzien_tygodnia_roku = 251 Then
            Pierwszy_dzien_tygodnia_roku = 2
        End If
    End If
    
    
    If Dzien_roku > Wd_dec Then
        Dzien_roku_dopelnienie = Dzien_roku - Wd_dec
        Tydzien_roku_single = Dzien_roku_dopelnienie / 7
        Ulamek_tygodnia_roku = Frac(Tydzien_roku_single)
        If Ulamek_tygodnia_roku < 0.5 And Ulamek_tygodnia_roku > 0 Then
            Tydzien_roku_single = Tydzien_roku_single + 0.5
        End If
    
    If Pierwszy_dzien_tygodnia_roku < 4 And Pierwszy_dzien_tygodnia_roku > 0 Then
        Tydzien_roku_single = Tydzien_roku_single + 1
    Else
        Tydzien_roku_single = Tydzien_roku_single + 0
    End If
    
    Tydzien_roku_single = Round(Tydzien_roku_single)
    End If
    
    If Dzien_roku <= Wd_dec Then
        Tydzien_roku_byte = 1
    Else
        Tydzien_roku_byte = Tydzien_roku_single
    End If
    
    If Dzien_roku >= 1 And Dzien_roku <= 3 Then
        If Wd_dec >= 4 And Wd_dec <= 6 Then
            If Pierwszy_dzien_tygodnia_roku = 4 Then
                Tydzien_roku_byte = 53
            End If
            If Pierwszy_dzien_tygodnia_roku = 5 Then
                If Yy_dec <> 1 Then
                    Tydzien_roku_byte = 52
                Elseif Yy_dec = 1 Then
                    Tydzien_roku_byte = 53
                End If
            End If
            If Pierwszy_dzien_tygodnia_roku = 6 Then
                Tydzien_roku_byte = 52
            End If
        End If
    End If
    If Tydzien_roku_byte = 53 And Mm_dec = 12 Then
        If Dd_dec >= 29 Then
            If Wd_dec >= 0 And Wd_dec <= 2 Then
                Tydzien_roku_byte = 1
            End If
        End If
    End If
    
    End Sub
    


    Nie jest to może najschludniej napisany kod ale dopiero miesiąc temu zacząłem programować w Bascomie więc jeżeli ktoś chciałby wnieść poprawki to proszę bardzo jednak sugerowałbym wówczas wklejenie nowego kodu w tym wątku po to aby potomni mogli z niego skorzystać. Komentarzy nie pisałem gdyż użyte długie nazwy zmiennych mówią same za siebie.
    Nie zauważyłem żadnego błędu, zawsze liczy OK, nie mniej jednak nie jestem nieomylny więc gdyby któryś z kolegów/koleżanek zauważył błąd to proszę o tym napisać w tym wątku.
    Pozdrawiam i życzę miłego korzystania :)
  • #8 7113352
    l3sz3k
    Poziom 18  
    Witam,
    Nieźle, ale ja nigdy nie byłem fanem BASCOMa. Jutro pokaże Ci kod który robi to samo, ale będzie napisany w C - porównasz kulturę "kodu" i jego zwięzłość. Piszesz, że od niedawana programujesz, dlatego nie mam zamiaru Cię poprawiać. Lecz chcę Cię zachęcić do języka jakim jest C.
  • #9 7113396
    Konto nie istnieje
    Poziom 1  
  • #10 7113896
    wader_669
    Poziom 28  
    l3sz3k napisał:

    Jutro pokaże Ci kod który robi to samo, ale będzie napisany w C.


    Dawaj ja go przerobie na bascom
  • #11 7114794
    wello
    Poziom 20  
    !!! UWAGA, BŁĄD !!!
    Zauważyłem jeden błąd dzisiaj gdy kalendarz pokazał mi, że mamy 40 tydzień (powinien być 41) :). Zmienna Modulo_7_z_dnia_roku jest jako Byte a powinna być jako Word. Poprawiłem to już.
  • #12 7115592
    l3sz3k
    Poziom 18  
    
    u8 Yy_dec;        // Zmienna pobierana z PCF8583, wartosc od 0-3 (0 - rok przestępny, inne - rok normalny).
    u8 Mm_dec;        // Zmienna numeru miesisca roku pobierana z PCF8583 i skonwertowana z bcd na dec.
    u8 Wd_dec;        // Zmienna numeru dnia tygodnia pobierana z PCF8583 i skonwertowana z bcd na dec (0 - Pon, 6 - Nie).
    u8 Dd_dec;        // Zmienna numeru dnia miesiaca pobierana z PCF8583 i skonwertowana z bcd na dec.
    u16 Dzien_roku;
    u8 Modulo_7_z_dnia_roku;
    u8 Przesuniecie;
    u8 Pierwszy_dzien_tygodnia_roku;
    u8 Ilosc_dni_pierwszego_tygodnia_roku;
    u8 Rok_przestepny;
    u8 pierwszy_tydzien;      
    u8 tydzien;               
    u8 Tydzien_roku_byte; 
    u8 Mm_tab[] = {0,0,31,59,90,120,151,181,212,243,273,304,334};        // tablica z suma dni z kolejnych miesiecy
     
    void Dzien_roku()
    {
      if (Yy_dec == 0)Rok_przestepny = 1;
      else            Rok_przestepny = 0;   
    
           if(Mm_dec >= 1 && Mm_dec < 3) Dzien_roku = Mm_tab[Mm_dec] + Dd_dec;
      else if(Mm_dec >= 3 && Mm_dec <13) Dzien_roku = Mm_tab[Mm_dec] + Dd_dec + Rok_przestepny;   
    }
    
    void Tydzien_roku()
    {
      Przesuniecie = Dzien_roku - Dzien_roku/7 - 1;
      if (Wd_dec < Przesuniecie) Pierwszy_dzien_tygodnia_roku = (7 + Wd_dec) - Przesuniecie;        
      else                       Pierwszy_dzien_tygodnia_roku = Wd_dec - Przesuniecie; 
      
      Ilosc_dni_pierwszego_tygodnia_roku = 7 - Pierwszy_dzien_tygodnia_roku;
      
      if(Pierwszy_dzien_tygodnia_roku < 4) pierwszy_tydzien = 1;
      else                                 pierwszy_tydzien = 0;
      
      if(Dzien_roku - Ilosc_dni_pierwszego_tygodnia_roku)%7 > 0) tydzien = 1;
      else tydzien = 0;
      
      Tydzien_roku_byte = (Dzien_roku - Ilosc_dni_pierwszego_tygodnia_roku)/7 + pierwszy_tydzien + tydzien;
    }
    


    u8 to zmienna typu unsigned char - czyli liczba 8-bitowa bez znaku
    Tak naprawdę można to napisać w każdym języku w kótrym są tablice i operatowy arytmetyczne dzielenia i reszty z dzielenia
    pozdrawiam,
REKLAMA