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

LCD 4x20 BARTON BT42005VB-SRE - tylko 2 linie działają, reszta nie reaguje

denooky 22 Maj 2006 10:47 3166 6
REKLAMA
  • #1 2651270
    denooky
    Poziom 20  
    Posty: 497
    Pomógł: 3
    Ocena: 26
    Witam! Posiadam wyswietlacz BARTON BT42005VB-SRE (na HD4478) no i problemy z nim zwiazane. Po podlaczeniu "swieca sie" tylko 2 linie (1 i 3), tzn regulacja kontrastu dziala tylko na dwoch liniach, pozostale 2 - zero reakcji. Zapewne dlatego tez nic nie wyswietlaja. Mam 2 sztuki tego wyswietlacza, obie zachowuja sie identycznie. LCD jest na pewno 4x20, widzialem projekt na necie na tym wyswietlaczu, poza tym ma 4 uklady z tylu, jakies drivery M5839C + piaty HD44780. Mam rowniez LCD WM-C1601s 1x16, ktory wyswietla tylko pierwsze 8 znakow. Dziwnym trafem zarowno w przypadku LCD 4x20 jak i 1x16, nie wyswietlane linie leza w pamieci DDRAM za adresem 40h, czyli w jej drugiej polowce. Ponizej zamieszam rozklad adresow DDRAM (dla 4x16), moze komus sie jeszcze przyda. W czym moze tkwic problem? Wykluczam raczej bledne podlaczenie, skoro wyswietla prawidlowo na 1 i 3 linii - data, masa i zasilanie musi byc podlaczone w porzadku. Z gory dziekuje za pomoc i pozdrawiam.
    Załączniki:
    • LCD 4x20 BARTON BT42005VB-SRE - tylko 2 linie działają, reszta nie reaguje untitled.JPG (36.79 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • REKLAMA
  • #2 2651395
    vonteq666
    Poziom 13  
    Posty: 72
    Pomógł: 4
    Ocena: 1
    Witam

    Przydałby się kod sterujący, być może błąd tkwi w inicjalizacji. Ja przez nieuwagę nie mogłem wyświetlić nic na 2-giej linii mojej matrycy 2x20.

    Pozdrawiam
  • REKLAMA
  • #3 2651517
    McRancor
    VIP Zasłużony dla elektroda
    Posty: 5326
    Pomógł: 479
    Ocena: 124
    To normalny objaw, wyświetlacze są sprawne, sterownik zapala tak nieparzyste linie w celu ustawienia prawidłowego kontrastu, musisz je zainicjować i chcieć coś na nich wyświetlić.
  • #4 2651788
    denooky
    Poziom 20  
    Posty: 497
    Pomógł: 3
    Ocena: 26
    Oczywiscie, ze byl blad w inicjalizacji. W `function set` bit 'N' musi byc ustawiony na 1, uruchamiajac wszystkie linie - nie wiem jak moglem to przeoczyc. W kazdym badz razie dziekuje za naprowadzenie!
  • REKLAMA
  • #5 3804169
    silelis
    Poziom 12  
    Posty: 114
    Ocena: 24
    Mam podobny problem z wyświetlaczem DEM16481 4x16 (świeci mi się 1 i 3 linijka). Obsługuję go 8-mioma bitami z portu D PIC16f77- kwarc 16Mhz. Bit RS to RC0 RW to RC1 EN to RC2.

    Napisana przeze mnie obsługa wyświetlacza wygląda następująco:
    ===============================================


    #define RS PIN_C0
    #define EN PIN_C2
    #define RW PIN_C1

    // WAŻNE PONIEWAŻ NA POT%CIE C JEST RÓWNIEŻ I2C i TX RX USTAWIAJĄC TE PORTY TRZEBA
    // ODCZYTAĆ KONFIGURACJĘ PORTU, i USTAWIĆ ODPOWIEDNIE BITY NA O czyli do akumulatora
    // portc i logiczny\ny and z 0 na C0 C1 C2

    void enable()
    {
    output_bit(EN,1);
    delay_us(1);
    }

    void disable()
    {
    delay_us(1);
    output_bit(EN,0);
    }

    void lcd_config_bits() //ustawia bity RS i RW do konfiguracji
    {
    output_bit(RS,0);
    output_bit(RW,0);
    }

    void lcd_write_bits() //ustawia bity RS i RW do zapisu na LCD
    {
    lcd_config_bits();
    output_bit(RS,1);
    }

    void lcd_read_bits() //ustwaie bity RS i RW do odczytu danych z LCD
    {
    lcd_write_bits();
    output_bit(RW,1);
    }

    void lcd_busy_bits() //ustawia bity RS i RW do sprawdzenia adresu DDRAM i czy wyświetlacz jest zajęty
    {
    lcd_config_bits();
    output_bit(RW,1);
    }

    void tris_d_out()
    {
    set_tris_d(0x0);
    }

    void tris_d_in()
    {
    set_tris_d(0xFF);
    }

    byte is_busy()
    {
    byte a=0;
    //ustawia port na inpu
    tris_d_in();
    //ustawieni RW i RS na własne
    lcd_busy_bits();
    do
    {
    enable();
    a=input_d();
    disable();
    }while (a>=0x80);

    return(a);
    //ustawoa port na output
    tris_d_out();
    }

    void clrscr()
    {
    is_busy();
    lcd_config_bits();
    enable();
    output_d(0b00000001);
    disable();
    }

    void gotoxy(byte x, byte y)
    {
    Byte address=0;
    is_busy();
    lcd_config_bits();
    if (y==2) //poprawić
    {
    address =0x40;
    }
    else if (y==3)
    {
    address =0x10;
    }
    else if (y==4)
    {
    address= 0x50;
    }
    else
    {
    address=0x0;
    }
    address=address+x-1;
    bit_set(address,7);
    enable();
    output_d(address);
    disable();
    }

    void lcd_init()
    {
    //TRISC init
    byte *temp;
    delay_ms(1000); ///opóźnienie na ustalenie napięć
    temp=0x87;
    *temp=*temp&0b11111000;
    tris_d_out();

    //function set
    lcd_config_bits();
    enable();
    output_d(0b00111100);
    disable();
    delay_us(45);

    //display on/off
    enable();
    output_d(0b00001111);
    disable();
    delay_us(45);

    //clear screen
    clrscr();
    delay_ms(2);

    //entry mode
    enable();
    output_d(0b0000110);
    disable();
    delay_us(50);
    }

    void lcd_write_char(char c) //dopisać finkcję sprawdzania zajętości może gubić znaki z powodu nie odczekania chwili na wprowadzenie chara
    {
    //sprawdza czy LCD może pisać dane
    is_busy();
    //ustawieni RW i RS na własne
    lcd_write_bits();
    enable();
    output_d(c);
    disable();
    }

    void lcd_read()
    {
    //ustawia port na input
    tris_d_in();

    //ustawieni RW i RS na własne



    //ustawoa port na output
    tris_d_out();
    }

    void next_line()
    {
    }

    void write_word()
    {
    }



    ===============================================
    Czy mógłby ktoś zerknąć na funkcję lcd_init() i powiedzieć czy aby na pewno dobrze inicjuję dane?

    Poprawcie mnie jeśli się mylę ale wg. mnie przesłanie instrukcji do wyświetlacza następuje po zmianie stanu EN na wysoki. Po wysłaniu instrukcji zmieniam stan EN na niski, a Przed następną instrukcją znów na wysoki??
  • #6 3814458
    Dr_DEAD
    Poziom 28  
    Posty: 829
    Pomógł: 126
    Ocena: 3
    silelis napisał:

    Poprawcie mnie jeśli się mylę ale wg. mnie przesłanie instrukcji do wyświetlacza następuje po zmianie stanu EN na wysoki. Po wysłaniu instrukcji zmieniam stan EN na niski, a Przed następną instrukcją znów na wysoki??

    LCD 4x20 BARTON BT42005VB-SRE - tylko 2 linie działają, reszta nie reaguje
    Zmian na liniach D0-D7 możesz dokonywać tylko i wyłącznie wtedy gdy E jest w stanie niskim.
    Czyli nie:
    //function set
    lcd_config_bits();
    enable();
    output_d(0b00111100);
    disable();
    delay_us(45);

    Lecz:
    //function set
    lcd_config_bits();
    output_d(0b00111100);
    enable();
    disable();
    delay_us(45);
  • REKLAMA
  • #7 3819385
    silelis
    Poziom 12  
    Posty: 114
    Ocena: 24
    Rzeczywiście. :|
    Zmieniłem jeszcze opóźnienie w enable i poszło :D

Podsumowanie tematu

✨ Problem dotyczył wyświetlacza LCD 4x20 BARTON BT42005VB-SRE opartego na kontrolerze HD44780, gdzie po podłączeniu świeciły się tylko dwie linie (1 i 3), a pozostałe dwie nie reagowały i nie wyświetlały danych. Objaw ten jest typowy dla nieprawidłowej inicjalizacji wyświetlacza, ponieważ kontroler zapala nieparzyste linie w celu ustawienia kontrastu, a linie parzyste wymagają poprawnej konfiguracji i wysłania danych. W dyskusji podkreślono, że w funkcji ustawiania trybu (function set) bit 'N' musi być ustawiony na 1, aby aktywować wszystkie linie wyświetlacza. Dodatkowo zwrócono uwagę na prawidłową kolejność sygnałów podczas wysyłania komend do LCD, szczególnie na zmianę stanu linii danych tylko przy niskim stanie sygnału E (Enable). Przykład problemu i rozwiązania podano także dla wyświetlacza DEM16481 4x16, gdzie podobne symptomy występowały. Ostatecznie poprawna inicjalizacja i odpowiednie opóźnienia w sygnale Enable pozwoliły na pełne wykorzystanie wszystkich linii wyświetlacza.
Wygenerowane przez model językowy.
REKLAMA