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.

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

Peef 01 Mar 2009 19:25 6027 8
  • #1 01 Mar 2009 19:25
    Peef
    Poziom 14  

    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:

    Code:

    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

    0 8
  • #2 01 Mar 2009 21:50
    kaktus_c++
    Poziom 18  

    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");

    0
  • #3 02 Mar 2009 12:35
    Peef
    Poziom 14  

    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)?

    0
  • #4 02 Mar 2009 18:10
    adamwesola
    Poziom 24  

    Mogę Ci podesłać obsługę lcd w asm: 8-mio bitowe sterowanie ze sprawdzaniem BF (zamiast opóźnień) , prosta i niezawodna.

    0
  • #5 02 Mar 2009 21:04
    kaktus_c++
    Poziom 18  

    adamwesola : zamiast "podsyłać" może po prostu zamieść załącznik, może inni też skorzystają.

    0
  • #6 03 Mar 2009 00:14
    Peef
    Poziom 14  

    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?

    0
  • #7 03 Mar 2009 00:16
    SciroWroc
    Poziom 13  

    - sprawdź czy przy lcd jest uruchamiane w trybie z 2 liniami
    - sprawdź adres pola w drugiej linii (40)

    0
  • #8 03 Mar 2009 08:08
    adamwesola
    Poziom 24  

    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)

    Code:
    ; 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

    0
  • #9 03 Mar 2009 13:37
    Peef
    Poziom 14  

    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?

    0