piątek, 12 grudnia 2014

[C#]Wirtualne wyświetlacze reaktywacja - Virtual LCD


Co prawda powstał już podobny program virtual OLED, jednak bardziej przypomina demko jego nowszej wersji :)

A więc co to takiego ten virtual LCD jest i do czego służy? 

Istnieje cała masa najprzeróżniejszych wyświetlaczy, które można wykorzystać we własnych projektach. No ale nie zawsze się ma się tę możliwość dostania tego czy tamtego LCDka w swoje łapki. Pojawił się więc pomysł: a gdyby tak stworzyć aplikację potrafiącą symulować zachowanie danego wyświetlacza? I tak powstał virtual OLED. Idąc dalej tym tokiem myślenia: a po co ograniczać się do jednego typu wyświetlacza? A może by tak napisać program potrafiący zasymulować dowolny? A co gdybym chciał uruchomić kilka jednocześnie? OK, problem został mniej więcej zdefiniowany, pozostało tylko przysiąść do Visuala i napisać coś sensownego. I tak po ok 8 dniach klepania palcami po klawiaturze powstał virtual LCD

No to teraz co takiego ten virtual LCD potrafi?

Potrafi ustawić sobie własne tło, taką tapetę. Bo co motywuje lepiej do pracy niż David z podniesionym kciukiem skierowanym w Twoją stronę? :D No to teraz już na poważnie. Każdy wyświetlacz posiada sterownik. Dlatego też każdy z wirtualnych wyświetlaczy też taki posiadać będzie. Taki, nazwijmy go, wirtualny driver zawiera informacje o liczbie kolorów jakie potrafi wyświetlać oraz o rozdzielczości. Program umożliwia tworzenie wirtualnych wyświetlaczy posiadających ten sam sterownik-driver. Co z kolei oznacza, że takie wyświetlacze będą się charakteryzowały taką samą głębią kolorów i rozdzielczością. Może się to wydawać nieco zagmatwane, jednak w moim odczuciu jest w tym trochę sensu. Do każdego sterownika tworzona jest biblioteka pozwalająca sterować wyświetlaczem za pomocą mikroprocka. Idźmy dalej. Jak już utworzymy taki wyświetlacz to możemy go załadować na nasz 'pulpit'. Następnie możemy mu przypisać jeden z dziesięciu dostępnych portów. Wykorzystanie portów umożliwia sterowanie kilkoma wyświetlaczami jednocześnie. Można też podpiąć kilka wyświetlaczy do tego samego portu, w efekcie będą wyświetlały to samo (tak jak na zdjęciu powyżej). Pozostałe właściwości:

Wybór głębi koloru:
  • monochromatyczny - nie wymaga chyba wyjaśnienia, pixel zapalony - pixel zgaszony. Przykład - wyświetlacze OLED;
  • 256 kolorów - informacja o kolorze zawarta jest w 1 bajcie danych. 3 najstarsze bity to kolor czerwony, 3 kolejne - kolor zielony, 2 najmłodsze bity kolor niebieski RRRGGGBB. Taki tryb można uruchomić na wyświetlaczu z nokii 3510i;
  • 65536 kolorów - przesyłanie danych o kolorze w 2 bajtach - 16 bitach (5bitów kolor czerwony, 6 bitów kolor zielony, 5 bitów kolor niebieski) RRRRRGGG GGGBBBBB;
  • 16 milionów kolorów - 3 bajty na przesłanie koloru, po każdym bajcie na jego składową RGB.
Rozdzielczość wyświetlacza - raczej dowolna. Raczej dlatego, bo jest ograniczenie do max szerokości i wysokości 1000 pixeli.

Kolejna sprawa - komunikacja mikroprocka z aplikacją. Do ich połączenia użyty został interfejs RS232. 

Należy mieć świadomość, że prędkość wirtualnego wyświetlacza będzie nieporównywalnie mniejsza w porównaniu z prawdziwym wyświetlaczem. Nie ma co liczyć na animacje :P. Poza ustawieniem BaudRate, na rzeczywistą prędkość działania wyświetlacza mają wpływ :
  • wybrana głębia kolorów:
    • obraz monochromatyczny - 1 bajt (bajt na wysłanie komendy pixel on);
    • paleta 256 kolorów - 2 bajty (1 bajt na komendę, 1 bajt na kolor);
    • paleta 65 tys, kolorów - 3 bajty (1 bajt na komendę, 2 bajty na kolor);
    • paleta 16 mln. kolorów - 4 bajty(1 bajt na komendę, 3 bajty na kolor);
  • rozmiar wyświetlacza
    • jeśli długość albo szerokość jest mniejsza bądź równa 128 pixeli to każdy z parametrów wysyłany jest w 1 bajcie;
    • jeśli któryś z parametrów jest większy niż 128 pixeli, to do wysłania wymagane są 2 bajty.
Jeszcze parę słów o funkcjach znajdujących się w wygenerowanej bibliotece (na przykładzie sterownika do nokii3510i):

void n3510iInit(uint8_t portNumber); - Funkcja do inicjalizacji danego wyświetlacza. Jeśli mamy kilka wyświetlaczy na różnych portach to każdy trzeba zainicjalizować oddzielnie;

void n3510iPixelOn(int x, int y, uint8_t color); - wyświetlanie piksela. Dla wyświetlaczy monochromatycznych podaje się tylko współrzędną x i y. Przy wyświetlaczach kolorowych dochodzi jeszcze informacja o kolorze;

void n3510iPixelOff(int x, int y); - gaszenie piksela;

void n3510isetPortNumber(uint8_t portNumber); - jeśli uruchamiamy wyświetlacze na różnych portach to tą komendą przełączamy aktywny wyświetlacz;

uint8_t getColor(uint8_t colorR, uint8_t colorG, uint8_t colorB); - ta funkcja dostępna jest tylko dla wyświetlaczy z 256 kolorami. Zwracaną wartość można wstawić bezpośrednio do funkcji wysyłającej piksel. Przykład: n3510iPixelOn(10,20, getColor(255,0,0)); - zapalenie piksela o współrzędnych 10,20 na czerwono.

No to by było tyle ględzenia, teraz zapraszam na prezentację:


Brak komentarzy:

Prześlij komentarz