Przedstawiony układ realizuje sterowanie wyświetlaczem LCD (HD44780) z użyciem rejestru szeregowego 74HC164. Pozwala na ograniczenie do trzech liczby pinów mikrokontrolera potrzebnych do sterowania wyświetlaczem LCD z popularnym sterownikiem HD44780. Zwykle wymagana liczba pinów (bez takiej przejściówki) wynosi 6 i więcej. Układ opiera się o jeden tani (mniej niż 1zł) rejestr szeregowy 74HC164 i kilka elementów biernych. Trochę zachodu wymaga już przygotowanie płytki drukowanej i montaż (elementy SMD).
Pojawia się pytanie, po co mi to, skoro taki mikrokontroler AVR ma dużo pinów? Z co najmniej dwóch powodów. Raz to seria ATiny nie ma ich tak wiele. Po drugie, łatwiej mi osobiście projektować obwód drukowany, jeśli mam poprowadzić od mikrokontrolera do złącza wyjściowego (do którego podłączam ten układ) 3 linie zamiast 6-ciu, czy więcej.
Pojawia się pytanie, po co mi to, skoro taki mikrokontroler AVR ma dużo pinów? Z co najmniej dwóch powodów. Raz to seria ATiny nie ma ich tak wiele. Po drugie, łatwiej mi osobiście projektować obwód drukowany, jeśli mam poprowadzić od mikrokontrolera do złącza wyjściowego (do którego podłączam ten układ) 3 linie zamiast 6-ciu, czy więcej.
Schemat układu |
Opisywany tu układ znalazłem na stronie AVR 3-Wire HD44780 LCD Interface (avr-gcc). Jak widać, moja wersja jest lekko zmodyfikowana względem oryginału, zarówno pod kątem schematu elektrycznego, jak i kodu (napisanego w C) - tu głównie dodałem kilka kolejnych, użytecznych funkcji. Na płytce znalazł się potencjometr montażowy odpowiedzialny za regulację kontrastu wyświetlacza oraz piny dla sygnałów sterowania/danych i zasilania oraz oczywiście gniazdo wyjściowe. Ilość wyjść i ich rozkład w gnieździe wyjściowym odpowiada dokładnie wejściom modułu LCD. Po wlutowaniu listwy pinów w wyświetlaczu LCD, można go wpiąć wprost do prezentowanego modułu. Moduł wówczas "chowa" się za wyświetlacz.
Pierwsza wersja modułu |
Zdjęcie układu z powyższego obrazka zawiera jedno z pierwszych, zaprojektowanych rozwiązań. Dołączony do postu w załączniku schemat obwodu drukowanego (Eagle) jest już ulepszony. Wyeliminowałem w nim zworki i poprawiłem sposób montażu gniazda wyjścia - spostrzegawczy zauważą, że układ ze zdjęcia nie chowa się za wyświetlaczem LCD ;)
W przyszłości zamierzam jeszcze dodać jako opcję, tranzystor sterujący włączaniem podświetlenia. Innym ciekawym rozwiązaniem, znalezionym gdzieś w sieci, było sterowanie kontrastem wyświetlacza z poziomu mikrokontrolera (PWM).
Użyte elementy:
- US: 74HC164 (SMD, SO14)
- C: 100n (SMD 0805)
- R: 100k (SMD 0805), 10k (rezystor nastawny, THT)
- złącza: listwa kołkowa goldpin 1x4 (kątowa); listwa 1x16
- US: 74HC164 (SMD, SO14)
- C: 100n (SMD 0805)
- R: 100k (SMD 0805), 10k (rezystor nastawny, THT)
- złącza: listwa kołkowa goldpin 1x4 (kątowa); listwa 1x16
Załączniki:
Schematy, kod w C
Schematy, kod w C
Cześć! Spróbowałem skorzystać z Twojej biblioteki, ale napotkałem na kilka trudności.
OdpowiedzUsuńGeneralnie biblioteka działa (inicjalizacja, wyświetlanie stringów i liczb), ale mam prośbę o pomoc w zrozumieniu działania dwóch funkcji oraz znaczenia jednej zmiennej.
1) Co robi zmienna m_nCurrentLine i dlaczego ma specyfikator volatile? Do czego miałaby być użyta w przerwaniu?
2) Jak ma działać funkcja lcd_cursor_gotoxy, bo u mnie pozycjonowanie kursora nie działa? Albo znaki zaczynają się od pozycji 0,0 albo wyświetlacz jest pusty. Nie mogę tego rozszyfrować.
3) Jak działa funkcja lcd_write_int16? Po co argument raw ma włączać/wyłączać funkcję itoa?
Co robi ta część w pętli while? Mnie się wydaje, że robi to, co itoa, tylko "na piechotę". Nie widzę różnicy na wyświetlaczu gdy argument raw przyjmuje wartości 0 lub 1.
:)
OdpowiedzUsuń