jeszcze nie mam graficznego wyświetlacza, ale powoli przygotowuję pliki .BGF do swojego projektu. w związku z tym mam małe pytanko (moze głupie, ale nie dziwcie się, dopiero zaczynam z graficznymi lcd):
czy jeśli mam wyświetlacz 192x64 to żeby umieścić powiedzmy po prawej jakąś grafikę muszę stworzyć grafikę na cały lcd czyli po lewej pusto a po prawej grafika czy tylko wielkości umieszczanego elementu?
raczej logiczne jest by był to element tylko o wielkości wstawianej grafiki.
czy można wstawić grafikę niejako w grafikę? czyli pewien obszar zajmuje jakaś grafika a ja chcę dodać w jej środek kolejną. w takim przypadku jedna zamaże mi drugą jak ma to miejsce w zwykłym lcd czyli nadpisanie miejsca?
graficzny lcd a umieszczanie grafiki
Oczywiście że element może mieć dowolny rozmiar, nawet większy od samego ekranu, bo wyświetlisz sobie tylko tyle ile potrzebujesz.
Jak już wcześniej ci napisałem twój wyświetlacz to tak naprawdę 3 niezależne wyświetlacze 64x64, a sterownik KS0108 obsługuje max rozmiar 128x64, czyli wykorzystane jest tylko 50% jego RAMu.
Niestety taka konstrukcja me swoje wady, otóż nie da się liniowo przesyłać danych o obrazie.
Dane trzeba przesłać w 3 osobnych paczkach, dla każdej 1/3 ekranu, co gorsza trzeba pamiętać aby co 64 pixele ustawić na nowo licznik wierszy i wyzerować licznik kolumn, bo inaczej połowa danych wyląduje ci w niewidocznej części pamięci ekranu.
Ogólnie spora część wyświetlaczy graficznych jest upierdliwa w obsłudze, bo producenci często stosują przekombinowane rozwiązania. Równie dobrze zamiast 3 sterowników KS0108 producent mógł włożyć 2, dzieląc ekran na połówki 98x64 pixele, wyświetlacz był by tańszy, bardziej standardowy, i miał by mniej linii sterujących, a wyświetlał by dokładnie to samo.
Jak już wcześniej ci napisałem twój wyświetlacz to tak naprawdę 3 niezależne wyświetlacze 64x64, a sterownik KS0108 obsługuje max rozmiar 128x64, czyli wykorzystane jest tylko 50% jego RAMu.
Niestety taka konstrukcja me swoje wady, otóż nie da się liniowo przesyłać danych o obrazie.
Dane trzeba przesłać w 3 osobnych paczkach, dla każdej 1/3 ekranu, co gorsza trzeba pamiętać aby co 64 pixele ustawić na nowo licznik wierszy i wyzerować licznik kolumn, bo inaczej połowa danych wyląduje ci w niewidocznej części pamięci ekranu.
Ogólnie spora część wyświetlaczy graficznych jest upierdliwa w obsłudze, bo producenci często stosują przekombinowane rozwiązania. Równie dobrze zamiast 3 sterowników KS0108 producent mógł włożyć 2, dzieląc ekran na połówki 98x64 pixele, wyświetlacz był by tańszy, bardziej standardowy, i miał by mniej linii sterujących, a wyświetlał by dokładnie to samo.
Dlaczego się nie da? Za liniowe przesyłanie obrazu rozumiem w tym przypadku możliwość włączenia/wyłączenia jednego, wybranego piksela bez naruszania stanów pozostałych. Są co najmniej dwie metody, aby to zrobić:kayron pisze:Niestety taka konstrukcja me swoje wady, otóż nie da się liniowo przesyłać danych o obrazie.
1. Przechowywać w wewnętrznej pamięci RAM uK obraz, ustawić wybrany piksel i blokami przesłać dane do LCD. Rozmiar tablicy to 192 x 64 = 1.5kB.
2. Aktywować wybraną część LCD (linia CS0, CS1 lub CS2), ustawić adres kolumny i wiersza, odczytać linie danych (8 bitów), zmodyfikować wybrany piksel i zapisać go w to samo miejsce.
Tak więc da się, chyba, że przez pojęcie "liniowe przesyłanie danych" rozumiemy różne rzeczy.
Jednakże szybkość wyznaczania adresu byłaby moim zdaniem mniejsza. Tak dzieląc współrzędną X przez 3 wiesz, którą linię CS aktywować. W przypadku dwóch kontrolerów konieczne byłoby porównanie współrzędnej X z wartością 98, co moim zdaniem będzie bardziej czasochłonne i zaciemniłoby program. Sterowanie trzech kontrolerów jest czytelniejsze.kayron pisze:Równie dobrze zamiast 3 sterowników KS0108 producent mógł włożyć 2, dzieląc ekran na połówki 98x64 pixele, wyświetlacz był by tańszy, bardziej standardowy, i miał by mniej linii sterujących, a wyświetlał by dokładnie to samo.
Nic bardziej mylnego bo jak byś miał 2x98 pixeli to byś dzielił przez 2 a nie porównywał z 98 jak to sugerujesz. A dzielnie przez 2 to nic innego jak przesunięcie zawartości rejestru w lewo, czyli jedna instrukcja asemblera i to bardzo szybka, szybsza niż dzielenie przez 3.Jednakże szybkość wyznaczania adresu byłaby moim zdaniem mniejsza. Tak dzieląc współrzędną X przez 3 wiesz, którą linię CS aktywować.
Oczywiście tak wyliczysz tylko adres, a nie sygnał CS, tutaj porównania nie unikniesz w obu przypadkach. Choć w przypadku liczby 64 też można stosować sztuczki, ale dla 98 też się da sprytnie to zrobić.
Po drugie mając tylko 2 linie CS potrzebujesz do sterowania tylko 1 pinu procesora i prostego inwertera na tranzystorze, korzyść podwójna, zaoszczędzony pin procesora a i procedura wyboru połówki ekranu jest szybsza i prostsza niż w przypadku 3 ćwiartek.
Oczywiście takie optymalizacje nie mają większego znaczenia w prostych aplikacjach, ale gdybyś już chciał pisać grę, lub szybką animacje, to każdy dodatkowy cykl maszynowy w programie przekłada ci się już na FPSy. A te wiadomo jak są cenne.
Masz rację, mam wyświetlacz o organizacji 128 x 64, myślałem o nim i stąd moja wypowiedźkayron pisze:ic bardziej mylnego bo jak byś miał 2x98 pixeli to byś dzielił przez 2 a nie porównywał z 98 jak to sugerujesz.
Zajrzałem do noty aplikacyjnej sterownika KS0108. Ma on pamięć 512B, czyli 4096 punktów. Pozwala to obsłużyć matrycę o rozmiarze 64 x 64, stąd trzy takie scalaki. Gdyby było tak jak Ty chcesz, to nie byłby juz KS0108Po drugie mając tylko 2 linie CS potrzebujesz do sterowania tylko 1 pinu procesora