Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Symulator wyświetlacza graficznego LCD.

zbigel 08 Lut 2008 11:29 3135 2
  • #1 08 Lut 2008 11:29
    zbigel
    Poziom 12  

    Witam.
    Zastanawiam się czy istnieje coś takiego. Chodzi konkretnie o program na PC, który symulowałby wyświetlacz LCD. Przy czym sygnały sterujące przesyłane koniecznie przez lpt. Nigdzie nie mogę znaleźć czegoś podobnego. Znalazłem jedynie symulator sterowany przy pomocy myszki: http://www.geocities.com/SiliconValley/Circuit/8882/djgfxlcdsim/djgfxlcdsim.html
    Potrzebuje takiego symulatora po to aby budować system elektroniczny bez rzeczywistego lcd, a lcd kupie dopiero jak wszystko będzie działać:D.
    Pozdrawiam
    Zbigel
    http://members.lycos.co.uk/azbigel/

    0 2
  • #2 08 Lut 2008 11:40
    PrAli
    Poziom 12  

    Sorry, że się wtrącam, ale aby nie zakładać nowego tematu to się podepnę.

    Mnie też interesuje symulator wyświetlacza, tylko takiego sterowanego przez I2C, a dokładnie takiego jak są w oplach.

    0
  • #3 08 Lut 2008 21:11
    Akane
    Poziom 27  

    Ciekawy pomysł, aż zacząłem go realizować :)

    PrAli - jaki to ma kontroler? Może masz namiar na pdf?

    Mój projekt jest skierowany dla platformy Windows XP, gdzie dostęp do portów jest domyślnie zabroniony (głównie o to chodzi), co daje możliwość przechwycenia rozkazów:

    Code:
    in al,dx
    
    out dx,al
    zastępując je własnym kodem, przeźroczyście dla programu który operuje na portach.

    Założyłem że kontrolerem jest HD61202U, port 888 reprezentuje dane, a port 889 linie DI, RW, E, CS1, CS2, CS3, RESET, ADC.

    Jestem już w połowie, część odpowiadająca za komunikację wirtualnego kontrolera z portem LPT jest gotowa (flagi BUSY i RESET nie są obsługiwane).

    Pozostało wybranie formatu w jakim wirtualny wyświetlacz ma reprezentować siebie - może to być np. automatyczne rysowanie do HDC z zadaną częstotliwością, lub jako uchwyt bitmapy DIB.

    Obsługa:
    Wystarczą dwie funkcje: CreateLCD i DeleteLCD. CreateLCD automatycznie przekieruje instrukcje in/out dla portów 888 i 889 na własny kod. CreateLCD posłuży też do wstępnej konfiguracji:
    - numery portów (domyślnie 888, 889)
    - przesłanie HDC, pozycji i rozmiaru gdzie rysować wyświetlacz, lub pobranie adresu bajtów matrycy/bitmapy.
    DeleteLCD zwolni pamięć i przywróci instrukcje in/out do stanu sprzed użycia ostatniego CreateLCD.

    Napisz co o tym sądzisz, może masz jakiś pomysł na graficzną reprezentację danych?

    // EDIT
    Aktualna wersja demo wyświetla się na desktopie. Poniższy kod jest tymczasowo wbudowany w kontroler:
    Code:
    int main()
    
    {
       HD61202U *lcd = CreateLCD();

       // HDC i pozycja
       lcd->m_drawdata.dc = GetDC(0);
       lcd->m_drawdata.ptPos.x = 160;
       lcd->m_drawdata.ptPos.y = 160;

       // kolory
       lcd->m_drawdata.bkColor    = 0x0061AE48; // kolor tła
       lcd->m_drawdata.crColorOn  = 0x00054313; // kolor aktywnego pixela
       lcd->m_drawdata.crColorOff = 0x0061AE48; // kolor nieaktywnego pixela

       // rozmiary
       lcd->m_drawdata.pixelSize  = 2; // rozmiar pixela
       lcd->m_drawdata.pixelSpace = 1; // odstęp pomiędzy pixelami
       lcd->m_drawdata.margin     = 1; // margines dla tła

       // porty
       lcd->m_lptDataPort   = 888;
       lcd->m_lptSignalPort = 889; // DI RW E RESET ADC CS1 CS2 CS3

       // włącz lcd
       outp(888, BUS_LCDCONOF | 1); outp(889, BUS_E); outp(889, 0);

       // ustaw obie linie na zerowe
       outp(888, BUS_ISETPAGE|0); outp(889, BUS_E); outp(889, 0);
       outp(888, BUS_ISETLINE|0); outp(889, BUS_E); outp(889, 0);

       // wyślij znak A podobny do spectrumowego
       outp(888, 126); outp(889, BUS_WRITEDATA|BUS_E); outp(889, BUS_WRITEDATA);
       outp(888,   9); outp(889, BUS_WRITEDATA|BUS_E); outp(889, BUS_WRITEDATA);
       outp(888,   9); outp(889, BUS_WRITEDATA|BUS_E); outp(889, BUS_WRITEDATA);
       outp(888,   9); outp(889, BUS_WRITEDATA|BUS_E); outp(889, BUS_WRITEDATA);
       outp(888,   9); outp(889, BUS_WRITEDATA|BUS_E); outp(889, BUS_WRITEDATA);
       outp(888,   9); outp(889, BUS_WRITEDATA|BUS_E); outp(889, BUS_WRITEDATA);
       outp(888, 126); outp(889, BUS_WRITEDATA|BUS_E); outp(889, BUS_WRITEDATA);


       Sleep(10000);
       ReleaseDC(0, lcd->m_drawdata.dc);
       DeleteLDC(lcd);
       return 0;
    }

    Docelowo planuję umieścić kontroler w dll, a do funkcji CreateLCD dodać wskaźnik na strukturę z parametry inicjującymi, które w pozyższym kodzie są ustawiane poprzez lcd->x = y;
    Jak widać, można ustawić rozmiar pixeli i odstęp pomiędzy nimi, kolor tla i (nie)aktywnego pixela.

    0