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

[HD44780][2x16][C] Pisanie w drugiej linii wyświetlacza

Peef 01 Mar 2009 19:25 6966 8
REKLAMA
  • #1 6222889
    Peef
    Poziom 14  
    Posty: 172
    Pomógł: 1
    Ocena: 24
    Witam!

    Chcę napisać program wyświetlający tekst na wyświetlaczu ze sterownikiem HD44780, 2x16.
    Używam do sterowania procesora AT89S52.

    Wszystko działa ok, ale nie mogę pisać w drugiej linii. Sterowanie jest 4 bitowe.

    Przy włączeniu wyświetlacza używam następujących komend:
    
    0x28,0x01,0x0F
    

    Następnie do przejścia do drugiej linii używam polecenia:
    0xC0
    Dalej wpisuję jakąś literę do wyświetlenia, jednak to nie działa, ponieważ znika mi kursor i nic nie jest wyświetlane na ekranie :|
    Normalnie pisanie w pierwszej linii działa, ale już przy przejściu do kolejnej linii wygląda tak jakby gdzieś wychodził poza obszar pisania.
    Raz mi udało się uruchomić obydwie linie, ale coś zmieniałem w początkowych rozkazach dla wyświetlacza (chyba dodałem 0xB3). Co prawda wtedy wpisując standardowe znaki ASCII do drugiej linii (dowolna litera), z reguły wyświetla ', P, lub @. I do tego zmiana znaku o +0x01 nie wpływa na to co jest wyświetlane, dopiero zmiana o większe wartości jakoś wpływa.

    Co zrobić, żeby można było używać tej drugiej linii? :)

    Dzięki
    Pozdrawiam
  • REKLAMA
  • #2 6223737
    kaktus_c++
    Poziom 18  
    Posty: 231
    Pomógł: 26
    Ocena: 3
    używasz jakąś bibliotekę do obsługi lcd? jak np. na stronie wkretak.pl ?

    tam to robisz tak:
    LCD_WriteText("Linia pierwsza");
    LCD_GoTo(0,1);WriteText("druga linia");
  • REKLAMA
  • #3 6225443
    Peef
    Poziom 14  
    Posty: 172
    Pomógł: 1
    Ocena: 24
    Dzięki za odpowiedź.

    Korzystam z kodów źródłowych dołączonych do książki "Programowanie mikrokontrolerów 8051 w języku C".

    Link do przykładów:
    Przykłady

    Nawet w prostym programie w katalogu 10_03b_LCD_tests, jak uruchomię LCD wszystko jest OK i wszystkie znaki są wypisywane.
    Jak chce następnie przejść do linii numer 2 (mam wyświetlacz 2x16), używając komend LCD_ctrlWR(0xC0), LCD_dataWR('0') nic się nie dzieje, tzn znika kursor i nie ma nowego znaku.

    Używam kwarcu 24 Mhz, a opóźnienie jako pętla do wartości 0x2000.

    Może trzeba używać krótszych/ dłuższych opóźnień? A może też coś zależy od modelu samego wyświetlacza (ale jest oparty na HD44780)?
  • REKLAMA
  • #5 6227863
    kaktus_c++
    Poziom 18  
    Posty: 231
    Pomógł: 26
    Ocena: 3
    adamwesola : zamiast "podsyłać" może po prostu zamieść załącznik, może inni też skorzystają.
  • REKLAMA
  • #6 6229001
    Peef
    Poziom 14  
    Posty: 172
    Pomógł: 1
    Ocena: 24
    Dzięki za odpowiedź!

    Może faktycznie jeśli możesz, wrzuciłbyś pliki na forum.

    Generalnie jeszcze tak nie za bardzo korzystam z asm, obecnie programuję to w C, ale z chęcią poczytam kod w asm.

    A tak w ogóle to udało się uruchomić drugą linię :D W sumie nie wiem do końca w jaki sposób, albo kwestia kabelków, albo, że zmieniłem bity sterujące na 0x28,0x28,0x28,0x0F,0x01 i działa teraz elegancko :)

    Mam jeszcze takie pytanie.

    Procesor nie zawsze się udaje zaprogramować. Programuję go przez stk200 (isp) używając programu ISP Programmer. Kwarc 24 Mhz.

    Wygląda to tak, że czasem procesor nie jest rozpoznawany w programie (read signature zwraca np. (FF, FF, FF) ), a w raporcie są inne dane zapisywane, a inne odczytane w trakcie programowania (odczytane to FF).

    Udaje mi się np. zaprogramować procesor i potem cały czas mogę go programować, ale czasem muszę z 20 razy resetować procesor i różne kombinacje robić w programie.

    Zauważyłem, że udaje się cały proces programowania uruchomić, gdy wcisnę niezależnie guzik RESET przy uC i wciskam Erase & Programm All.

    W trakcie wykonywania Erase zauważyłem, że dochodzi gdzieś do zwarcia (gdy trzymam wciśnięty guzik RESET jednocześnie przy programowaniu), wskazuje mi to zasilacz. Dziwne jest to, że dopiero wtedy procesor daje się zaprogramować. Co prawda bywa tak, że taka kombinacja nie uruchamia procesora ;) i np. trzeba przy programowaniu ciągle naciskać ten zewnętrzny RESET i wtedy zaczyna się procesor programować :)

    Czy może to być kwestia jakiś zimnych lutów, software'u czy czegoś innego?
  • #7 6229004
    SciroWroc
    Poziom 14  
    Posty: 82
    Pomógł: 7
    Ocena: 8
    - sprawdź czy przy lcd jest uruchamiane w trybie z 2 liniami
    - sprawdź adres pola w drugiej linii (40)
  • #8 6229287
    adamwesola
    Poziom 24  
    Posty: 499
    Pomógł: 71
    Ocena: 22
    Znakomita większość rozwiązań sterowania lcd robiona jest jako 4-ro bitowa + rs i e, nawet wtedy gdy stosowany procesor ma wiele portów i do tego niezajętych.
    Niezaprzeczalną cechą 8-mio bitowego sterowania , wraz ze sprawdzaniem BF (w lcd) jest jego prostota programowa, dlatego tam gdzie to możliwe preferuję takie właśnie rozwiązanie.
    [HD44780][2x16][C] Pisanie w drugiej linii wyświetlacza
    (zrzut z poteusa)
    ; lcd podlaczony do portu 1, mozna zmienic na dogodny
    ; ponizsze linie ster. mozna zmienic na dogodne
    lin_rw	equ		p3.0
    lin_e   equ    	p3.1    
    lin_rs  equ    	p3.2    
    
    		org	0
    ;--------------init lcd	----------------         
             mov    a, #38h	; interf.8-bit,2-wiersz,5x7pix
             call   lcd_cont
             mov    a, #0ch 	; display on, reszta off
             call   lcd_cont
             mov    a, #1		; clear display       
             call   lcd_cont
    ;------------koniec inicjacji lcd-------------         
             mov	a,#'A'
             call	lcd_data
             mov	a,#'d'
             call	lcd_data
             mov    a, #0c0h		; przejscie do 2 wiersza      
             call   lcd_cont
             mov	a,#'W'
             call	lcd_data
             mov	a,#'e'
             call	lcd_data
             sjmp	$
    ;-------------sekcja gotow.lcd
    lcd_busy:	setb	p1.7
    		clr		lin_rs  
    		setb	lin_rw
    j_nie:	clr		lin_e
    		setb	lin_e
    		jb		p1.7,j_nie
    		clr		lin_rw
    		ret
    ;-----------sekcja wyswietlania         
    lcd_data:	call	lcd_busy	
    		setb lin_rs
    		mov  p1,a
            setb lin_e
            clr  lin_e				
    		ret
    ;-----------sekcja sterowania
    lcd_cont:	call	lcd_busy
    		clr  lin_rs
    		mov p1,a
            setb lin_e
            clr  lin_e				
    		ret
    ;-----------------
    	end
    
  • #9 6230179
    Peef
    Poziom 14  
    Posty: 172
    Pomógł: 1
    Ocena: 24
    Dzięki za odpowiedzi i dzięki za kod! :)

    Udało mi się uruchomić tą drugą linię tak jak wcześniej napisałem.

    Orientujecie się może, dlaczego nie mogę zaprogramować tego procesora?

