Max7219 i kilka przewodów. Serce
Wszyscy od dawna są przyzwyczajeni do tego, że wszyscy urządzenie elektroniczne jest ekran, przez który daje człowiekowi wszystko przydatna informacja. Odtwarzacz MP3 pokazuje nazwę odtwarzanego utworu, pilot quadkoptera wyświetla telemetrię lotu, nawet pralka wyświetla czas do końca prania, a smartfon zazwyczaj obsługuje cały pulpit komputera osobistego! Najprawdopodobniej Twoje następne urządzenie również będzie wymagało małego wyświetlacza 🙂 Spróbujmy zrobić prosty zegar elektroniczny! A jako tablicę wyników używamy zwykłego i taniego wyświetlacza ciekłokrystalicznego 1602. Tak jak na zdjęciu: Oprócz 16x2 za dość popularny jest wyświetlacz 20x4 (cztery wiersze po 20 znaków) oraz wyświetlacz graficzny o rozdzielczości 128x64 pikseli. Oto one na zdjęciach:
1. Podłączanie znakowego wyświetlacza LCD 1602
Wyświetlacz 1602 ma 16 pinów. Zazwyczaj są one ponumerowane od lewej do prawej, jeśli spojrzeć na to tak, jak na zdjęciu. Czasami wnioski są podpisane, takie jak: DB0, DB1, EN, itp. A czasami po prostu wskazują numer wyjścia. W każdym razie lista pinów jest zawsze taka sama: 1 - "GND", masa (minus zasilania); 2 - "Vcc", zasilanie +5V; 3 - "VEE", kontrast; 4 - "RS", rejestr wybór 5 - "R/W", kierunek przesyłania danych (zapis/odczyt); 6 - "EN", synchronizacja; 7-14 - "DB0", "DB1", .., "DB7" - magistrala danych; 15 - anoda podświetlenia (+5V); 16 - katoda podświetlenia (masa). Linie VEE, RS oraz cztery linie danych DB4, DB5, DB6, DB7 są podłączone do wyjść cyfrowych sterownika. Linię „R/W” połączymy z „masą” sterownika (ponieważ potrzebujemy tylko funkcji zapisu do pamięci wyświetlacza). Podświetlenia jeszcze nie podłączymy, wierzę, że łatwo sobie to rozgryźcie 🙂 Schemat podłączenia wyświetlacza do Arduino UnoWygląd układu
Na wszelki wypadek również w formie talerza:
Wyświetlacz LCD 1602 | 1 | 2 | 4 | 6 | 11 | 12 | 13 | 14 | 15 | 16 |
Arduino Uno | GND | +5V | 4 | 5 | 6 | 7 | 8 | 9 | +5V | GND |
2. Program "Witaj świecie!"
Do pracy z wyświetlaczami LCD o różnych rozmiarach i typach, edytor Arduino IDE posiada specjalną bibliotekę płynny kryształ. Aby dołączyć bibliotekę, w pierwszej linii naszego programu piszemy następujące wyrażenie: #include3. Zaprogramuj zegarek
Teraz, gdy wyświetlacz działa dokładnie, spróbujmy zamienić nasze proste urządzenie w prawdziwy zegarek elektroniczny. Uwaga! Do wyświetlenia czasu potrzebujemy biblioteki "Czas". Jeśli nie jest jeszcze zainstalowany, możesz pobrać archiwum z linku. Uwzględnijmy to: #include- year() - zwróci nam rok;
- miesiąc() - miesiąc;
- dzień dzień;
- godzina() - godzina;
- minute() - zwraca minutę;
- sekunda() - sekunda.
Cześć chłopaki. Dzisiaj skrócimy biegnącą linię na moduły LED MAX7219 i Arduino. Zadanie jest bardzo proste i nie wymaga od nas dużej wiedzy z zakresu elektroniki i programowania. Na początek proponuję przestudiować trochę teorii na temat urządzenia matrycy LED, zasady jej połączenia i obejrzeć film z wynikiem, do którego będziemy dążyć w całym artykule.
Matryca LED to graficzny wskaźnik, który można wykorzystać do wyświetlania prostych obrazków, liter i cyfr. Nie stawiam sobie zadania szczegółowego zajmowania się urządzeniem wskaźników matrycowych, jednak warto zauważyć, że tak naprawdę matryca składa się z 8x8 diod LED. Właściwie wszystko sprowadza się do dynamicznego wskazywania. Na tej podstawie jasne jest, że grupowanie kilku macierzy razem nie jest łatwym zadaniem. Do każdego nowego wiersza lub kolumny macierzy musisz dodać nowy rejestr przesuwny wraz z przewodami i opornikami, a w dobry sposób także układem ULN2003.
Na szczęście inżynierowie od dawna opracowali wyspecjalizowane mikroukłady do sterowania różnego rodzaju wskaźnikami. W tym artykule przyjrzymy się modułowi matrycy z układem MAX7219. Jak później okaże się, praca z takim modułem to przyjemność.
Moduł matrycy LED z chipem MAX7219
Moduł jest płytką z mikroukładem, niezbędnym do tego opasaniem i właściwie wskaźnikiem matrycy. Zazwyczaj wskaźnik nie jest wlutowany w płytkę, ale włożony do złącza. Odbywa się to tak, że grupę modułów można najpierw przymocować do jakiejś powierzchni za pomocą śrub, a następnie włożyć w nie matryce.
Moduł ma po pięć pinów z każdej strony. Z jednej strony dane wchodzą do modułu, z drugiej dane opuszczają moduł i są przenoszone do kolejnego. Pozwala to na łączenie macierzy y.
Złącze wejściowe / złącze wyjściowe:
- VCC, GND - zasilanie;
- DIN - wprowadzanie danych;
- CS - wybór modułu (chip select);
- CLK - impuls zegarowy.
Moduł pracuje na napięciu 5 woltów.
Wyjście pikseli przy użyciu biblioteki Max72xxPanel
Do sterowania układem MAX7219 użyjemy biblioteki Panel Max72xx. Możesz go pobrać z linków na końcu artykułu.
Zainstalujmy bibliotekę i napiszmy mały kod, który wyświetli tylko jeden punkt o współrzędnych x=3 i y=4. Kropka będzie migać z okresem 600 milisekund.
#włączać
#włączać #włączać int pinCS = 10; int numberOfHorizontalDisplays = 1; // liczba macierzy poziomo int numberOfVerticalDisplays = 1; // pionowa liczba matryc Max72xxPanel matrix = Max72xxPanel(pinCS, numberOfHorizontalDisplays, numberOfVerticalDisplays); void setup() ( matrix.setIntensity(4); // jasność od 0 do 15 ) void loop() ( matrix.drawPixel(3, 4, HIGH); // rozświetl piksel na (3,4) macierzy. write (); // narysuj wszystkie piksele do matrycy delay(300); matrix. drawPixel(3, 4, LOW); // wygaś macierz pikseli. write(); delay(300); ) Jak wspomniano wcześniej, moduły matrycowe z układem MAX7219 można łatwo łączyć. W tym celu na początku programu ustalamy ilość macierzy poziomo i pionowo. W tym przypadku używana jest jedna macierz, więc oba te parametry będą równe 1.
Należy pamiętać, że po włączeniu i wyłączeniu pikseli za pomocą DrawPixel, musisz wywołać funkcję pisać. Bez funkcji zapisu piksele na matrycy nie będą się świecić!
Teraz napiszmy kod, który wyświetli emotikon na matrycy. Zaszyfrujemy uśmiech za pomocą tablicy ośmiu bajtów. Każdy bajt tablicy będzie odpowiedzialny za wiersz macierzy, a każdy bit w bajcie za punkt w wierszu.
#włączać
#włączać #włączać int pinCS = 10; int numberOfHorizontalDisplays = 1; // liczba macierzy poziomo int numberOfVerticalDisplays = 1; // pionowa liczba matryc Max72xxPanel matrix = Max72xxPanel(pinCS, numberOfHorizontalDisplays, numberOfVerticalDisplays); dane bajtu stałego = (0b00111100, 0b01000010, 0b10100101, 0b10000001, 0b10100101, 0b10011001, 0b01000010, 0b00111100 ); void setup() ( matrix.setIntensity(7); // jasność od 0 do 15 matrix.fillScreen(LOW); // czyszczenie macierzy (int y = 0; y< 8; y++) { for (int x = 0; x < 8; x++) { // зажигаем x-й пиксель в y-й строке matrix.drawPixel(x, y, data[y] & (1< Notatka. Biblioteka Max72xxPanel posiada funkcję ustaw obrót, który określa orientację obrazu na matrycy. Na przykład, jeśli chcemy obrócić emotikon o 90 stopni, będziemy musieli to zrobić natychmiast po wywołaniu funkcji setIntensity połączenie ustaw obrót z odpowiednimi argumentami:
matrix.setRotation(0, 1);
pierwszy parametr to indeks macierzy, w naszym przypadku jest równy zero; drugi parametr to liczba zwojów o 90 stopni.
Wyjście tekstowe za pomocą biblioteki Adafruit-GFX-Library
W podobny sposób możesz wyświetlić na matrycy dowolny inny symbol, na przykład literę. Aby jednak móc wyświetlić dowolną literę alfabetu angielskiego, będziemy musieli zdefiniować w programie aż 26 ośmiobajtowych tablic! To bardzo ponure i oczywiście ktoś już to zrobił przed nami.
W popularnej Bibliotece Adafruit-GFX, oprócz funkcji do pracy z grafiką i tekstem, znajduje się również baza liter łacińskich pisanych dużymi i małymi literami, a także wszelkie znaki interpunkcyjne i inne znaki serwisowe. Link do biblioteki znajduje się na końcu artykułu.
Możesz wyświetlić symbol na matrycy za pomocą funkcji DrawChar.
drawChar(x, y, znak, kolor, tło, rozmiar);
Pierwsze dwa parametry funkcji odpowiadają za współrzędne lewego górnego rogu symbolu. Trzecim parametrem jest sam symbol. Kolor symbolu w naszym przypadku będzie równy 1 lub WYSOKI, ponieważ matryca jest dwukolorowa. Tło wynosi 0 lub NISKI. Ustawmy ostatni parametr „rozmiar” równy 1.
Napiszmy program, który wyświetli kolejno wszystkie litery frazy: „HELLO WORLD!”
#włączać
#włączać #włączać int pinCS = 10; int numberOfHorizontalDisplays = 1; int numberOfVerticalDisplays = 1; Max72xxPanel matrix = Max72xxPanel(pinCS, numberOfHorizontalDisplays, numberOfVerticalDisplays); Taśma sznurkowa = "HELLO WORLD"; int czekaj = 800; void setup() ( matrix.setIntensity(1); // jasność od 0 do 15 ) void loop() ( for (int i = 0 ; i< tape.length(); i++) { matrix.fillScreen(LOW); matrix.drawChar(0, 0, tape[i], HIGH, LOW, 1); matrix.write(); delay(wait); } } Notatka. Biblioteka Adafruit_GFX posiada wiele funkcji do pracy z grafiką. Na przykład drawCircle(3, 3, 2, HIGH) narysuje okrąg o środku (3,3) i promieniu 2. Ostatnim parametrem jest kolor, ale w przypadku matrycy monochromatycznej jest to 1 lub HIGH. Funkcja drawLine(0, 0, 3, 6, HIGH) narysuje linię między punktami (0,0) i (3,6).
Linia biegnąca na max7219
Mam więc nadzieję, że wymyśliliśmy urządzenie i zasadę wyjścia do jednej matrycy. Przejdźmy teraz bezpośrednio do linii biegowej.
Co będzie wymagane?
Aby zrealizować pomysł, potrzebujesz bardzo niewielu szczegółów:
- dwa moduły LED, składające się z czterech matryc 8 na 8 pikseli;
- przewody łączące;
- płytka Arduino Nano;
Schemat
Na płytce drukowanej zastosowanego modułu LED znajdują się 4 matryce o wymiarach 8 na 8 pikseli. Każda tablica LED jest kontrolowana przez układ MAX7219.
MAX7219 to kontroler do 64 wyświetlaczy LED, wspólnych matryc katodowych i dyskretnych diod LED. Dla wygodniejszego odbioru informacji wyświetlanych na wyświetlaczu LED zaleca się zainstalowanie kilku modułów. W tym celu łączy się je w grupy połączone szeregowo, to znaczy wyjście pierwszego modułu (out) jest połączone z wejściem drugiego modułu (in). Mój montaż składa się z dwóch modułów (16 matryc), których długość jest wystarczająca do wygodnego czytania całych zdań. W tym przypadku montaż łączy się z Arduino w taki sam sposób, jak z pojedynczym modułem.
Uruchamianie programowania linii.
Linia biegnąca z Arduino i modułów LED pod kontrolą MAX7219 jest już prawie gotowa. Czas przejść do ostatniej części programu.
#włączać
#włączać #włączać int pinCS = 10; // Podłącz CS do pinu 10, DIN do MOSI i CLK do SCK int numberOfHorizontalDisplays = 1; // Liczba modułów poziomo int numberOfVerticalDisplays = 8; // Liczba modułów w pionie Max72xxPanel matrix = Max72xxPanel(pinCS, numberOfHorizontalDisplays, numberOfVerticalDisplays); Taśma sznurkowa = ""; int czekaj = 10; // Szybkość przewijania w milisekundach int spacer = 1; // Odstęp między znakami (liczba kropek) int width = 5 + odstęp; // Szerokość znaku /* Konwertuj rosyjską czcionkę z UTF-8 na Windows-1251 */ String utf8rus(String source) ( int i,k; String target; unsigned char n; char m = ( "0", "\0" ); k = source.length(); i = 0; while (i< k) { n = source[i]; i++; if (n >= 0xC0) ( przełącznik (n) ( przypadek 0xD0: ( n = źródło[i]; i++; if (n == 0x81) ( n = 0xA8; przerwa; ) if (n >= 0x90 && n<= 0xBF) n = n + 0x2F; break; } case 0xD1: { n = source[i]; i++; if (n == 0x91) { n = 0xB7; break; } if (n >= 0x80 && n<= 0x8F) n = n + 0x6F; break; } } } m = n; target = target + String(m); } return target; } /* Код для работы с com-портом */ String Serial_Read() { unsigned char c; // переменная для чтения сериал порта String Serial_string = ""; // Формируемая из символов строка while (Serial.available() >0) ( // Jeśli w porcie szeregowym są znaki c = Serial.read(); // Odczytaj znak //Serial.print(c,HEX); Serial.print(" "); Serial.print(c if (c == "\n") ( // Jeśli to jest koniec ciągu, return Serial_string; // Zwróć ciąg ) if (c == 0xB8) c = c - 0x01; // Korekta znaku kody tabeli???? ponieważ rosyjskie znaki w tabeli są przesunięte względem standardowego kodowania utf o 1 znak if (c >= 0xBF && c<= 0xFF) c = c - 0x01; Serial_string = Serial_string + String(char(c)); //Добавить символ в строку } return Serial_string; } void setup() { Serial.begin(9600); tape = utf8rus("сайт Amateur Radio WorkShop"); // Этот текст выводиться при включении или если в com-порт не пришла информация matrix.setIntensity(3); // Яркость от 0 до 15 matrix.setRotation(matrix.getRotation()+3); //1 - 90 2 - 180 3 - 270 } void loop() { if (Serial.available()){ tape=Serial_Read(); } for (int i = 0 ; i < width * tape.length() + matrix.width() - 1 - spacer; i++) { matrix.fillScreen(LOW); int letter = i / width; // Номер символа выводимого на матрицу int x = (matrix.width() - 1) - i % width; int y = (matrix.height() - 8) / 2; // Центрируем текст по вертикали while (x + width - spacer >= 0 && litera >= 0) ( jeśli (litera< tape.length()) { matrix.drawChar(x, y, tape, HIGH, LOW,1); } letter--; x -= width; } matrix.write(); // Вывод сообщения на экран delay(wait); } } Nie widzę sensu w pisaniu kodu. Jest dobrze komentowany. Warto jednak wspomnieć o kilku cechach.
Notatka. Ważny. Standardowa biblioteka Adafruit_GFX początkowo obsługuje tylko czcionki angielskie, więc chłopaki z Rosji zrobili co w ich mocy i przepisali bibliotekę, dodając rosyjskie czcionki i wszelkiego rodzaju gadżety. Wszystkie biblioteki i szkice są dostępne na mojej stronie GitHUB.
Potrzebny jest fragment kodu do pracy z portem com, aby szybko zmienić tekst komunikatu wyświetlanego na module LED. Potrzebujemy go jednak nie tylko do tego. W przyszłości dzięki tej funkcji połączymy naszą i działającą linię na Arduino.
Do pracy ze znakowymi wyświetlaczami graficznymi sugerujemy użycie biblioteki LiquidCrystal, która wchodzi w skład standardowego zestawu Arduino IDE i jest przeznaczona do pracy na 8-bitowym (4-bitowym) interfejsie równoległym. Jeśli Twój wyświetlacz jest podłączony do Arduino za pośrednictwem magistrali I2, musisz zainstalować bibliotekę LiquidCrystal_I2C (większość funkcji powtarza funkcje z pierwszej biblioteki).
Obsługiwane wyświetlacze:
Wyświetlacz | Połączenie i inicjalizacja |
---|---|
LCD1602 - wyświetlacz znakowy (16x02 znaki), |
#włączać [ , 8 , 9 , 10 , 11 ]); pusta konfiguracja()( lcd.początek(16, 2);} // Wyjaśnienie:
|
z interfejsem I2C (niebieski) |
#włączać #włączać LCD LiquidCrystal_I2C (0x27 lub 0x3F, 16 , 2); pusta konfiguracja()( lcd.init(); } // Wyjaśnienie: |
LCD1602 I2C - wyświetlacz znakowy (16x02 znaki), z interfejsem I2C (zielony) |
#włączać #włączać LCD LiquidCrystal_I2C (0x27 lub 0x3F, 16 , 2); pusta konfiguracja()( lcd.init(); } // Wyjaśnienie: |
LCD2004 - wyświetlacz znakowy (20x04 znaków), z interfejsem równoległym (niebieski) |
#włączać LCD LiquidCrystal (2 , 3 , 4 , 5 , 6 , 7[ , 8 , 9 , 10 , 11 ]); pusta konfiguracja()( lcd.początek(20, 4);} // Wyjaśnienie: // Jeśli używanych jest 8 przewodów magistrali danych, określ je wszystkie |
LCD2004 I2C - wyświetlacz znakowy (20x04 znaków), z interfejsem I2C (niebieski) |
#włączać #włączać LCD LiquidCrystal_I2C (0x27 lub 0x3F, 20 , 4); pusta konfiguracja()( lcd.init(); } // Wyjaśnienie: |
#1 Przykład
Napis wyświetlamy na wyświetlaczu LCD1602 podłączonym przez magistralę I2C. Aby pracować z wyświetlaczem LCD2004, musisz zmienić linię 3 na LiquidCrystal_I2C lcd (0x27,20,4);
#włączać
#2 Przykład
Napis wyświetlamy na wyświetlaczu LCD1602 podłączonym poprzez 4-bitową szynę równoległą. Aby pracować z wyświetlaczem LCD2004, musisz zmienić linię 5 na lcd.begin(20, 4);
#włączać
#3 Przykład
Wyświetlamy napis "język rosyjski" na wyświetlaczu LCD1602 podłączonym przez magistralę I2C:
#włączać
#4 Przykład
Czas, który upłynął od startu wyświetlamy na wyświetlaczu LCD1602 podłączonym magistralą I2C:
#włączać
Funkcje wspólne dla bibliotek LiquidCrystal i LiquidCrystal_I2C:
- zaczynać( kolumny, wiersze, ); – Wyświetl inicjalizację z liczbą kolumn, wierszy i rozmiarem znaków.
- jasne();– Czyszczenie wyświetlacza przy kursorze ustawionym na 0,0 (zajmuje dużo czasu!).
- Dom();– Ustaw kursor na 0,0 (zajmuje dużo czasu!).
- wyświetlacz();– Szybkie włączanie wyświetlacza (bez zmiany danych w pamięci RAM).
- bezWyświetlania();– Szybkie wyłączenie wyświetlacza (bez zmiany danych w pamięci RAM).
- migać();– Aktywacja migającego kursora (z częstotliwością ok. 1 Hz).
- nieBlink();– Wyłącz migający kursor.
- kursor();– Włącz podkreślanie kursora.
- bezKursora();– Wyłącz podkreślanie kursora.
- scrollDisplayLeft();– Przewiń wyświetlacz w lewo. Przesunięcie wyświetlania współrzędnych o jedną kolumnę w lewo (bez zmiany pamięci RAM).
- scrollWyświetlaczPrawo();– Przewiń wyświetlacz w prawo. Przesunięcie wyświetlania współrzędnych o jedną kolumnę w prawo (bez zmiany pamięci RAM).
- z lewej na prawą();– Określa dalsze przesuwanie pozycji kursora po wyświetleniu następnego znaku o jedną kolumnę w prawo.
- od prawej do lewej();– Wskazuje na dalsze przesunięcie pozycji kursora, po wyprowadzeniu następnego znaku, o jedną kolumnę w lewo.
- bez automatycznego przewijania();– Wskazuje, że tekst jest dalej wyrównany do lewej strony pozycji kursora (jak zwykle).
- Auto Scroll();– Wskazuje, że tekst zostanie dodatkowo wyrównany na prawo od pozycji kursora.
- utwórzChar( liczba, tablica ); – Wpisz własny znak do CGRAM wyświetlacza pod określoną liczbą.
- ustawKursor( kol, wiersz ); – Ustaw kursor w pozycji wskazanej przez numer kolumny i wiersza.
- wydrukować( tekst ); – Wyświetlaj tekst, symbole lub cyfry na ekranie wyświetlacza. Składnia jest podobna do funkcji o tej samej nazwie w klasie Serial.
Funkcje zaimplementowane tylko w bibliotece LiquidCrystal_I2C:
- w tym();– Inicjalizacja wyświetlacza. Musi być pierwszym poleceniem biblioteki LiquidCrystal_I2C po utworzeniu obiektu. W rzeczywistości ta funkcja znajduje się również w bibliotece LiquidCrystal, ale w tej bibliotece jest wywoływana automatycznie (domyślnie) podczas tworzenia obiektu.
- podświetlenie();– Włącz podświetlenie wyświetlacza.
- bez podświetlenia();– Wyłącz podświetlenie wyświetlacza.
- ustawPodświetlenie( flaga ); – Sterowanie podświetleniem (true - enable / false - disable), stosowane zamiast funkcji noBacklight i podświetlenia.
Połączenie:
// Dla magistrali I2C: |
Parametr:
|
// Dla 4-przewodowej szyny równoległej: #włączać płynny kryształ LCD( RS , mi , D4 , D5 , D6 , D7 ); pusta konfiguracja()( lcd.rozpocznij( przełęcz , wiersz ); } |
Parametr:
|
// Dla 8-przewodowej szyny równoległej: #włączać płynny kryształ LCD( RS , mi , D0 , D1 , D2 , D3 , D4 , D5 , D6 , D7 ); pusta konfiguracja()( lcd.rozpocznij( przełęcz , wiersz ); } |
|
zaczynać( przełęcz ,
wiersz ,
);
Wyświetl inicjalizację z rozmiarami ekranu i znakami. |
Parametr:
|
Funkcje sterowania wyświetlaczem:
wyświetlacz(); Włącza wyświetlacz po jego wyłączeniu przez funkcję noDisplay. |
Uwaga: Funkcja jest wykonywana szybko i bez zmian w pamięci RAM wyświetlacza. |
bezWyświetlania(); Wyłącza wyświetlacz. Dane na wyświetlaczu nie będą wyświetlane do czasu wywołania funkcji wyświetlania, ale nie zostaną usunięte z pamięci RAM, a po wywołaniu funkcji wyświetlania zostaną ponownie wyświetlone. |
Uwaga: Funkcja jest wykonywana szybko i bez zmian w pamięci RAM wyświetlacza. |
scrollDisplayLeft(); Przesuwa współrzędne wyświetlania o jedną kolumnę w lewo. |
|
scrollWyświetlaczPrawo(); Przesuwa współrzędne wyświetlania o jedną kolumnę w prawo. Ciągłe wywołanie tej funkcji stworzy efekt biegnącej linii. Przesunięte są współrzędne zarówno dla informacji na wyświetlaczu, jak i dla tej, która będzie wyświetlana później. |
Uwaga: Funkcja jest wykonywana bez zmiany pamięci RAM wyświetlacza. Jeśli wywołasz funkcję 40 razy z rzędu, współrzędna powróci do pierwotnego punktu |
jasne(); Czyszczenie wyświetlacza przy kursorze ustawionym na 0,0. Informacje na wyświetlaczu zostaną trwale usunięte. |
Uwaga: zajmuje dużo czasu. |
podświetlenie(); Włącz podświetlenie wyświetlacza. |
|
bez podświetlenia(); Wyłącz podświetlenie wyświetlacza. |
Uwaga: Funkcja jest zaimplementowana tylko w bibliotece LiquidCrystal_I2C. |
ustawPodświetlenie( flaga );
Sterowanie podświetleniem (zamiast funkcji noBacklight i podświetlenia). |
Parametr:
|
Funkcje sterowania kursorem:
ustawKursor( przełęcz ,
wiersz );
Ustawia kursor w określonej pozycji. |
Parametr:
|
Dom(); Ustaw kursor w pozycji 0,0. Działa jak setCursor(0,0); |
Uwaga: zajmuje dużo czasu. |
migać(); Włącz migający kursor. |
Uwaga: Kursor zajmuje całe pole znaku i miga z częstotliwością około 1 Hz w miejscu, w którym był wcześniej ustawiony. |
nieBlink(); Wyłącz migający kursor. |
Uwaga: Kursor staje się niewidoczny, ale jego pozycja jest zachowana. |
kursor(); Włącz podkreślanie kursora. |
Uwaga: Kursor zmieni się w znak podkreślenia i zostanie ustawiony w miejscu, w którym był wcześniej ustawiony. |
bezKursora(); Wyłącz podkreślanie kursora. |
Uwaga: Kursor staje się niewidoczny, ale jego pozycja jest zachowana. |
Funkcje kierunku i wyrównania:
z lewej na prawą(); Określa, że po każdym nowym znaku pozycja kursora powinna przesunąć się o jedną kolumnę w prawo. |
Uwaga: Jeśli wyświetlany jest tekst „abc”, wyświetlacz pokaże „abc”, a tekst będzie na prawo od początkowej pozycji kursora. (Jak zwykle) |
od prawej do lewej(); Określa, że po każdym nowym znaku pozycja kursora powinna przesunąć się o jedną kolumnę w lewo. |
Uwaga: Jeśli wyświetlany jest tekst „abc”, wyświetlacz pokaże „cba”, a tekst będzie znajdował się na lewo od początkowej pozycji kursora. (pisanie od prawej do lewej) |
bez automatycznego przewijania(); Określa, że w przyszłości tekst powinien być wyrównany do lewej od początkowej pozycji kursora. |
Uwaga: jeśli ustawisz kursor na pozycji 10.0 i wyświetlisz tekst, to pierwszy znak wyświetlanego tekstu będzie na tej pozycji. (Jak zwykle) |
Auto Scroll(); Określa, że w przyszłości tekst powinien być wyrównany do prawej od początkowej pozycji kursora. |
Uwaga: jeśli ustawisz kursor na pozycji 10.0 i wyświetlisz tekst, kursor będzie znajdował się w tej pozycji. (Współrzędne wyświetlacza zostaną przesunięte w lewo, tak jakbyś wywoływał funkcję scrollDisplayLeft tyle razy, ile jest liter w wyświetlanym tekście) |
Funkcje wprowadzania tekstu i znaków:
utwórzChar(liczba,tablica); Wpisz własny znak do CGRAM wyświetlacza pod określoną liczbą. Jeśli chcesz wydrukować tekst (za pomocą funkcji print), który powinien zawierać ustawiony znak, podaj ukośnik i numer, pod którym ten znak został zapisany: print("C\1MBO\2"). |
Parametr:
|
drukuj(tekst); Wyświetlaj tekst, symbole lub cyfry na ekranie wyświetlacza. |
Parametr:
|
Linia biegnąca w LCD na HD44780.
Poszukiwanie „gotowego rozwiązania” dla linii biegnącej w C nie przyniosło żadnego rezultatu. Więc musiałem to zrobić sam.
Ten „kawałek” kodu pozwala wyświetlić pasek (od prawej do lewej), w dowolnym miejscu i za pomocą dowolnej liczby spacji znakowych, na wskaźnikach LCD z kontrolerem HD44780 lub podobnym.
Pierwszą rzeczą, na którą należy zwrócić uwagę, jest to, że język C nie pozwala na pracę z łańcuchami „bezpośrednio”. Oznacza to, że nie można skopiować znaku z jednego ciągu do drugiego za pomocą operatora przypisania ( = ) ... w tym celu musisz użyć specjalnej funkcji strncpy(). Ogólnie rzecz biorąc, kilka funkcji jest używanych do pracy z ciągami w C. W Self-Dręczyciele osobny rozdział poświęcony jest wykorzystaniu tych funkcji. W Pomocy "e na CV_AVR opis funkcji do pracy z łańcuchami znajduje się w sekcji „Funkcje strunowe”. Prototypy tych funkcji znajdują się w pliku string.h.
"...initial string..." - znaki ciągu, z których chcesz wyświetlić w linii "uruchomiony";
"...wyświetlane znaki..." - właściwie "pełna linia".
Do zorganizowania linii biegowej wybrano następujący algorytm:
1. Wyświetlane znaki są przesuwane od prawej do lewej. Skrajna lewica jest „zagubiona”.
2. Po przesunięciu następny znak z ciągu źródłowego jest kopiowany do znaku znajdującego się najbardziej po prawej stronie.
3. Po osiągnięciu końca ciągu źródłowego pierwszy znak ciągu źródłowego staje się następny.
W przypadku przesunięcia znaku — dla przesuwanej komórki kod znaku jest odczytywany z ekranowej pamięci RAM (DDRAM) HD44780 i zapisywany w lewej komórce RAM.
Zgodnie z DataSheet na HD44780, lewy znak w górnym wierszu ma adres DDRAM równy 0x00, a lewy znak w dolnym wierszu to 0x40. Należy pamiętać, że aby odnosić się konkretnie do pamięci RAM ekranu (a nie do pamięci RAM generatora znaków), konieczne jest, aby bit RS był równy 1 (RS jest najbardziej znaczącym bitem w bajcie adresu, patrz DataSheet) .
W rezultacie otrzymujemy, że aby „odwoływać się” do drugiego znaku od lewej górnej linii, trzeba „pracować” z adresem 0x01 | 0x80 = 0x81.
Funkcje zapisywania i odczytywania „wewnętrznej zawartości” HD44780 znajdują się w bibliotece (prototypy w lcd.h).... zatem... rzeczywisty program:
/* dla CV_AVR W tym przykładzie bieżąca linia jest wyświetlana w bitach od 8 (0xC7) do 16 dolnej linii 16-bitowego wskaźnika. . ...... #włączać znak bez znaku n_sim=1,m_end=43; //43 - długość linii w przykładzie błagać_łańcuch()( // przesunięcie wskaźnika jeśli(str_początek)( // wpisz następny znak na skrajnej prawej pozycji lcd_gotoxy(15,1); |
Słowniczek: n_sim - wskaźnik na pozycję bieżącego znaku w łańcuchu źródłowym; m_end - całkowita liczba znaków w łańcuchu źródłowym; beg_str- bit włączenia zmiany biegów. Dzięki niemu możesz dostosować prędkość „biegania”; ish_str - ciąg źródłowy. |
Najprawdopodobniej każdy z istniejących kompilatorów C posiada funkcje biblioteczne do pracy z HD44780. Dlatego „przerobienie” programu dla „swojego” kompilatora nie będzie trudne.
„Gotuję” ciąg źródłowy za pomocą dobrze znanego narzędzia „HD44780.exe”. Przy jego użyciu komentarze wskazują długość linii: "/* Maksymalna długość linii: 43 bajty */"