
Przedstawiam konstrukcję wykonaną 2 lata temu, jaka jest graficzny wyświetlacz LCD przygotowany do współpracy z DSM-51, jednakże może współpracować z dowolnym innym układem mikroprocesorowym, który umożliwia szeregowe wysyłanie danych. W układzie sterującym jest zastosowany mikrokontroler ATMega32. Ponieważ był problem związany z niedoborem pamięci, przed opisem konstrukcji na forum, miałem zamiar wymienić kontroler na ATMega64 lub nawet ATMega128, ale zawsze albo o tym zapominałem, albo w sklepie nie było i tak wyświetlacz przeleżał, jednakże działa on poprawnie.
Schemat rysowałem kiedyś ręcznie w celu zaplanowania rozmieszczenia elementów na płytce uniwersalnej, ale nie naniosłem wartości tych elementów, co sprawia, że nie jestem w stanie podać wartości kondensatorów i potencjometrów, jednakże stosowałem typowe elementy zgodnie z zaleceniami w notach katalogowych. Cztery kondensatory wokół MAX232 mają napis "104KSC", a dwa kondensatory podłączone to ATMegi mają napis "22". Potencjometr sterujący kontrastem ma napis "223" lub "E22", w zależności, jak czytać. Opornik ma kreski w kolejności złotą, czarną i brązową, jego rezystancja to chyba 10K lub 100K, podłączony między 5V a pinem Reset, tak, jak się robi w każdym AVR.
Rezonator kwarcowy ma częstotliwość 7,3728, wybór częstotliwości był podyktowany możliwością uzyskania standardowych prędkości transmisji danych. Układ MAX232 jest zastosowany po to, żeby można było wykorzystać nieużywany port RS232 w DSM-51 sterowany programowo z mikrokontrolera 8052. Aby umożliwić podłączenie wyświetlacza, do pinu nr 9 w DSM-51 dolutowałem przewód umożliwiający wyprowadzenie napięcia zasilania 5V na RS232. Decydując się na to ulepszenie byłem przekonany, że na 99.9% nie będę nigdy chciał podłączać jakiegokolwiek urządzenia, w którym będzie przeszkadzać obecność napięcia 5V na pinie 9 i przez ostatnie 2 lata rzeczywiście nie podłączałem do DSM-51 do tego porty żadnego innego urządzenia oprócz opisywanego wyświetlacza. Wyświetlacz może tez współpracować z dowolnym urządzeniem operującym na poziomach TTL (0V i 5V). W tym celu należy wyjąć MAX 232 i odpowiednio połączyć dwie pary styków krótkimi drutami w celu uzyskania bezpośredniego połączenia mikrokontrolera z portem.
Schemat w przybliżeniu oddaje rzeczywiste rozmieszczenie elementów układu.