Podsumowanie tematu

✨ Dyskusja dotyczy problemu z wyświetlaniem tekstu w drugiej linii wyświetlacza LCD 2x16 opartego na sterowniku HD44780, sterowanego 4-bitowo przez mikrokontroler AT89S52. Użytkownik stosuje komendy inicjalizacyjne 0x28, 0x01, 0x0F oraz próbę przejścia do drugiej linii za pomocą 0xC0, jednak po tej komendzie kursor znika i nie wyświetla się tekst. Wskazano konieczność prawidłowego ustawienia trybu 2-liniowego oraz adresu DDRAM drugiej linii (0x40). Zaproponowano użycie bibliotek lub kodów źródłowych do obsługi LCD, w tym przykłady w asemblerze z 8-bitowym sterowaniem i sprawdzaniem flagi BF zamiast opóźnień. Użytkownik potwierdził, że zmiana sekwencji inicjalizacji na 0x28, 0x28, 0x28, 0x0F, 0x01 pozwoliła na poprawne wyświetlanie w obu liniach. Poruszono także problem niestabilnego programowania mikrokontrolera AT89S52 przez interfejs ISP STK200 przy kwarcu 24 MHz, gdzie czasem odczyt sygnatury zwraca 0xFF. Sugerowano sprawdzenie połączeń i ustawień programatora. W dyskusji pojawiły się przykładowe fragmenty kodu inicjalizacji i sterowania LCD oraz sugestie dotyczące długości opóźnień i trybu pracy wyświetlacza.
Wygenerowane przez model językowy.
REKLAMA