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

[C] Migające diody na ATmega88 - problem z przyciskiem i kodem C

blue_17 07 Kwi 2012 20:55 1039 6
REKLAMA
  • #1 10769024
    blue_17
    Poziom 32  
    Witam napisałem sobie program migający diodami który odpalam przyciskiem

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    I mam pytanie jak przerobić kod aby po nacisnieęci kolejnego przycisku program przeszedł do następnej pętli w której zaprogramuje inny efekt

    niewątpliwie muszę sprawdzać czy przycisk jest wciśnięty w aktualnie wykonywanej pętli

    lub w jaki sposób zrobić przerzutnik RS jakaś dodatkowa zmienna czy może jakiś inny sposób

    Pozdrawiam
  • REKLAMA
  • #2 10769073
    Longer1989
    Poziom 24  
    Witam, jeżeli chodzi o przejście do kolejnej petli po naciśnięciu kolejnego przycisku to można zrobić na poleceniu switch/case.
  • REKLAMA
  • Pomocny post
    #3 10769114
    gaskoin
    Poziom 38  
    blue_17 napisał:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod



    Litości :)

    blue_17 napisał:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Litości :)


    Pomijąjąc powyższe fakty, program powinień wyglądać tak:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    lub jak kolega wyżej napisał użyj instrukcji case. Jest jeszcze jeden sposób nieco ładniejszy i wydajniejszy niż milion ifów, ale nie wiem czy jesteś gotowy (wskaźniki i inne cuda) :)
  • #4 10769240
    blue_17
    Poziom 32  
    gaskoin napisał:
    blue_17 napisał:

    Kod C - [rozwiń]
    DDRC |= (0<<PC2) | (0<<PC3) | (0<<PC4) | (0<<PC5);




    Litości :)


    Od przybytku głowa nie boli :)

    Co jest nie tak w miganiu diodami :?: pewnie da się to krócej zrobić :?: zapewne pop[rzez bezpośrednie wpisanie wartości :?: :)

    Kod ewaluuje :)

    Dzięki jeszcze pytanie czy to będzie tak działo że dopóki program == 0 to migaj w lego będzie wykonywać się bez końca

    taka pętla bez pętli :?:

    Co do użycia case to nie miałbym pomysłu jak wyskakiwać z pętli :/

    Pozdrawiam
  • REKLAMA
  • #5 10769277
    gaskoin
    Poziom 38  
    Zamiast 200 linijek kodu można użyć tak zwanej pętli :)

    patrz:

    załóżmy, że nie nacisnąłeś przycisku więc zmienna program = 0:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    póki nie naciśniesz przycisku cały czas będziesz wskakiwał w migaj_w_lewo(), jak naciśniesz, będziesz wskakiwał co obieg pętli w następną funkcję itd. Działa jakby było w pętli i nie musisz się martwić i jakieś wewnętrzne pętle.

    Z użyciem tablicy wskaźników na funkcję można zapisać to tak:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Ma to ten plus, że dodanie nowego programu to po prostu dodanie wpisu do tablicy wskaźników na funkcję. Takie rozwiązanie bym Ci polecał, do nauki idealne :)
  • REKLAMA
  • #7 10769337
    gaskoin
    Poziom 38  
    No to pomyśl Sherlocku :)
    Nie wiem jak będziesz odczytywał te przyciski. W każdym bądź razie, możesz zrobić tak, że po naciśnięciu pierwszego przycisku przypisujesz do zmiennej program wartość 1, po naciśnięciu drugiego, wpisujesz tam 2 itd... Rozbije to kod na wyodrębnioną funkcję czytania co wg mnie będzie czytelniejsze niż czytanie osobno klawiszy w stu miejscach. Czy to będzie przerwanie, czy w while'u.

    Kod byłby taki:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Ewentualnie użycie timera do czytania przycisków, lub ADC, nie wiem co tam wykombinowałeś, to już musisz sam ułożyć jakoś.

    Jeśli w ogóle nigdy nie używałeś wskaźników to możesz sobie darować, chyba, że poszukasz jakiegoś gotowa, tzn jak deklarować wskaźnik na funkcję, czy tablicę wskaźników na funkcję i jak takie wskaźniki używać bez zrozumienia co się dzieje:).
REKLAMA