Skocz do zawartości

Kurs Arduino - #7 - Wyświetlacz tekstowy, LCD 2x16


Pomocna odpowiedź

dlaczego po zastąpieniu if while program stoi w miejscu ( początek ). Czy while ma większy priorytet niż if ? a jeśli są same while to wykonywana jest po prostu pierwsza pętla while tylko ?

Nie, priorytet w C/C++ to pojęcie, które dotyczy wyłącznie wyrażeń* i operatorów, zaś if czy while nie są wyrażeniami, tylko konstrukcjami sterującymi.

Program tak długo wykonuje kod pętli while, dopóki wyrażenie logiczne (warunek) tej pętli jest prawdziwe. Dlatego można stwierdzić, że program pozornie "stoi w miejscu" - w rzeczywistości sprawdza on prawdziwość warunku pętli, po czym wykonuje kod owej pętli, w przypadku prawdziwości warunku. Jeśli tylko tak się stanie, że warunek będzie fałszywy, pętla przestaje się wykonywać, a program wychodzi poza pętlę, do kolejnych instrukcji.

Zaś if jest wykonywany tylko raz i to wyłącznie w przypadku, gdy wyrażenie logiczne jest prawdziwe.

______________

*- wyrażenia w języku C/C++ to dość szeroko rozumiane pojęcie. Mamy wyrażenia arytmetyczne, czyli np. dodawanie, dzielenie, itd; logiczne, czyli np. takie stosowane w warunkach i pętlach: (flaga == true && odczyt == false) lub bitowe, np. (1 << port).

Ponadto przypisania oraz wywołania funkcji traktowane są jako wyrażenia (każda funkcja, "która nie jest oznaczona typem void", zwraca pewną wartość).

Link to post
Share on other sites

tarkki, nie wiem skąd wyciągasz takie wnioski. Pętla while i instrukcja warunkowa if, to ZUPEŁNIE co innego. Przeczytaj artykuł, który Ci wskazałem.

Link to post
Share on other sites

tarkki, to zanim działać na oślep. Przeczytaj kurs od początku. Dobrze? Każdemu będzie łatwiej. Edycja programu na oślep nie przyspieszy Twojej nauki.

Miło by było, gdybyś również zaczął stosować się do zasad forum. Używał interpunkcji i wielkich liter na początku zdania.

  • Lubię! 1
Link to post
Share on other sites

Co do stopera - zedytowałem sobie trochę zadanie z kursu dodając opcje interwałową (w sensie, że można przyciskiem zastopować odliczanie i ruszyć dalej z tego samego punktu) i wykonałem coś takiego na dwóch przyciskach:

#include <LiquidCrystal.h> //Dołączenie bilbioteki
LiquidCrystal lcd(2, 3, 4, 5, 6, 7); //Informacja o podłączeniu nowego wyświetlacza
int ms = 20;
int s = 0;
int m = 0;
int h = 0;

void setup() {
 lcd.begin(16, 2);
 lcd.clear();
 lcd.setCursor(0,0);
 lcd.print("Czas:[h:m:s:ms]");
 lcd.setCursor(0,1);
 lcd.print("00:00:00:00");
 pinMode(11, INPUT_PULLUP);
 pinMode(12, INPUT_PULLUP);

}

void loop() {
 while(digitalRead(11)!=LOW) {};
 delay(200);
 while(digitalRead(11)!=LOW && digitalRead(12)!=LOW) {
   if(ms>=100){
     ms=0;
     s+=1;
   }
   lcd.setCursor(9,1);
   if(ms<10) {
     lcd.print("0");
     lcd.print(ms);
   }
   else {
     lcd.print(ms);
   }

   if(s>=60) {
     s=0;
     m+=1;
   }
   lcd.setCursor (6,10);
   if(s<10) {
     lcd.print("0");
     lcd.print(s);
   }
   else {
     lcd.print(s);
   }

   if(m>=60) {
     m=0;
     h+=1;
   }
   lcd.setCursor(3,1);
   if(m<10) {
     lcd.print("0");
     lcd.print(m);
   }
   else {
     lcd.print(m);
   }

   if (h==23 && m==59 && s==59 && ms==99) {
     h=0;
     m=0;
     s=0;
     ms=0;
   }
   lcd.setCursor(0,1);
   if(h<10) {
     lcd.print("0");
     lcd.print(h);
   }
   else {
     lcd.print(h);
   }
   delay(10);
   ms+=1;
 }
 while (digitalRead(11)==LOW){
   lcd.setCursor(0,0);
   lcd.print("Ending's time:  ");
   delay(500);
   while (digitalRead(11)!=LOW) {};
   lcd.clear();
   lcd.setCursor(0,0);
   lcd.print("Czas:[h:m:s:ms]");
   lcd.setCursor(0,1);
   lcd.print("00:00:00:00");
   h=0;
   m=0;
   s=0;
   ms=20;
   delay(200);

 }
 while (digitalRead(12)==LOW) {
   while(digitalRead(11)!=LOW) {};
   ms+=20;
 }
}

Domyślam się, że Treker to mnie wypatroszy za zupełny brak komentarzy w kodzie, ale urządzenie działa 😋. Zastanawiałem się jeszcze jakby zrobić zapisywanie tych interwałowych wyników, ale żeby jakoś to zręcznie i elegancko bez kilkunastu zmiennych wykonać to w tym języku jest dla mnie za trudne. Prędzej w asemblerze na stosie coś takiego bym wykminił 😋.

Link to post
Share on other sites

PrimeSoul, oczy mi krwawią przez brak komentarzy 😋 Niedługo sam zapomnisz, jak ten program miał działać. Gdzie dokładnie chciałbyś zapamiętać te wartości i co konkretnie chcesz z nimi zrobić później?

Link to post
Share on other sites

No właśnie kwestia taka, że nie wiem, gdzie byłoby najlepiej zapisać te wartości. A służyłyby wyłącznie do odczytu na samym końcu pomiaru czasu (w sensie wyświetlałoby po kolei każdy interwałowy czas). O ile w asemblerze skorzystałbym ze stosu pewnie i przerzucałbym od razu wartości z akumulatora na wyświetlacz, ewentualnie po drodze korzystając z jakichś rejestrów pomocniczych, tak w Arduino no cóż, zielony jestem 😋

Link to post
Share on other sites
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.