logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Program do symulacji wyświetlacza LCD z obsługą LPT na PC - poszukiwania

zbigel 08 Lut 2008 11:29 3843 2
REKLAMA
  • #1 4782860
    zbigel
    Poziom 12  
    Posty: 82
    Pomógł: 6
    Ocena: 11
    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/
  • REKLAMA
  • #2 4782886
    PrAli
    Poziom 12  
    Posty: 87
    Pomógł: 2
    Ocena: 6
    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.
  • #3 4784779
    Akane
    Poziom 27  
    Posty: 638
    Pomógł: 144
    Ocena: 33
    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:
    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:
    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.
REKLAMA