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

[bascom] zegar czasu rzeczywistego, 2 kody ktory poprawny?

wader_669 24 Maj 2009 20:03 4472 3
REKLAMA
  • #1 6570062
    wader_669
    Poziom 28  
    zawsze tak robilem gdy chcialem przyciskami dodawac/odejmowac godziny, sekundy lub minuty:

    
    on timer1 1sekunda
    do
    
    If Pinb.1 = 0 Then
    Waitms 45
    If Pinb.1 = 0 Then
    
       Incr Minuty
       If Minuty = 60 Then Minuty = 0
    
    End If
    End If
    
    loop
    
    1sekunda:
    
    Counter1 = Counter1 + costam
    Incr Sekundy
    
    If Sekundy = 60 Then
    Sekundy = 0
    Incr Minuty
    
       If Minuty = 60 Then
       Minuty = 0
       Incr Godziny
    
         If Godziny = 24 Then
         Godziny = 0
         End If
    
       End If
    
    End If
    
    
    


    wydaje mi sie to troche bezsensu, bo widac kawaleki kodu ktore sie powatrzaja np.

    
    if minuty=60 then minuty=0
    


    Moje pytanie: czy mozna to tak zrobic? (a jak nie to dlaczego, bo ja bym tak to napisale. Jednak w wiekszosci ksiazek kursow jest wczesniejszy przyklad pokazywany)

    
    on timer1 1sekunda
    do
    
    If Pinb.1 = 0 Then
    Waitms 45
    If Pinb.1 = 0 Then
    
    gosub minuty_x
    
    End If
    End If
    
    loop
    
    1sekunda:
    
    Counter1 = Counter1 + costam
    Incr Sekundy
    
    If Sekundy = 60 Then
    Sekundy = 0
    Incr Minuty
    
    minuty_x:   
    If Minuty = 60 Then
       Minuty = 0
       Incr Godziny
    
         If Godziny = 24 Then
         Godziny = 0
         End If
    
       End If
    
    End If
    
    
  • REKLAMA
  • #2 6570191
    Dawid_20
    Poziom 17  
    Jak najbardziej. Pierwsza część zawiera dwukrotnie to co u ciebie funkcja z tym warunkiem. Oba są prawidłowe, ale ten drugi "ładniejszy", porządniejszy zapis.

    Tylko taka mała uwaga, chyba masz coś pokręcone z miejscem rozpoczęcia i zakończenia instrukcji warunkowych. Funkcja minuty_x zawiera się w przerwaniu od timera i w ogóle nie ma powrotu z niej.

    1sekunda: 
    
    Counter1 = Counter1 + costam 
    Incr Sekundy 
    
    If Sekundy = 60 Then 
    Sekundy = 0 
    Incr Minuty 
    gosub minuty_x
    End if
    RETURN
    
    minuty_x:    
    If Minuty = 60 Then 
       Minuty = 0 
       Incr Godziny 
    
         If Godziny = 24 Then 
         Godziny = 0 
         End If 
    
    End If 
    Return
  • REKLAMA
  • Pomocny post
    #3 6571165
    mirekk36
    Poziom 42  
    Witam,

    daj sobie spokój z takim dziwnym skracaniem kodu bo zwykle w takich przypadkach wyłożysz się na plecy i długo będziesz szukał błędu.

    Po pierwsze - tym GoSub-em chcesz skakać do procedury obsługi przerwania, która wprawdzie w Bascomie kończy się dla programisty podobnie jak np zakończenie podprogramu bo rozkazem "Return" - ale to nie to samo w przypadku przerwania!

    powrót ze zwykłej procedury przekładany jest na asm - na RET a powrót z procedury przerwania na RETI . Nawet jeśli ci to zadziała - to będziesz tylko brnął w ślepą uliczkę na przyszłość.

    druga sprawa - unikaj poleceń Goto oraz Gosub - staraj się działać w oparciu o procedury i funkcje. I zobacz - wystarczyłoby, żebyś sobie zdeklarował takie 3 funkcje ZwiekszMinuty, ZwiekszGodziny i np ZwiekszSekundy - a później z dowolnych części programu mógłbyś najspokojniej w świecie do nich skakać - rozkazem CALL. Możesz to wtedy bez obaw robić zarówno z przerwania jak i z pętli głównej.

    Poza tym zamiast tyle IF-ować - mówię tu o twojej obsłudze klawiszy - to zaprzyjaźnij się w końcu z Debounce ;) bo to na prawdę ładnie działa - a widzę, że masz uprzedzenia i kod ci się rozrasta w dość nieczytelny sposób

    powodzenia
  • #4 6571414
    wader_669
    Poziom 28  
    Dzieki mirekk36. Tak myslalem, ze ty odpowiesz.
    Nie znam asm i dlatego popelnilem ten blad.
    Tez myslalem o opcji dodania suba, ktorego bym wykonywal z petli i przerwania.
    Dzieki za oswiecenie mirekk36.

    Dodano po 6 [minuty]:

    zamykam temat, bo juz jest wszystko jasne.
REKLAMA