Skocz do zawartości
Komentator

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

Pomocna odpowiedź

po z a tym że wykonują instrukcje dopóki spełniony jest warunek to nie bardzo

Udostępnij ten post


Link to post
Share on other sites
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ść).

Udostępnij ten post


Link to post
Share on other sites

no tak ale jeśli niczym innym się nie różnią to dlaczego jeśli if zastąpi się w tym programie while to program wykonuje tylko funkcje poczatek

Udostępnij ten post


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.

Udostępnij ten post


Link to post
Share on other sites

Hmm, to chyba jakiś kiepski troll, a nie newbie. Ja bym już nie karmił.

Udostępnij ten post


Link to post
Share on other sites

wgrałem program do mikrokontrolera i mówię co się dzieje 😋

Udostępnij ten post


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

Udostępnij ten post


Link to post
Share on other sites

Treker, mamy pierwszego trolla na Forbocie. To niesamowity moment dla naszej społeczności.

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

Marooned, Chumanista, ja nie będę od razu osądzał. Każdy może mieć trudny początek. Wolę wyjaśnić 🙂

Udostępnij ten post


Link to post
Share on other sites

Chumanista, ja jestem pierwszym trollem na forbocie. Tylko się dobrze kryję 🤣

Udostępnij ten post


Link to post
Share on other sites

Sorki za zamieszanie, dosyć dawno bawiłem się tego typu rzeczami i ubzdurała mi się pewna rzecz a nie dokładnie przeczytałem temat 2.

Udostępnij ten post


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ł 😋.

Udostępnij ten post


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?

Udostępnij ten post


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 😋

Udostępnij ten post


Link to post
Share on other sites

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!

Gość
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...