Założenie jest takie, że jest pewien prosty protokół komunikacyjny od układu do wyświetlacza zawierający rozkazy do wykonania przez wyświetlacz. Rozkazy składając się z jednego lub dwóch bajtów. W przeciwna stronę nie są wysyłane żadne dane, tylko normalnie jest poziom wysoki, a jak bufor wyświetlacza jest pełny, to poziom zmienia się na niski, co informuje urządzenie wysyłające, że bufor jest pełny i że nie powinno wysyłać kolejnych danych do czasu, aż nie nastąpi zmiana stanu na wysoki. Bufor jest w stanie pomieścić 256 bajtów, a przepełnienie bufora jest sygnalizowane już przy istnieniu w nim 128 bajtów. Takie rozwiązanie sprawia, że nie ma ryzyka gubienia rozkazów i nie ma potrzeby sprawdzania sygnału zajętości przed każdym rozkazem. Wystarczy raz na kilkadziesiąt rozkazów.
W tym przypadku został użyty wyświetlacz HY 19264E 201 ( http://www.artronic.com.pl/o_produkcie.php?id=590 ), jednak program można przerobić pod dowolny inny wyświetlacz graficzny. Można wyświetlać znaki tekstowo (8 linii po 32 znaki każda) oraz grafikę (192x64 pikseli). Rysowanie i pisanie tekstu działa na podobnej zasadzie, jak tryby graficzne w Microsoft QuickBasic. Zestaw znaków jest taki, jaki jest standardowy w DOS, a konkretnie w Atari Portfolio, bo tam też jest czcionka 6x8 pikseli.
Podczas zapisu rozkazów, rysuje się po 8 pikseli naraz, więc żeby zmienić jeden piksel, należy odczytać pozostałe piksele zapisywane tym samym bajtem, zmienić jeden pit i ponownie ten bajt zapisać. Podczas pisania programu planowałem, że zawartość wyświetlacza będzie pamiętana w pamięci RAM w celu przyspieszenia obsługi wyświetlacza, że przy zapisie o wyświetlacza nie będzie potrzeby odczytu stanu zapisywanych bajtów z pamięci wyświetlacza. Jednak, jeżeli do tego dołączyłem możliwość zamalowywania kształtów przy buforze sensownej wielkości, to zdarzały się błędy, szczególnie przy wypełnianiu zamkniętych obszarów. Wielkość bufora do wypełniania obszarów zamkniętych determinuje maksymalną wielkość wypełnianego obszaru. Później przerobiłem program tak, że stan piksela jest odczytywany z wyświetlacza, więc program rysuje wolniej, ale nie ma już tych błędów związanych z wypełnieniem.
Do obsługi wyświetlacza przewidziałem następujące rozkazy:
01YYYYYY XXXXXXXX - Ustaw współrzędne punktu graficznego 1
10YYYYYY XXXXXXXX - Ustaw współrzędne punktu graficznego 2
11___YYY ___XXXXX - Ustaw współrzędne kursora tekstowego
00000000 - Resetuj stan, ustawienia i wyczyść ekran
00000001 - Wyczyść ekran
00000010 - Ustaw kolor czarny i znaki w pozytywie
00000011 - Ustaw kolor biały i znaki w negatywie
00000111 - Ustaw kolor odwracający
00000100 - Przejdź do stanu wprowadzania tekstu, powrót do stanu normalnego po wysłaniu znaku 00h
00000101 CCCCCCCC - Wprowadź jeden znak
00000110 - Przejdź do nowej linii
00001CLV - Ustawienia kursora tekstowego
- C - Przejście do nowej linii w przypadku znaku 0Dh
- L - Przejście do nowej linii w przypadku znaku 0Ah
- V - Kursor widoczny
0010NSEW - Przesuń kursor tekstowy o jedna pozycje
- N - W górę
- S - W dół
- E - W prawo
- W - W lewo
0001N000 - Narysuj punkt
- N = 0 => Punkt nr 1
- N = 1 => Punkt nr 2
0001N001 - Wypełnij obszar zamknięty
- N = 0 => Punkt nr 1
- N = 1 => Punkt nr 2
0001_010 - Narysuj odcinek
0001F011 - Narysuj prostokąt
- F = 0 => Pusty
- F = 1 => Pełny
0001F10P - Narysuj elipsę
- F = 0 => Pusta
- F = 1 => Pełna
- P = 0 => Współrzędne w punkcie 1, punkt 2 określa promienie
- P = 1 => Współrzędne w punkcie 2, punkt 1 określa promienie
Układ posiada dwa wyłączniki, jeden włącza i wyłącza mikrokontroler, co pozwala restartować wyświetlacz i zmieniać tryby pracy bez odłączania lub przerywania zasilania urządzenia sterującego. Drugi wyłącznik umożliwia włączenie i wyłączenie podświetlenia. Wyświetlacz może pracować w trzech trybach. Wyświetlacz włączony bez trzymania któregokolwiek przycisku pracuje w trybie normalnej pracy. Przedstawiam dwa filmy, które nagrałem 2 lata temu:
https://www.youtube.com/watch?v=YNZVdzwIfl4
https://www.youtube.com/watch?v=5dL43_pmpAU
Oprócz tego, daję zdjęcia z gry "Dominosa". W kolejności to jest początek tej gry na 6 poziomie i nieprawidłowe jej ukończenie, a następnie początek i prawidłowe ukończenie tej samej gry na 3 poziomie. W tej grze prezentowana jest plansza z różna liczbą oczek od 0 do tylu, ile wskazuje poziom i zadaniem gracza jest przykrycie planszy kostkami domina tak, żeby spełnić następujące warunki:
- Kostka przykrywająca ma takie same pola, jak przykrywane pola planszy
- Każda kostka jest inna
- Każde pole na planszy jest przykryte dokładnie jeden raz (połową jednej kostki)
Plansza jest wyświetlana po lewej stronie, a dostępne kostki po prawej stronie. Kostka wyświetlona w negatywie wskazuje, że jest użyta więcej niż jeden raz, co nie jest prawidłowe w grze.




Jeżeli w chwili uruchomienia wyświetlacza jest trzymany pierwszy przycisk, to zostanie uruchomiony tryb ustawień. Ustawia się 3 parametry:
Clock rate - Liczba cykli zegarowych na bit transmisji (wartość od 1 do 256), co przekłada się na prędkość transmisji (wyświetlona jako Baudrate, ze wzoru 7372800/(ClockRate*16)).
Change mode - Kierunek i krok zmiany wartości liczby cykli zegarowych. To ustawienie nie wpływa na działanie wyświetlacza, ale pozwala zrealizować funkcjonalność ustawień na dwóch przyciskach, w których pierwszy wypiera parametr, a drugi zmienia wartość tego parametru.
Return - Informacja zwrotna, czyli sposób reakcji na zapełnienie połowy bufora. Dostępne opcje to "None" (brak sygnalizacji, użyteczne w przypadku podłączenia do mikrokontrolera z UART, który nie może bezpośrednio odczytywać stanu linii wejścia), druga to "Low level on full", czyli stan niski przy zapełnieniu bufora.


Aby przetestować transmisje, należy uruchomić wyświetlacz w trybie testowym, czyli uruchomić go trzymając drugi przycisk. Pojawi się słowo "TEST" i każde wysłanie bajtu do wyświetlacza spowoduje wyświetlenie wartości w postaci binarnej. W tym trybie należy sprawdzić, czy wyświetlane wartości są takie same, jak wysyłane. W przypadku błędów należy skorygować prędkość transmisji. Najlepiej uruchomić program, który wyświetla wszystkie wartości, w których jest jedna jedynak i siedem zer oraz wszystkie wartości, w których jest jedno zero i siedem jedynek, pożądane jest, żeby po każdych czterech program czekał na reakcje użytkownika (naciśnięcie klawisza urządzenia).




Płytka z elektroniką od góry (po zdjęciu wyświetlacza) i od dołu.




W załączniku kod źródłowy programu mikrokontrolera.
Cool? Ranking DIY