Programowanie. Elektronika dla Wszystkich 29
|
|
- Beata Sowińska
- 6 lat temu
- Przeglądów:
Transkrypt
1 Kurs AVR lekcja 6 lcdstring("elektronika dla wszystkich"); Rozwiązania zadań z ostatniego odcinka W zadaniu numer 1 mieliśmy wykonać przesuwanie tekstu na wyświetlaczu. Służy do tego funkcja Cursor or display shift (makro LCD_COMMAND_SHIFT), której musimy podać, czy przesuwamy kursor, czy tekst, i w którą stronę. Ponieważ przesuwamy tekst, musimy ustawić bit 3. Mamy dla niego stworzone makro LCD_PARAM_ SHIFT_DISPLAY. Spróbujmy np. przesuwać w lewo. Nie trzeba więc ustawiać bitu 2. Aby uzyskać ciągłe przesuwanie, komendę przesuwającą trzeba umieścić w pętli i dodać niewielkie opóźnienie (listing 1). Zadanie drugie było analogiczne, ale przesuwanie miało być wywoływane z klawiatury. Wystarczy więc odczytywać stan przycisków, np. S1 i S2 a następnie wydać odpowiednią komendę przesuwającą. Należy tylko pamiętać, że klawiatura będzie podłączona do innego portu niż LCD, np. do portu D. Konieczna jest więc zmiana makr w bibliotece LCD lub modyfikacja funkcji readkeyboard() (listing 2). Zadanie 3 było zachętą do podejścia do tematu wyświetlania tekstu wpisywanego z klawiatury. Najpierw musimy pomyśleć, jakie znaki mają być pod danymi przyciskami. Przypisanie znaków do przycisków da nam mapę, np. taką: uint8_t keymap[16] = 'A', 'B', 'C', 'D', 'a', 'b', 'c', 'd', '1', '2', '3', '4', '5', '6', 126, 127 ; Oczywiście zamiast liter i cyfr przedstawionych powyżej można użyć innych znaków obsługiwanych przez wyświetlacz. Jeśli znak nie daje się wpisać z klawiatury naszego komputera, zamiast umieszczać go w apostrofach, można bezpośrednio wpisać liczbę będącą kodem ASCII tego znaku. Przykładem są tu kody 126 i 127, które dają symbole strzałek (dla japońskiej wersji wyświetlacza). Następnie wystarczy odczytywać stan przycisków i w zależności od numeru przycisku wybierać element z mapy klawiatury (listing 3): uint8_t key = readkeyboard(); if (key) lcdwritedata(keymap[key - 1]); Od numeru klawisza odejmujemy 1, ponieważ klawisze są numerowane od 1, a elementy tablicy od 0. Definiowanie własnych znaków W poprzedniej lekcji poznaliśmy możliwości wyświetlacza opartego na sterowniku HD44780, nie omówiliśmy jednak dokładnie tworzenia własnych znaków. Definiujemy je w ten sposób, że w pamięci CG RAM wyświetlacza umieszczamy bajty określające wygląd znaku piksel po pikselu. Znaki wyświetlane są na matrycy 5x8 pikseli, czyli mają 5 kolumn i 8 wierszy. Na każdy wiersz przypada jeden bajt pamięci CG lcdwritecommand(lcd_command_shift LCD_PARAM_SHIFT_DISPLAY); lcdstring("elektronika dla wszystkich"); uint8_t key = readkeyboard(); if (key) Listing 1 RAM, potrzebujemy więc 8 bajtów na znak. Z każdego bajtu u ż ywanych jest 5 młodszych bitów na zdefiniowanie wyglądu danego wiersza. Definiowanie własnego znaku najlepiej zacząć od narysowania go. Załóżmy, że chcemy wyświetlić napis Cześć!, więc potrzebujemy liter ś oraz ć. Narysujmy je (rysunek 1). if (key == 1) lcdwritecommand(lcd_command_shift LCD_PARAM_SHIFT_DISPLAY); if (key == 2) lcdwritecommand(lcd_command_shift LCD_PARAM_SHIFT_DISPLAY LCD_PARAM_SHIFT_RIGHT); Programowanie Oczywiście nie ma problemu, aby tworzyć różne znaki, niekoniecznie polskie ogonki, np. ikony baterii czy termometru, zależnie od potrzeb. A dysponując odpowiednim zestawem ikon i kolejno je podmieniając możemy łatwo stworzyć animację. Mając rysunki znaków, możemy w łatwy sposób umieścić je w kodzie naszego programu w postaci tablicy bajtów. Po prostu piksel włączony (czarny) da nam bit o wartości 1, a piksel wyłączony (przezroczysty) da bit 0. W kodzie możemy skorzystać z notacji bitowej, nie trzeba przeliczać bajtów na wartości szesnastkowe lub dziesiętne. uint8_t customchars[8] = 0b00010, 0b00100, 0b00001, 0b11110, 0b00000 ; uint8_t customcharc[8] = 0b00010, 0b00100, 0b10001, 0b00000 ; Gdy mamy już tablice bajtów definiujące nasze znaki, musimy umieścić je w pamięci CG RAM wyświetlacza. Przed zapisem do tej pamięci musimy poinformować wyświetlacz, że wysyłane dane mają trafić do tej właśnie pamięci, a nie tak jak zwykle do DD RAM. Inaczej wysyłane przez nas bajty zostałyby potraktowane jako kody znaków do wyświetlenia a nie jako definicje własnych znaków. Patrząc na tabelę komend z poprzedniego odcinka, widzimy, że potrzebujemy wydać komendę Set CG RAM address, której sześć młodszych Listing 2 Rys. 1 bitów wyznacza adres, od którego począwszy, będziemy zapisywać wygląd naszych znaków. Ponieważ jeszcze żadnych znaków nie Elektronika dla Wszystkich 29
2 definiowaliśmy, możemy zacząć od początku pamięci CG RAM, czyli od adresu 0. Wydajemy więc samą komendę, bez ustawiania dodatkowych bitów. Następnie wysyłamy bajty opisujące znaki, korzystając z pętli, które wyślą nasze tablice. lcdwritecommand(lcd_command_set_cgram_address); lcdwritedata(customchars[i]); lcdwritedata(customcharc[i]); Gdy zdefiniowane przez nas znaki są w pamięci, możemy je wyświetlić. Jak pamiętamy, znaki użytkownika mają kody 0 7, są też powtórzone pod kodami Jeśli wysłaliśmy najpierw literkę ś, a potem ć, to ś będzie pod kodem 0, a ć pod 1. Zanim jednak wyślemy kody naszych literek, musimy poinformować wyświetlacz, że nie chcemy już definiować znaków, tylko je wyświetlić. Innymi słowy, trzeba przestawić wyświetlacz z zapisu do CG RAM na zapis do DD RAM, np. wykorzystując napisaną już wcześniej funkcję lcdgoto- XY(). lcdwritedata(0); lcdwritedata(1); Nasze znaki działają poprawnie. A czy da się je wykorzystać w funkcji lcdstring() i umieścić w środku tekstu, a nie wyświetlać pojedynczo? Musielibyśmy kody naszych znaków wstawić do łańcucha znaków. Spróbujmy więc umieścić w kodzie taką linijkę (\xn oznacza bajt w postaci szesnastkowej): lcdstring("cze\x0\x1!"); Niestety naszym oczom ukazują się tylko pierwsze trzy litery. Co się stało z pozostałymi? W języku C koniec łańcucha znaków wyznaczony jest przez bajt o wartości zero. Gdy umieszczamy tekst w cudzysłowie, definiując łańcuch znaków, kompilator dodaje jeszcze na końcu zero. Korzysta z tego nasza funkcja lcdstring(), która wysyła dane do wyświetlacza, dopóki nie trafi na wartość 0. Problem polega na tym, że my bajt o wartości zero wstawiliśmy do środka tekstu, bo taki kod ma literka ś. Dla funkcji lcdstring() nasz tekst kończy się więc zaraz za literką e. Jak to rozwiązać? Możemy po prostu literkę ś umieścić w jakimś innym miejscu CG RAM, np. za literką ć, czyli pod adresami Wtedy otrzyma ona kod 2. A jeśli potrzebujemy zdefiniować 8 znaków, czyli wykorzystać całą pamięć CG RAM, łącznie z pierwszymi jej 8 bajtami, definiującymi znak o kodzie 0? Możemy wykorzystać tutaj fakt, że znaki użytkownika mają zdublowane kody: każdy z nich ma też kod większy o 8. Czyli nasza literka ś jest nie tylko pod kodem 0, ale też pod kodem 8. Analogicznie ć jest pod kodem 9. Sprawdźmy to: lcdstring("cze\x8\x9!"); Tym razem się udało, na wyświetlaczu widać cały tekst. Czy zostało nam jeszcze coś do zrobienia? Na pewno warto by opakować definiowanie znaku w wygodną do użycia funkcję i umieścić ją w naszej bibliotece, aby nie trzeba było tego robić w głównym programie. Funkcja taka pobierałaby tablicę opisującą znak oraz adres, pod którym miałby się on znaleźć w CG RAM: void lcddefinechar(uint8_t chardefinition[], uint8_t address) lcdwritecommand(lcd_command_set_cgram_address + address); lcdwritedata(chardefinition[i]); Funkcję tę umieszczamy w naszej bibliotece, czyli powyższą definicję w pliku lcd.c, a nagłówek w lcd.h. Dzięki temu staje się ona dostępna w głównym programie: lcddefinechar(customchars, 0); lcddefinechar(customcharc, 8); Przy definiowaniu znaku za pomocą lcd- DefineChar() podajemy adres w CG RAM, a przy jego wykorzystaniu podajemy jego kod. Ponieważ znak zajmuje 8 bajtów, kod znaku jest 8 razy mniejszy od jego adresu. Przeliczanie nie jest więc trudne. Ale jeśli ktoś chce, może przepisać tak funkcję, aby przyjmowała kod znaku. Obliczanie adresu zostanie w ten sposób schowane wewnątrz biblioteki i pisząc główny program, nie trzeba będzie się przejmować adresami w CG RAM. Wtedy pierwsza linijka funkcji będzie wyglądać następująco: lcdwritecommand(lcd_command_set_cgram_address + code * 8); Zakładamy tu zmianę nazwy drugiego parametru funkcji z address na code. Jak wspomniano, oprócz kodów znaków 0 7 wyświetlacz przyjmuje też zduplikowane kody Wykorzystaliśmy to przed chwilą aby rozwiązać problem z kodem 0. Aby obsługiwać takie kody, nasza zmodyfikowana funkcja musi przed wykonaniem mnożenia wykonać operację modulo: lcdwritecommand(lcd_command_set_cgram_address + (code % 8) * 8); Dzięki temu w głównym programie możemy napisać (listing 4): lcddefinechar(customchars, 8); lcddefinechar(customcharc, 9); Tego typu modyfikacje mogą się wydać nieistotnymi szczegółami, w końcu program działa i tak, i tak. Jednak w większych projektach stają się one istotne. Pozwalają utrzymać spójność, porządek i pomagają w uniknięciu pomyłek. Funkcja sprintf() W dotychczasowych przykładach wyświetlaliśmy prosty tekst, posiłkując się co najwyżej samodzielnie zdefiniowanymi znakami. Jak jednak wyświetlić np. liczbę? Oczywiście wśród znaków obsługiwanych przez wyświetlacz są cyfry i możemy np. wyświetlić napis 123. Jak jednak uzyskać w trakcie działania programu odpowiedni łańcuch cyfr, mając wartość liczbową zapisaną w zmiennej? Dla pojedynczej cyfry jest jeszcze łatwo, bo aby uzyskać odpowiednią cyfrę, wystarczy wartość danej zmiennej dodać do kodu ASCII cyfry 0: uint8_t i = 5; lcdwritedata('0' + i); Zero umieszczone w apostrofach oznacza pojedynczy znak, który w języku C jest tak naprawdę kodem ASCII tego znaku. Cyfra 0 ma kod 48, więc zamiast 0 moglibyśmy napisać po prostu 48. Kolejne cyfry mają kolejne kody, dlatego dodając daną wartość do kodu cyfry 0, otrzymamy cyfrę odpowiadającą tej wartości. W powyższym przykładzie wyświetlona zostanie cyfra 5. Co jednak z liczbami dwu-, trzycyfrowymi lub większymi? Musielibyśmy obliczyć liczbę jedności, dziesiątek, setek itd. i w ten sposób otrzymać kody kolejnych cyfr liczby. Napisanie programu, który by to wykonywał, nie jest trudne, ale istnieje inny prosty sposób: mamy do dyspozycji funkcję sprintf(), znajdującą się w standardowej bibliotece stdio.h. sprintf() ma następujący nagłówek: int sprintf(char str[], const char format[],...); Działa ona w ten sposób, że we wskazanym miejscu pamięci (tablica str) umieszcza ciąg znaków będący wynikiem podstawiania wartości do wzorca formatującego (tablica format). Może to brzmieć zawile, więc popatrzmy na przykład użycia: char str[15]; sprintf(str, "Napiecie: %dv", 230); Definiujemy tablicę typu char, która ma 15 elementów (bajtów). To jest obszar, na którym pracujemy. Tablicę tę przekazujemy do funkcji sprintf() jako jej pierwszy parametr. Drugim parametrem jest ciąg znaków, który funkcja sprintf() kopiuje do naszej tablicy. Nie jest to jednak zwykłe kopiowanie. Gdy sprintf() napotka na znak %, wie, że jeden lub więcej kolejnych znaków to specjalne symbole, pod które trzeba podstawić wartości przekaza- 30 Elektronika dla Wszystkich
3 Programowanie ne w kolejnych parametrach. W naszym przykładzie %d oznacza, że ma być podstawiona liczba dziesiętna. W rezultacie w tablicy str znajdą się znaki jak pokazuje tabela 1. Ogólnie symbol formatujący ma następującą postać: %[flagi][szerokość][.precyzja][długość]specyfikator Tylko specyfikator jest obowiązkowy. Mówi on o tym, jaki typ danych chcemy wyświetlić. Jak już wiemy, specyfikator d oznacza liczbę dziesiętną. Pełna lista specyfikatorów, np. dla liczb zmiennoprzecinkowych i szesnastkowych, znajduje się w tabeli 2. Flagi (tabela 3) określają takie właściwości, jak wyrównanie czy wstawianie zer wiodących. Szerokość oznacza minimalną liczbę znaków do wyświetlenia. Jeśli liczba ma mniej cyfr niż podana szerokość, zostaną dodane spacje. Jako szerokość może być podana gwiazdka (*). Wtedy szerokość wyznaczana jest w kolejnym parametrze przekazywanym do sprintf(). Dzięki temu szerokość da się ustawić dynamicznie, a nie jest określona z góry na etapie pisania programu. Precyzja Tabela 2 to liczba cyfr po kropce dziesiętnej (nie ma możliwości stosowania przecinka jako symbolu dziesiętnego, jak to jest przyjęte w Polsce). Tutaj też można podać gwiazdkę i liczbę cyfr po przecinku przekazać przez parametr. W miejscu trzeciego parametru funkcji sprintf() znajduje się trzykropek. Oznacza to, że jest to funkcja o zmiennej liczbie parametrów i możemy do niej przekazać kilka wartości do podstawienia. Jak zostało wspomniane, pierwszym parametrem sprintf() jest tablica, w której umieszczany jest wynik działania funkcji. Jak duża powinna być ta tablica? Musi się w niej zmieścić cały napis wraz z bajtem o wartości zero (znakiem NULL) oznaczającym koniec tego napisu. To na programiście spoczywa odpowiedzialność za zapewnienie, że przekazywana tablica będzie wystarczająco duża. Funkcja sprintf() nie zna rozmiaru przekazywanej tablicy. Jeśli będzie ona za mała, sprintf() nadpisze obszar pamięci znajdujący się za wskazaną tablicą, co może doprowadzić do nadpisania innych zmiennych lub niekontrolowanych przeskoków. Bezpieczniejsza w użyciu jest funkcja snprintf(), która dodatkowo pobiera rozmiar przekazywanej tablicy w drugim parametrze: int snprintf(char str[], size_t n, const char * format, ); Rozmiar tablicy jest znany w czasie kompilacji, da się więc go pobrać operatorem sizeof i przekazać do snprintf(): snprintf(str, sizeof(str), "Napiecie: %dv", 230); Obie funkcje zwracają wartość typu int oznaczającą liczbę bajtów, które zostały przez nie zapisane do tablicy. Uwaga! W przypadku użycia specyfikatora zmiennoprzecinkowego, np. %f lub %g, konieczne jest we właściwościach projektu (Toolchain -> AVR/GNU Linker -> Miscellaneous) dodanie następujących flag linkera: -Wl,-u,vfprintf -lprintf_flt Funkcja printf() W kursie języka C poznaliśmy funkcję printf() służącą do wyświetlania tekstu na ekranie. Czy jest możliwe, aby wykorzystać ją do wyświetlania tekstu Tabela 1 na naszym LCD? Byłaby prostsza w użyciu, bo nie musielibyśmy się martwić tablicą roboczą. printf() kieruje generowany tekst na tzw. standardowe wyjście, które jest jednym z kilku strumieni dostępnych w systemie operacyjnym. W naszym przypadku nie ma systemu operacyjnego, ale możemy zarządzać strumieniami dostarczanymi przez biblioteki AVR-GCC. Kluczowa jest tu funkcja fdevopen() służąca do otwarcia strumienia dla danego urządzenia. Jej nagłówek jest następujący: FILE* fdevopen(int(*)(char, FILE *)put, int(*)(file *)get); Może on wyglądać niezrozumiale, ale idea jest prosta: musimy dostarczyć wskaźniki na dwie funkcje: put() i get(), które będą zapisywały i odczytywały po jednym znaku z danego urządzenia. Aby działała nam funkcja printf(), potrzebujemy funkcji zapisującej, czyli put. Ma ona przyjmować dwa parametry: znak oraz wskaźnik na typ FILE. Wskaźnik ten nie będzie przez nas wykorzystywany. Z nagłówka funkcji put () widzimy, że ma ona zwracać typ int. Konkretnie ma być to wartość 0 przy prawidłowym zapisie i różna od 0, gdy zapis się nie powiedzie. Nasza funkcja lcdwritedata() nie sprawdza błędów, więc put() będzie prostym opakowaniem dla lcdwritedata() zwracającym zawsze zero: int put(char c, FILE * file) lcdwritedata(c); return 0; Możemy teraz zainicjalizować strumień: devopen(&put, NULL); Pierwszym parametrem jest nasza funkcja put. Nie piszemy za nią nawiasów, bo nie chcemy jej wykonać, a jedynie przekazać jej adres do funkcji devopen(). Podkreśla to dodatkowo operator adresu &. Jako wskaźnik na funkcję get() podajemy NULL, liczbowo 0, czyli pusty wskaźnik. Otrzymujemy strumień z opcją zapisu, skojarzony z naszą biblioteką LCD. A jak go podpiąć pod printf()? Nic przecież w powyższej linijce nie robimy z wartością zwróconą przez fdevopen(). Otóż działa to bardzo prosto. Pierwszy strumień otwarty do zapisu staje się standardowym wyjściem (stdout) oraz standardowym wyjściem błędów (stderr). Elektronika dla Wszystkich 31
4 Z kolei pierwszy otwarty strumień odczytu staje się standardowym wejściem (stdin). A więc nic już nie musimy robić, możemy korzystać z printf() i tekst będzie się wyświetlał na LCD. Dla wygody funkcję put() oraz przekierowanie strumienia umieśćmy w naszej bibliotece. Definicja (treść) funkcji put() trafi więc do pliku lcd.c. W lcd.h umieścimy nagłówek tej funkcji oraz dyrektywę #include dołączającą bibliotekę stdio.h, aby przy przetwarzaniu pliku lcd.h kompilator znał typ FILE. Potrzebujemy jeszcze jakoś opakować wywołanie devopen(). Stwórzmy więc funkcję o nazwie np. lcdinitprintf(): void lcdinitprintf() fdevopen(&put, NULL); Umieszczamy ją w lcd.c, a jej nagłówek w lcd.h. Teraz w naszym głównym programie możemy wywołać lcdinitprintf() i następnie korzystać z printf() (listing 5): printf("elektronika"); Sekundnik Wiemy już, jak odmierzać czas, umiemy też wyświetlać dane na LCD. Nie ma zatem przeszkód, żeby stworzyć prosty zegar. Dojdziemy do tego jednak etapami, zaczynając od najprostszych programów. Na początek weźmy odliczanie sekund mijających od uruchomienia programu. Jak odmierzać sekundy? Dobrze nadawałby się tutaj 16-bitowy Timer1, którego możliwości były przedstawione w części 4. kursu. Zaznajomiliśmy się wtedy również z kilkoma rzeczami, które trzeba wziąć pod uwagę przy odmierzaniu czasu. Załóżmy, że korzystamy z wewnętrznego generatora RC do taktowania naszego mikrokontrolera i jest on ustawiony na domyślną częstotliwość 1MHz. Timer1 może być taktowany sygnałem zegarowym podzielonym przez 1, 8, 64, 256 lub Przez które z tych liczb da się podzielić (Hz), aby uzyskać liczbę całkowitą? Będą to 1, 8 i 64. Czy możemy wybrać dowolny z tych dzielników? Licznik jest 16-bitowy, więc po podziale 1MHz musimy otrzymać liczbę mieszczącą się w przedziale do Warunek ten spełnia tylko dzielnik 64 dający licz- Tabela 3 bę Wiemy więc już, jak skonfigurować Timer1: musi być taktowany sygnałem zegarowym podzielonym przez 64 i resetować się po doliczeniu do Resetowanie po osiągnięciu tej wartości możemy zrealizować funkcją CTC. Do rejestru OCR1A wpisujemy liczbę 15624, ponieważ licznik nie resetuje się w momencie osiągnięcia wpisanej liczby, tylko dopiero w następnym cyklu. Nasz przykładowy kod będzie wyglądał jak na listingu 6. Nie jest on skomplikowany, korzystamy z elementów omówionych wcześniej: inicjalizacja wyświetlacza, konfiguracja trybu pracy Timer1 (CTC, podział zegara przez 64), inicjalizacja zmiennej liczącej sekundy, a w pętli głównej: ustawienie kursora na początku wyświetlacza, wyświetlenie liczby, oczekiwanie na osiągnięcie przez licznik wartości CTC (15625), wyczyszczenie flagi i wreszcie zwiększenie zmiennej sekund. Rozpatrzmy odwrotne działanie programu: odliczanie sekund od zadanej wartości do zera. W powyższym przykładzie wystarczy zainicjalizować zmienną s odpowiednią wartością, a inkrementację zmiennej zastąpić dekrementacją. Wszystko OK, ale taki program będzie mało praktyczny. Przydałoby się, żeby można było wpisywać wartość początkową z klawiatury oraz żeby była jakaś sygnalizacja dojścia do zera. Teraz zmienna się przekręca i wyświetlane są wartości ujemne. Uważni Czytelnicy zapytają zapewne, dlaczego otrzymujemy liczby ujemne, skoro zadeklarowaliśmy zmienną s jako bez znaku (unsigned). Otóż funkcja printf() dla symbolu %d traktuje przekazany parametr jako int, który w przypadku naszego kompilatora AVR-GCC jest równoważny typowi int16_t, czyli 16-bitowemu typowi ze znakiem. Nasza zmienna s jest do tego typu konwertowana. Mamy nawet o tym wyświetlane ostrzeżenie w okienku rezultatów kompilacji: Warning: format '%d' expects argument of type 'int', but argument 2 has type 'uint32_t' [-Wformat=] Zadeklarujmy więc zmienną s jako po prostu int. Jeśli jednak nie pasuje nam oferowany przez ten typ zakres wartości ( dla AVR-GCC), możemy symbol %d zastąpić symbolem %u, który oznacza również liczbę dziesiętną, ale bez znaku (nieujemną). Wtedy po dojściu do zera otrzymamy 65535, itd. Jeśli TCCR1B = _BV(WGM12) _BV(CS11) _BV(CS10); OCR1A = 15624; uint32_t s = 0; printf("%d", s); while(!(tifr & _BV(OCF1A))); TIFR = _BV(OCF1A); s++; Listing 6 nadal jednak chcemy mieć pełny zakres oferowany przez typ uint32_t, to musimy użyć symbolu %lu (long unsigned). Wówczas bez przeszkód wyświetlimy liczby od 0 do , oczywiście deklarując zmienną s jako uint32_t. Jest jeszcze jeden problem: jeśli wyświetlona jest liczba 10, a następnie wyświetlimy 9, to na wyświetlaczu mamy 90, bo wyświetlana jest po prostu dziewiątka i zero nie jest kasowane. Rozwiązanie już poznaliśmy: przy symbolu można podać długość, np. %3d (liczba dziesiętna trzycyfrowa). Dzięki temu liczba 10 będzie mieć postać [spacja]10, a liczba 9 będzie mieć postać [spacja][spacja]9. Wpisywanie liczby z klawiatury Wracamy do pytania: jak możemy zainicjalizować odliczanie sekund? Mamy opanowane odczytywanie stanu klawiszy, potrzebujemy móc wpisać kilkucyfrową liczbę. Żeby to zrobić, potrzebne jest zdefiniowanie, jak dokładnie przebiegać będzie wpisywanie liczby. Na pewno trzeba poczekać na wciśnięcie przycisku. Gdy ono nastąpi, trzeba zapamiętać jego numer. Następnie trzeba poczekać na zwolnienie przycisku. W tym miejscu algorytm można powtórzyć, aby obsłużyć kolejne wciśnięcie przycisku. Jednak użytkownik musi jakoś zakończyć wpisywanie liczby. Jeden z klawiszy będzie więc pełnił funkcję klawisza Enter i jego wciśnięcie będzie oznaczało koniec wpisywania. Przydałaby się tutaj funkcja czekająca na wciśnięcie klawisza i zwracająca jego numer. Nasza funkcja readkeyboard() zwraca bowiem informację o stanie klawiatury w danej chwili i nie jest zbyt wygodna. Napiszmy więc taką funkcję: uint8_t getkey() uint8_t key = 0; while (!(key = readkeyboard())); while (readkeyboard()); return key; Pierwsza pętla while może się wydać dziwna, dlaczego jest tam pojedynczy znak równości? Nie chcemy jednak sprawdzać, czy zmienna key jest równa wartości zwracanej przez funkcję readkeyboard(), 32 Elektronika dla Wszystkich
5 int readnumber() char input[6]; uint8_t inputindex = 0; while(inputindex < (sizeof(input) - 1)) uint8_t key = 0; key = getkey(); if (key < 10) input[inputindex] = '0' + key; if (key == 10) input[inputindex] = '0'; if (key == 16) break; inputindex++; input[inputindex] = 0; return atoi(input); Listing 7 Listing 8 int s = readnumber(); printf("%d", s); TCCR1B = _BV(WGM12) _BV(CS11) _BV(CS10); OCR1A = 15624; printf("%3u", s); while(!(tifr & _BV(OCF1A))); TIFR = _BV(OCF1A); s--; więc nie użyjemy podwójnego znaku równości. Jak pamiętamy, pojedynczy znak równości oznacza przypisane. Wartość zwrócona przez readkeyboard() jest podstawiana do zmiennej key, a następnie wartość ta po negacji operatorem wykrzyknika jest sprawdzana przez pętlę while. Możemy powiedzieć, że przypisanie zwraca wartość. Pętla while wykonuje się tak długo, jak długo readkeyboard() zwraca zero. Przedstawiona konstrukcja jest równoważna poniższej pętli: do key = readkeyboard(); while (!key); W kolejnej pętli czekamy na zwolnienie klawisza. Działanie funkcji getkey() możemy przetestować np. w następujący sposób: char k[3]; k[0] = '0' + getkey(); k[1] = '0' + getkey(); k[2] = 0; lcdstring(k); Zdefiniowany został łańcuch znaków, do którego da się wpisać dwa znaki. Trzeci element to oczywiście zero kończące łańcuch. Po wpisaniu cyfr łańcuch jest wyświetlany na LCD. A po co jest dodawanie zer? Funkcja getkey() zwraca numer klawisza, czyli liczby od 1 do 16. Aby otrzymać znaki/cyfry, do numeru klawisza trzeba dodać kod ASCII cyfry zero. Czyli numer klawisza staje się przesunięciem względem znaku zero. Uwaga: w tym momencie korzystamy zarówno z klawiatury, jak i wyświetlacza. Muszą one więc działać na różnych portach, nie możemy podłączyć obu do jednego portu. Jeśli LCD mamy podłączony do portu A, to klawiaturę możemy podłączyć do portu D. Oczywiście wymaga to modyfikacji funkcji readkeyboard(), w tym także linijki ustawiającej cztery piny jej portu jako wyjścia: W powyższym przykładzie wczytywaliśmy dwie cyfry. Jak wczytać inną liczbę cyfr? Wygodnie by było, gdyby jeden z klawiszy pełnił funkcję klawisza Enter. Jego wciśnięcie oznaczałoby koniec wpisywania. Musimy więc zapamiętywać wciśnięte klawisze tak długo, jak nie zostanie wciśnięty ten klawisz. Obsługując klawiaturę w przedstawiany sposób, otrzymamy ciąg znaków. Co zrobić, aby otrzymać liczbę? Z pomocą przychodzi nam biblioteczna funkcja atoi(), która właśnie zwraca wartość liczbową na podstawie podanego ciągu znaków. Deklaracja atoi() znajduje się w bibliotece stdlib.h, musimy więc dołączyć ją do naszego programu za pomocą #include. Mamy już wszystko, co potrzebne, aby napisać funkcję wczytującą liczbę z klawiatury (listing 7): Ponieważ atoi() zwraca typ int, tak samo zwraca go nasza funkcja. Powoduje to też, że maksymalną obsługiwaną liczbą jest 32767, a więc pięciocyfrowa. Deklarujemy więc sześcioelementową tablicę znaków o nazwie input. Bieżący element tej tablicy będzie wskazywany przez zmienną inputindex. Dopóki zmienna ta jest w zakresie 0 4, czyli jest jeszcze miejsce w tablicy, odczytujemy klawisz z klawiatury. Dla klawiszy S1 S9 zamieniamy numer klawisza na cyfrę. Klawisz S10 pełni funkcję zera, a klawisz S16 funkcję Entera. Gdy wczytywanie znaków zostanie zakończone, czy to Enterem, czy na skutek braku miejsca, wpisujemy końcowe zero i zwracamy wartość liczbową za pomocą atoi(). Gdy mamy już gotową funkcję readnumber(), możemy zmodyfikować nasz główny program tak, aby zaczynał liczenie od liczby wpisanej przez użytkownika (listing 8): Na początku funkcji main() inicjalizujemy wyświetlacz i piny klawiatury. Następnie czekamy na wciśnięcie przez użytkownika klawiszy i potwierdzenie klawiszem S16 (Enter). Gdy zostanie to wykonane, inicjalizowany jest Timer1 w trybie CTC. W głównej pętli ustawiamy kursor na początku ekranu, wyświetlamy bieżący stan licznika sekund i czekamy na upłynięcie sekundy. Gdy to nastąpi, licznik sekund jest zmniejszany o 1 i pętla wykonuje się od początku. Ponieważ mamy już trzy funkcje do obsługi klawiatury, warto byłoby umieścić je w oddzielnym pliku, np. keyb.c i stworzyć bibliotekę taką jak dla LCD. Pozwoli to zachować większy porządek w głównym pliku programu. Dodajmy więc plik keyb.c do projektu i umieśćmy w nim funkcje readkeyboard(), getkey() i readnumber(). Stwórzmy też plik keyb.h i umieśćmy w nim nagłówki tych funkcji. Na początku keyb.c zawrzemy też dyrektywy dołączające bibliotekę stdlib.h dla atoi() oraz util/delay.h dla _delay_us(). Aby nasza biblioteka była wygodniejsza w użyciu, powinna być konfigurowalna podobnie jak biblioteka LCD. Dodajmy więc definicje portów dla funkcji read- Keyboard(): #define KEYB_PORT PORTD #define KEYB_PIN PIND #define KEYB_DDR DDRD Makro KEYB_DDR wykorzystamy w funkcji inicjalizującej klawiaturę: void keybinit() KEYB_DDR = 0x0f; Ta funkcja to tylko jedna linijka, ale pomoże utrzymać porządek. Jej nagłówek także umieszczamy w pliku keyb.h, a wywołanie możemy umieścić w naszym programie zamiast bezpośredniego odwołania do rejestru DDRn. W materiałach dodatkowych do tego numeru EdW znajduje się projekt zawierający kod odliczający sekundy oraz biblioteki klawiatury i wyświetlacza. Zadania Jak zwykle zachęcam do samodzielnych eksperymentów. Definiowanie własnych znaków, wczytywanie i wyświetlanie liczb czy odmierzanie czasu dają spore pole manewru w realizacji różnych funkcji. Inspiracją mogą być poniższe zagadnienia. 1. W naszym programie brakuje sygnalizacji upłynięcia zadanego czasu. Jak zrealizować zatrzymanie odliczania i sygnalizację, np. LED-em? 2. Co zrobić, aby cyfry były widoczne podczas wpisywania? 3. Jak dodać klawisz Backspace? Grzegorz Niemirowski grzegorz@grzegorz.net Elektronika dla Wszystkich 33
Stałe, znaki, łańcuchy znaków, wejście i wyjście sformatowane
Stałe, znaki, łańcuchy znaków, wejście i wyjście sformatowane Stałe Oprócz zmiennych w programie mamy też stałe, które jak sama nazwa mówi, zachowują swoją wartość przez cały czas działania programu. Można
2 Przygotował: mgr inż. Maciej Lasota
Laboratorium nr 2 1/7 Język C Instrukcja laboratoryjna Temat: Wprowadzenie do języka C 2 Przygotował: mgr inż. Maciej Lasota 1) Wprowadzenie do języka C. Język C jest językiem programowania ogólnego zastosowania
Wskaźniki a tablice Wskaźniki i tablice są ze sobą w języku C++ ściśle związane. Aby się o tym przekonać wykonajmy cwiczenie.
Część XXII C++ w Wskaźniki a tablice Wskaźniki i tablice są ze sobą w języku C++ ściśle związane. Aby się o tym przekonać wykonajmy cwiczenie. Ćwiczenie 1 1. Utwórz nowy projekt w Dev C++ i zapisz go na
1 Podstawy c++ w pigułce.
1 Podstawy c++ w pigułce. 1.1 Struktura dokumentu. Kod programu c++ jest zwykłym tekstem napisanym w dowolnym edytorze. Plikowi takiemu nadaje się zwykle rozszerzenie.cpp i kompiluje za pomocą kompilatora,
Języki i metodyka programowania. Typy, operatory, wyrażenia. Wejście i wyjście.
Typy, operatory, wyrażenia. Wejście i wyjście. Typy, operatory, wyrażenia Zmienna: [] [ '[' ']' ] ['=' ]; Zmienna to fragment pamięci o określonym
Cwiczenie nr 1 Pierwszy program w języku C na mikrokontroler AVR
Cwiczenie nr 1 Pierwszy program w języku C na mikrokontroler AVR Zadanie polega na napisaniu pierwszego programu w języku C, jego poprawnej kompilacji i wgraniu na mikrokontroler. W tym celu należy zapoznać
Programowanie proceduralne INP001210WL rok akademicki 2018/19 semestr letni. Wykład 6. Karol Tarnowski A-1 p.
Programowanie proceduralne INP001210WL rok akademicki 2018/19 semestr letni Wykład 6 Karol Tarnowski karol.tarnowski@pwr.edu.pl A-1 p. 411B Plan prezentacji Wskaźnik do pliku Dostęp do pliku: zapis, odczyt,
INFORMATYKA Studia Niestacjonarne Elektrotechnika
INFORMATYKA Studia Niestacjonarne Elektrotechnika Wydział Elektrotechniki i Informatyki dr inż. Michał Łanczont Wydział Elektrotechniki i Informatyki p. E419 tel. 81-538-42-93 m.lanczont@pollub.pl http://lanczont.pollub.pl
Wstęp do programowania INP001213Wcl rok akademicki 2017/18 semestr zimowy. Wykład 12. Karol Tarnowski A-1 p.
Wstęp do programowania INP001213Wcl rok akademicki 2017/18 semestr zimowy Wykład 12 Karol Tarnowski karol.tarnowski@pwr.edu.pl A-1 p. 411B Plan prezentacji (1) Obsługa łańcuchów znakowych getchar(), putchar()
1 Podstawy c++ w pigułce.
1 Podstawy c++ w pigułce. 1.1 Struktura dokumentu. Kod programu c++ jest zwykłym tekstem napisanym w dowolnym edytorze. Plikowi takiemu nadaje się zwykle rozszerzenie.cpp i kompiluje za pomocą kompilatora,
Wyświetlacz alfanumeryczny LCD zbudowany na sterowniku HD44780
Dane techniczne : Wyświetlacz alfanumeryczny LCD zbudowany na sterowniku HD44780 a) wielkość bufora znaków (DD RAM): 80 znaków (80 bajtów) b) możliwość sterowania (czyli podawania kodów znaków) za pomocą
Funkcje standardowej biblioteki wejść-wyjść do wyświetlania i pobierania danych
Funkcje standardowej biblioteki wejść-wyjść do wyświetlania i pobierania danych Przykłady wykorzystanie funkcji printf i scanf do wyświetlania danych na wyświetlaczu LCD oraz komunikacji sterownika mikroprocesorowego
Wstęp do programowania INP003203L rok akademicki 2018/19 semestr zimowy. Laboratorium 2. Karol Tarnowski A-1 p.
Wstęp do programowania INP003203L rok akademicki 2018/19 semestr zimowy Laboratorium 2 Karol Tarnowski karol.tarnowski@pwr.edu.pl A-1 p. 411B Plan prezentacji Komentarze Funkcja printf() Zmienne Łańcuchy
Podstawy programowania skrót z wykładów:
Podstawy programowania skrót z wykładów: // komentarz jednowierszowy. /* */ komentarz wielowierszowy. # include dyrektywa preprocesora, załączająca biblioteki (pliki nagłówkowe). using namespace
OPERACJE WEJŚCIA / WYJŚCIA. wysyła sformatowane dane do standardowego strumienia wyjściowego (stdout)
OPERACJE WEJŚCIA / WYJŚCIA Funkcja: printf() biblioteka: wysyła sformatowane dane do standardowego strumienia wyjściowego (stdout) int printf ( tekst_sterujący, argument_1, argument_2,... ) ;
Temat 1: Podstawowe pojęcia: program, kompilacja, kod
Temat 1: Podstawowe pojęcia: program, kompilacja, kod wynikowy. Przykłady najprostszych programów. Definiowanie zmiennych. Typy proste. Operatory: arytmetyczne, przypisania, inkrementacji, dekrementacji,
W dowolnym momencie można zmienić typ wskaźnika.
c++ Wskaźniki mają jeszcze jedną przydatną cechę. W dowolnym momencie można zmienić typ wskaźnika. Robi się to za pomocą operatora rzutowania. Najpierw zdefiniujemy sobie wsk_uniwersalny mogący pokazywać
METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02
METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE Wykład 02 NAJPROSTSZY PROGRAM /* (Prawie) najprostszy przykład programu w C */ /*==================*/ /* Między tymi znaczkami można pisać, co się
Programowanie strukturalne i obiektowe
Programowanie strukturalne i obiektowe Język C część I Opracował: Grzegorz Flesik Literatura: A. Majczak, Programowanie strukturalne i obiektowe, Helion, Gliwice 2010 P. Domka, M. Łokińska, Programowanie
Lab 9 Podstawy Programowania
Lab 9 Podstawy Programowania (Kaja.Gutowska@cs.put.poznan.pl) Wszystkie kody/fragmenty kodów dostępne w osobnym pliku.txt. Materiały pomocnicze: Wskaźnik to specjalny rodzaj zmiennej, w której zapisany
Warto też w tym miejscu powiedzieć, że w C zero jest rozpoznawane jako fałsz, a wszystkie pozostałe wartości jako prawda.
Nazwa implementacji: Nauka języka C wyrażenia warunkowe if- Autor: Piotr Fiorek Opis implementacji: Poznanie struktury oraz zastosowania wyrażeń warunkowych if- w języku C. W programie realizującym jakiś
1. Wprowadzanie danych z klawiatury funkcja scanf
1. Wprowadzanie danych z klawiatury funkcja scanf Deklaracja int scanf ( const char *format, wskaźnik, wskaźnik,... ) ; Biblioteka Działanie stdio.h Funkcja scanf wczytuje kolejne pola (ciągi znaków),
znajdowały się różne instrukcje) to tak naprawdę definicja funkcji main.
Część XVI C++ Funkcje Jeśli nasz program rozrósł się już do kilkudziesięciu linijek, warto pomyśleć o jego podziale na mniejsze części. Poznajmy więc funkcje. Szybko się przekonamy, że funkcja to bardzo
Obsługa plików. Laboratorium Podstaw Informatyki. Kierunek Elektrotechnika. Laboratorium Podstaw Informatyki Strona 1. Kraków 2013
Laboratorium Podstaw Informatyki Strona 1 Laboratorium Podstaw Informatyki Kierunek Elektrotechnika Obsługa plików Kraków 2013 Laboratorium Podstaw Informatyki Strona 2 Obsługa plików Zanim będziemy mogli
1. Pierwszy program. Kompilator ignoruje komentarze; zadaniem komentarza jest bowiem wyjaśnienie programu człowiekowi.
1. Pierwszy program // mój pierwszy program w C++ #include using namespace std; cout
Ćwiczenie 4. Obsługa plików. Laboratorium Podstaw Informatyki. Kierunek Elektrotechnika. Laboratorium Podstaw Informatyki Strona 1.
Laboratorium Podstaw Informatyki Strona 1 Laboratorium Podstaw Informatyki Kierunek Elektrotechnika Ćwiczenie 4 Obsługa plików Kraków 2010 Laboratorium Podstaw Informatyki Strona 2 Obsługa plików Zanim
Po uruchomieniu programu nasza litera zostanie wyświetlona na ekranie
Część X C++ Typ znakowy służy do reprezentacji pojedynczych znaków ASCII, czyli liter, cyfr, znaków przestankowych i innych specjalnych znaków widocznych na naszej klawiaturze (oraz wielu innych, których
Programowanie Mikrokontrolerów
Programowanie Mikrokontrolerów Wyświetlacz alfanumeryczny oparty na sterowniku Hitachi HD44780. mgr inż. Paweł Poryzała Zakład Elektroniki Medycznej Alfanumeryczny wyświetlacz LCD Wyświetlacz LCD zagadnienia:
Laboratorium 3: Tablice, tablice znaków i funkcje operujące na ciągach znaków. dr inż. Arkadiusz Chrobot dr inż. Grzegorz Łukawski
Laboratorium 3: Tablice, tablice znaków i funkcje operujące na ciągach znaków dr inż. Arkadiusz Chrobot dr inż. Grzegorz Łukawski 7 kwietnia 2014 1. Wprowadzenie Pierwsza część instrukcji zawiera informacje
Niezwykłe tablice Poznane typy danych pozwalają przechowywać pojedyncze liczby. Dzięki tablicom zgromadzimy wiele wartości w jednym miejscu.
Część XIX C++ w Każda poznana do tej pory zmienna może przechowywać jedną liczbę. Jeśli zaczniemy pisać bardziej rozbudowane programy, okaże się to niewystarczające. Warto więc poznać zmienne, które mogą
Zmienne, stałe i operatory
Zmienne, stałe i operatory Przemysław Gawroński D-10, p. 234 Wykład 2 4 marca 2019 (Wykład 2) Zmienne, stałe i operatory 4 marca 2019 1 / 21 Outline 1 Zmienne 2 Stałe 3 Operatory (Wykład 2) Zmienne, stałe
#include <stdio.h> void main(void) { int x = 10; long y = 20; double s; s = x + y; printf ( %s obliczen %d + %ld = %f, Wynik, x, y, s ); }
OPERACJE WEJŚCIA / WYJŚCIA Funkcja: printf() biblioteka: wysyła sformatowane dane do standardowego strumienia wyjściowego (stdout) int printf ( tekst_sterujący, argument_1, argument_2,... ) ;
#include <stdio.h> int main( ) { int x = 10; long y = 20; double s; s = x + y; printf ( %s obliczen %d + %ld = %f, Wynik, x, y, s ); }
OPERACJE WEJŚCIA / WYJŚCIA Funkcja: printf() biblioteka: wysyła sformatowane dane do standardowego strumienia wyjściowego (stdout) int printf ( tekst_sterujący, argument_1, argument_2,... ) ;
Jak napisać program obliczający pola powierzchni różnych figur płaskich?
Część IX C++ Jak napisać program obliczający pola powierzchni różnych figur płaskich? Na początku, przed stworzeniem właściwego kodu programu zaprojektujemy naszą aplikację i stworzymy schemat blokowy
lekcja 8a Gry komputerowe MasterMind
lekcja 8a Gry komputerowe MasterMind Posiadamy już elementarną wiedzę w zakresie programowania. Pora więc zabrać się za rozwiązywanie problemów bardziej złożonych, które wymagają zastosowania typowych
Wstęp do Programowania, laboratorium 02
Wstęp do Programowania, laboratorium 02 Zadanie 1. Napisać program pobierający dwie liczby całkowite i wypisujący na ekran największą z nich. Zadanie 2. Napisać program pobierający trzy liczby całkowite
utworz tworzącą w pamięci dynamicznej tablicę dwuwymiarową liczb rzeczywistych, a następnie zerującą jej wszystkie elementy,
Lista 3 Zestaw I Zadanie 1. Zaprojektować i zaimplementować funkcje: utworz tworzącą w pamięci dynamicznej tablicę dwuwymiarową liczb rzeczywistych, a następnie zerującą jej wszystkie elementy, zapisz
Dr inż. Grażyna KRUPIŃSKA. D-10 pokój 227 WYKŁAD 7 WSTĘP DO INFORMATYKI
Dr inż. Grażyna KRUPIŃSKA Grazyna.Krupinska@fis.agh.edu.pl D-10 pokój 227 WYKŁAD 7 WSTĘP DO INFORMATYKI Wyrażenia 2 Wyrażenia w języku C są bardziej elastyczne niż wyrażenia w jakimkolwiek innym języku
Podstawy programowania, Poniedziałek , 8-10 Projekt, część 1
Podstawy programowania, Poniedziałek 30.05.2016, 8-10 Projekt, część 1 1. Zadanie Projekt polega na stworzeniu logicznej gry komputerowej działającej w trybie tekstowym o nazwie Minefield. 2. Cele Celem
PROE wykład 2 operacje na wskaźnikach. dr inż. Jacek Naruniec
PROE wykład 2 operacje na wskaźnikach dr inż. Jacek Naruniec Zmienne automatyczne i dynamiczne Zmienne automatyczne: dotyczą kontekstu, po jego opuszczeniu są usuwane, łatwiejsze w zarządzaniu od zmiennych
Wskaźniki w C. Anna Gogolińska
Wskaźniki w C Anna Gogolińska Zmienne Zmienną w C można traktować jako obszar w pamięci etykietowany nazwą zmiennej i zawierający jej wartość. Przykład: kod graficznie int a; a a = 3; a 3 Wskaźniki Wskaźnik
Temat: Dynamiczne przydzielanie i zwalnianie pamięci. Struktura listy operacje wstawiania, wyszukiwania oraz usuwania danych.
Temat: Dynamiczne przydzielanie i zwalnianie pamięci. Struktura listy operacje wstawiania, wyszukiwania oraz usuwania danych. 1. Rodzaje pamięci używanej w programach Pamięć komputera, dostępna dla programu,
Podstawy Programowania Podstawowa składnia języka C++
Podstawy Programowania Podstawowa składnia języka C++ Katedra Analizy Nieliniowej, WMiI UŁ Łódź, 3 października 2013 r. Szablon programu w C++ Najprostszy program w C++ ma postać: #include #include
Struktury, unie, formatowanie, wskaźniki
Struktury, unie, formatowanie, wskaźniki 1. Napisz aplikację, która na wejściu dostaje napis postaci W Roku Pańskim 1345, władca Henryk 12, na rzecz swoich 143209 poddanych uchwalił dekret o 20 procentowej
Pliki. Informacje ogólne. Obsługa plików w języku C
Pliki Informacje ogólne Plik jest pewnym zbiorem danych, zapisanym w systemie plików na nośniku danych (np. dysku twardym, pendrive, płycie DVD itp.). Może posiadać określone atrybuty, a odwołanie do niego
Programowanie w języku Python. Grażyna Koba
Programowanie w języku Python Grażyna Koba Kilka definicji Program komputerowy to ciąg instrukcji języka programowania, realizujący dany algorytm. Język programowania to zbiór określonych instrukcji i
Informatyka I: Instrukcja 4.2
Informatyka I: Instrukcja 4.2 1 Wskaźniki i referencje - bezboleśnie Nauczyliśmy się do tej pory, że funkcje w języku C mogą zwracać wartość. Co jednak, gdybyśmy chcieli napisać funkcję, która rozwiąże
Ćwiczenie nr 3. Wyświetlanie i wczytywanie danych
Ćwiczenie nr 3 Wyświetlanie i wczytywanie danych 3.1 Wstęp Współczesne komputery przetwarzają dane zakodowane za pomocą ciągów zerojedynkowych. W szczególności przetwarzane liczby kodowane są w systemie
Laboratorium Podstaw Informatyki. Kierunek Elektrotechnika. Ćwiczenie 1. Podstawy. Wprowadzenie do programowania w języku C. Katedra Metrologii AGH
Laboratorium Podstaw Informatyki Kierunek Elektrotechnika Ćwiczenie 1 Podstawy Wprowadzenie do programowania w języku C Kraków 2010 Twój pierwszy program w C Program w języku C, jak i w wielu innych językach
Tablice (jedno i wielowymiarowe), łańcuchy znaków
Tablice (jedno i wielowymiarowe), łańcuchy znaków wer. 8 z drobnymi modyfikacjami! Wojciech Myszka Katedra Mechaniki i Inżynierii Materiałowej 2017-04-07 09:35:32 +0200 Zmienne Przypomnienie/podsumowanie
JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM. Wykład 6
JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM Wykład 6 1 SPECYFIKATOR static Specyfikator static: Specyfikator ten powoduje, że zmienna lokalna definiowana w obrębie danej funkcji nie jest niszczona
Nazwa implementacji: Nauka języka Python wyrażenia warunkowe. Autor: Piotr Fiorek. Opis implementacji: Poznanie wyrażeń warunkowych if elif - else.
Nazwa implementacji: Nauka języka Python wyrażenia warunkowe Autor: Piotr Fiorek Opis implementacji: Poznanie wyrażeń warunkowych if elif - else. Nasz kalkulator umie już liczyć, ale potrafi przeprowadzać
Schematy blokowe I. 1. Dostępne bloki: 2. Prosty program drukujący tekst.
Schematy blokowe I Jeżeli po schematach blokowych będzie używany język C, to należy używać operatorów: '&&', ' ', '!=', '%' natomiast jeśli Ruby to 'and', 'or', '%', '!='. 1. Dostępne bloki: a) początek:
Dla człowieka naturalnym sposobem liczenia jest korzystanie z systemu dziesiętnego, dla komputera natomiast korzystanie z zapisu dwójkowego
Arytmetyka cyfrowa Dla człowieka naturalnym sposobem liczenia jest korzystanie z systemu dziesiętnego, dla komputera natomiast korzystanie z zapisu dwójkowego (binarnego). Zapis binarny - to system liczenia
Proste typy zmiennych języka C++ *) Zapis 3.4 e-38 jest równoważny zapisowi 3,
WYKŁAD 1. PODSTAWY 1_1. Typy zmiennych Proste typy zmiennych języka C++ Nazwa typu (nazwa skrócona) Rozmiar (bajtów) unsigned char 1 signed char (char) unsigned short int (unsigned) signed short int (int)
Rekurencja (rekursja)
Rekurencja (rekursja) Rekurencja wywołanie funkcji przez nią samą wewnątrz ciała funkcji. Rekurencja może być pośrednia funkcja jest wywoływana przez inną funkcję, wywołaną (pośrednio lub bezpośrednio)
Instrukcja do ćwiczeń nr 4 typy i rodzaje zmiennych w języku C dla AVR, oraz ich deklarowanie, oraz podstawowe operatory
Instrukcja do ćwiczeń nr 4 typy i rodzaje zmiennych w języku C dla AVR, oraz ich deklarowanie, oraz podstawowe operatory Poniżej pozwoliłem sobie za cytować za wikipedią definicję zmiennej w informatyce.
Rozdział 4 KLASY, OBIEKTY, METODY
Rozdział 4 KLASY, OBIEKTY, METODY Java jest językiem w pełni zorientowanym obiektowo. Wszystkie elementy opisujące dane, za wyjątkiem zmiennych prostych są obiektami. Sam program też jest obiektem pewnej
Poradnik programowania procesorów AVR na przykładzie ATMEGA8
Poradnik programowania procesorów AVR na przykładzie ATMEGA8 Wersja 1.0 Tomasz Pachołek 2017-13-03 Opracowanie zawiera opis podstawowych procedur, funkcji, operatorów w języku C dla mikrokontrolerów AVR
Strona główna. Strona tytułowa. Programowanie. Spis treści. Sobera Jolanta 16.09.2006. Strona 1 z 26. Powrót. Full Screen. Zamknij.
Programowanie Sobera Jolanta 16.09.2006 Strona 1 z 26 1 Wprowadzenie do programowania 4 2 Pierwsza aplikacja 5 3 Typy danych 6 4 Operatory 9 Strona 2 z 26 5 Instrukcje sterujące 12 6 Podprogramy 15 7 Tablice
Systemy wbudowane. Uniwersytet Łódzki Wydział Fizyki i Informatyki Stosowanej. Witold Kozłowski
Uniwersytet Łódzki Wydział Fizyki i Informatyki Stosowanej Systemy wbudowane Witold Kozłowski Zakład Fizyki i Technologii Struktur Nanometrowych 90-236 Łódź, Pomorska 149/153 https://std2.phys.uni.lodz.pl/mikroprocesory/
Podstawy Programowania C++
Wykład 3 - podstawowe konstrukcje Instytut Automatyki i Robotyki Warszawa, 2014 Wstęp Plan wykładu Struktura programu, instrukcja przypisania, podstawowe typy danych, zapis i odczyt danych, wyrażenia:
Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1
Podstawy programowania. Wykład Funkcje Krzysztof Banaś Podstawy programowania 1 Programowanie proceduralne Pojęcie procedury (funkcji) programowanie proceduralne realizacja określonego zadania specyfikacja
Widoczność zmiennych Czy wartości każdej zmiennej można zmieniać w dowolnym miejscu kodu? Czy można zadeklarować dwie zmienne o takich samych nazwach?
Część XVIII C++ Funkcje Widoczność zmiennych Czy wartości każdej zmiennej można zmieniać w dowolnym miejscu kodu? Czy można zadeklarować dwie zmienne o takich samych nazwach? Umiemy już podzielić nasz
Podstawy programowania. Wykład: 9. Łańcuchy znaków. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD
Podstawy programowania Wykład: 9 Łańcuchy znaków 1 dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD Rodzaje plików Dane przechowywane w pliku mogą mieć reprezentację binarną (taką samą, jak
Laboratorium Wstawianie skryptu na stroną: 2. Komentarze: 3. Deklaracja zmiennych
1. Wstawianie skryptu na stroną: Laboratorium 1 Do umieszczenia skryptów na stronie służy znacznik: //dla HTML5 ...instrukcje skryptu //dla HTML4 ...instrukcje
Pętle. Dodał Administrator niedziela, 14 marzec :27
Pętlami nazywamy konstrukcje języka, które pozwalają na wielokrotne wykonywanie powtarzających się instrukcji. Przykładowo, jeśli trzeba 10 razy wyświetlić na ekranie pewien napis, to można wykorzystać
Część XVII C++ Funkcje. Funkcja bezargumentowa Najprostszym przypadkiem funkcji jest jej wersja bezargumentowa. Spójrzmy na przykład.
Część XVII C++ Funkcje Funkcja bezargumentowa Najprostszym przypadkiem funkcji jest jej wersja bezargumentowa. Spójrzmy na przykład. 2 3 Tworzymy deklarację i definicję funkcji o nazwie pobierzln() Funkcja
Zajęcia nr 2 Programowanie strukturalne. dr inż. Łukasz Graczykowski mgr inż. Leszek Kosarzewski Wydział Fizyki Politechniki Warszawskiej
Zajęcia nr 2 Programowanie strukturalne dr inż. Łukasz Graczykowski mgr inż. Leszek Kosarzewski Wydział Fizyki Politechniki Warszawskiej Pętla while #include using namespace std; int main ()
Zasady programowania Dokumentacja
Marcin Kędzierski gr. 14 Zasady programowania Dokumentacja Wstęp 1) Temat: Przeszukiwanie pliku za pomocą drzewa. 2) Założenia projektu: a) Program ma pobierać dane z pliku wskazanego przez użytkownika
Języki i metodyka programowania. Wprowadzenie do języka C
Literatura: Brian W. Kernighan, Dennis M. Ritchie Język Ansi C, Wydawnictwa Naukowo - Techniczne, 2007 http://cm.bell-labs.com/cm/cs/cbook/index.html Scott E. Gimpel, Clovis L. Tondo Język Ansi C. Ćwiczenia
Część 4 życie programu
1. Struktura programu c++ Ogólna struktura programu w C++ składa się z kilku części: część 1 część 2 część 3 część 4 #include int main(int argc, char *argv[]) /* instrukcje funkcji main */ Część
Programowanie w językach wysokiego poziomu
Programowanie w językach wysokiego poziomu zajęcia nr 2 Elektronika i Telekomunikacja, semestr III rok akademicki 2014/2015 Plan dzisiejszych zajęć Pliki tekstowe 1. Operacje na plikach - wprowadzenie
Podstawy programowania w języku C++
Podstawy programowania w języku C++ Część jedenasta Przetwarzanie plików amorficznych Konwencja języka C Autor Roman Simiński Kontakt roman.siminski@us.edu.pl www.us.edu.pl/~siminski Niniejsze opracowanie
Odczyt zegara ze sterownika do panelu serii TIU z możliwością korekty ustawień zegara w sterowniku
Informator Techniczny nr 12 -- styczeń 2001 -- INFORMATOR TECHNICZNY GE FANUC Odczyt zegara ze sterownika do panelu serii TIU z możliwością korekty ustawień zegara w sterowniku Program w sterowniku W sterowniku
do instrukcja while (wyrażenie);
Instrukcje pętli -ćwiczenia Instrukcja while Pętla while (póki) powoduje powtarzanie zawartej w niej sekwencji instrukcji tak długo, jak długo zaczynające pętlę wyrażenie pozostaje prawdziwe. while ( wyrażenie
GND(VSS) i VCC - masa i zasilanie. V0 - regulacja kontrastu
Programowanie wyświetlacza LCD według: http://radziu.dxp.pl Wyświetlacz graficzny 2 x 16 ma 2 wiersze, 16 znaków w wierszu, każdy znak jest wyświetlany w matrycy 5 x 8 pikseli. (2*8 wierszy * 5*16 kolumn
Samodzielnie wykonaj następujące operacje: 13 / 2 = 30 / 5 = 73 / 15 = 15 / 23 = 13 % 2 = 30 % 5 = 73 % 15 = 15 % 23 =
Systemy liczbowe Dla każdej liczby naturalnej x Î N oraz liczby naturalnej p >= 2 istnieją jednoznacznie wyznaczone: liczba n Î N oraz ciąg cyfr c 0, c 1,..., c n-1 (gdzie ck Î {0, 1,..., p - 1}) taki,
1 Wskaźniki i zmienne dynamiczne, instrukcja przed zajęciami
1 Wskaźniki i zmienne dynamiczne, instrukcja przed zajęciami Celem tych zajęć jest zrozumienie i oswojenie z technikami programowania przy pomocy wskaźników w języku C++. Proszę przeczytać rozdział 8.
Informatyka, Ćwiczenie 1. 1. Uruchomienie Microsoft Visual C++ Politechnika Rzeszowska, Wojciech Szydełko. I. ZałoŜenie nowego projektu
Informatyka, Ćwiczenie 1 1. Uruchomienie Microsoft Visual C++ I. ZałoŜenie nowego projektu Wybieramy menu: File>New>Files jak na rys. poniŝej Zapisujemy projekt pod nazwą LAN, w katalogu d:\temp\lab typu
Programowanie - wykład 4
Programowanie - wykład 4 Filip Sośnicki Wydział Fizyki Uniwersytet Warszawski 20.03.2019 Przypomnienie Prosty program liczący i wyświeltający wartość silni dla wprowadzonej z klawiatury liczby: 1 # include
Podstawy Informatyki. Inżynieria Ciepła, I rok. Wykład 10 Kurs C++
Podstawy Informatyki Inżynieria Ciepła, I rok Wykład 10 Kurs C++ Historia Lata 70-te XX w język C (do pisania systemów operacyjnych) "The C programming language" B. Kernighan, D. Ritchie pierwszy standard
Język C i C++. Podstawy. Zagadnienia do opanowania. Przykład 1. (modyfikuj kod, aby zrealizować punkty 5., 7.)
Język C i C++. Podstawy Materiały do samodzielnego opanowania, ale także propozycja zadań na zajęcia laboratoryjne Zagadnienia do opanowania 1) Czym jest standardowe wejście-wyjście (stdio)? 2) Czym może
1.2 Schemat blokowy oraz opis sygnałów wejściowych i wyjściowych
Dodatek A Wyświetlacz LCD. Przeznaczenie i ogólna charakterystyka Wyświetlacz ciekłokrystaliczny HY-62F4 zastosowany w ćwiczeniu jest wyświetlaczem matrycowym zawierającym moduł kontrolera i układ wykonawczy
Języki programowania obiektowego Nieobiektowe elementy języka C++
Języki programowania obiektowego Nieobiektowe elementy języka C++ Roman Simiński roman.siminski@us.edu.pl www.programowanie.siminskionline.pl Przetwarzanie tablic znaków Łańcuchy znakowe jako tablice znaków
Laboratorium 6: Ciągi znaków. mgr inż. Leszek Ciopiński dr inż. Arkadiusz Chrobot dr inż. Grzegorz Łukawski
Laboratorium 6: Ciągi znaków mgr inż. Leszek Ciopiński dr inż. Arkadiusz Chrobot dr inż. Grzegorz Łukawski 17 listopada 2016 1. Wprowadzenie Instrukcja poświęcona jest zmiennym, które służą do przechowywania
Wstęp do informatyki- wykład 2
MATEMATYKA 1 Wstęp do informatyki- wykład 2 Systemy liczbowe Treści prezentowane w wykładzie zostały oparte o: S. Prata, Język C++. Szkoła programowania. Wydanie VI, Helion, 2012 www.cplusplus.com Jerzy
Operacje na plikach. Informatyka. Standardowe strumienie wejścia i wyjścia
Materiały Operacje na plikach Informatyka Operacje wejścia-wyjścia w C/C++: Podejście proceduralne Podejście obiektowe Standardowe strumienie wejścia i wyjścia stdin - strumień wejściowy (klawiatura) cin
Przedrostkowa i przyrostkowa inkrementacja i dekrementacja
Część VIII C++ Przedrostkowa i przyrostkowa inkrementacja i dekrementacja W poprzednim ćwiczeniu operatory inkrementacji i dekrementacji występowały w wersji przyrostkowej. Istnieje inny sposób zapisu
Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego
Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu Społecznego Publikacja jest dystrybuowana bezpłatnie Program Operacyjny Kapitał Ludzki Priorytet 9 Działanie 9.1 Poddziałanie
Pytania sprawdzające wiedzę z programowania C++
Pytania sprawdzające wiedzę z programowania C++ Wstęp 1. Zaprezentuj mechanikę tworzenia programu napisanego w języku C++. 2. Co to jest kompilacja? 3. Co to jest konsolidacja? 4. Co to jest kod wykonywalny?
XV. Wskaźniki Odczytywanie adresu pamięci istniejących zmiennych Wskaźniki pierwsze spojrzenie.
XV. Wskaźniki 15.1. Odczytywanie adresu pamięci istniejących zmiennych Język C++ w bardzo łatwy sposób umoŝliwia nam pobieranie adresu pamięci wybranych zmiennych. Wskaźnik zajmuje zazwyczaj 4 bajty bez
KURS C/C++ WYKŁAD 1. Pierwszy program
KURS C/C++ WYKŁAD 1 Pierwszy program Tworzenie programu odbywa sie w dwóch etapach: 1. opracowanie kodu źródłowego 2. generowanie kodu wynikowego Pierwszy etap polega na zapisaniu algorytmu za pomocą instrukcji
1 Wskaźniki. 1.1 Główne zastosowania wskaźników
1 Wskaźniki Wskaźnik (ang. pointer) jest obiektem (zmienną) przechowującym adres pamięci. Definiowanie wskaźników: typ *nazwa wskaznika; np.: int *wsk na x;, double *xxx;, char *znak;. Aby można było pracować
Biblioteka standardowa - operacje wejścia/wyjścia
Biblioteka standardowa - operacje wejścia/wyjścia Przemysław Gawroński D-10, p. 234 Wykład 6 15 stycznia 2019 (Wykład 6) Biblioteka standardowa - operacje wejścia/wyjścia 15 stycznia 2019 1 / 14 Outline
Arytmetyka komputera. Na podstawie podręcznika Urządzenia techniki komputerowej Tomasza Marciniuka. Opracował: Kamil Kowalski klasa III TI
Arytmetyka komputera Na podstawie podręcznika Urządzenia techniki komputerowej Tomasza Marciniuka Opracował: Kamil Kowalski klasa III TI Spis treści 1. Jednostki informacyjne 2. Systemy liczbowe 2.1. System
/* dołączenie pliku nagłówkowego zawierającego deklaracje symboli dla wykorzystywanego mikrokontrolera */ #include <aduc834.h>
Szablon programu: /* dołączenie pliku nagłówkowego zawierającego deklaracje symboli dla wykorzystywanego mikrokontrolera */ #include /* opcjonalne: deklaracja typów o rozmiarze jednego i dwóch
Instrukcja do ćwiczeń
Instrukcja do ćwiczeń SYSTEMY WBUDOWANE Lab. 3 Przetwornik ADC + potencjometr 1. Należy wejść na stronę Olimexu w celu znalezienia zestawu uruchomieniowego SAM7-EX256 (https://www.olimex.com/products/arm/atmel/sam7-ex256/).
Wstęp do programowania INP003203L rok akademicki 2016/17 semestr zimowy. Laboratorium 1. Karol Tarnowski A-1 p.
Wstęp do programowania INP003203L rok akademicki 2016/17 semestr zimowy Laboratorium 1 Karol Tarnowski karol.tarnowski@pwr.edu.pl A-1 p. 411B Na podstawie: G. Perry, D. Miller, Język C Programowanie dla