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

inicjalizacja LCD 2x20 hd44780 z 89s51

18 Mar 2009 19:13 2975 21
  • Poziom 15  
    Witam.
    od kilku dni usiłuję napisać program inicjalizujący LCD w taki sposób aby na wyświetlaczu migał kursor i zeby nic więcej nie robił. Chciałbym żeby był sterowany w trybie 8 bitowym. wyświetlacz jest podłączony do portu P0. linie sterujące są podłączone następująco:
    RS= P2.4
    R/W= p2.3
    E= p2.2
    czy ma ktoś na to jakiś prosty sposób?? dodam że po podłączeniu zasilania wszystkie pola pierwszego wiersza są pełne (to chyba oznacza złą inicjalizację). proszę o pomoc
  • Poziom 25  
    Przykładów na forum jest masa do tego:) Pokaż to co masz napisane do tej pory, będziemy poprawiać.
  • Poziom 15  
    Code:

    ;--------inicjalizacja_LCD--------------;

    rs   equ   p2.4
    rw   equ   p2.3
    e   equ   p2.2
    mov   p0,#0
    mov   p1,#0
    mov   p2,#0
    mov   p3,#0
    mov   p2,#00000011b
    setb   e
    nop
    clr   e

    mov   p0,#38H   ;function set
    setb   e
    nop
    clr   e
    mov   p0,#01H   ;kasuj dane wyświetlacza i ustaw kursor w poz 0
    setb   e
    nop
    clr   e
    mov   p0,#07H   ;entry mode set:inc adresa kursora
    setb   e
    nop   
    clr   e
    mov   p0,#0CH   ;włącz wyśw. wyłącz kursor i miganie
    setb   e
    nop   
    clr   e



    end


    Proszę stosować znaczniki [code] - poprawiłem.
    [zumek]
  • Poziom 25  
    Przed częścią "function set" dodaj pętle w ktorej 3 krotnie wysyłasz na port wyświetlacza wartość 0x3F (każde wysłanie tej wartość zakończ opóźnieniem, około 5ms).
  • Poziom 15  
    coś się dzieje na displeju, ale zadnych znaków nie widać.
  • Poziom 15  
    program wygląda na prawidłowy, ale u mnie nie chodzi. tak na marginesie... mam oscylator 12Mhz... czy to może być przyczyną??(nie prawidłowe czasy)
  • Poziom 37  
    Tak powinna wyglądać inicjacja (wg dokumentacji producenta hd44780):

    inicjalizacja LCD 2x20 hd44780 z 89s51
  • Poziom 15  
    Mam juz gotową płytkę z wyprowadzeniem portu p0. Czy nie da się jakoś zrobić zeby to zadziałało na porcie p0? Czy robić płytkę od nowa?
  • Poziom 37  
    Zastosuj rezystory podciągające na każdy pin portu.
  • Poziom 15  
    Jaką wartość powinny mieć te rezystory podciągające? I czy to przez to wyświetlacz nie działa jak należy?
  • Poziom 37  
    8x10k powinno wystarczyć. Jeśli nie masz podciągania, to na pewno nie zadziała lcd. Bład może być jeszcze w oprogramowaniu sterującym
  • Poziom 15  
    Błędu raczej nie ma bo sciagnąlem gotowy program z elektrody, pozmieniałem tylko etykiety pinów sterująjcych. Sprawdzę co się będzie działo po podłączeniu rezystorów i napiszę co się będzie działo.
  • Poziom 37  
    Inicjację masz na pewno nie taką, jaka zalecana.
    Zastosuj sie do rady Mat_91 lub zerknij na rysunek który w jakimś celu zamieściłem.
  • Poziom 15  
    wstawiłem rezystory podciągające(każdy pin podłączyłme przez rezystor 10k do 5V) i nic.
  • Poziom 25  
    No to teraz pozostaje szukać błędu w programie. Poprawiłeś funkcje? Pokaż jak to teraz wygląda, sprawdź jeszcze funkcje czasowe.
  • Poziom 15  
    tak to wygląda. mam oscylator 3,6MHz.
    Code:

    e   equ   p2.2
    rw   equ   p2.3
    rs   equ   p2.4


    ;-------inicjalizacja------------;

    lcall   DELAY_MM   
    SETB   E
    clr   rw
    clr   rs
    LCALL   DDE
    SETB   E
    NOP
    NOP

    mov   a,#00111111b
    mov   p0,a
    LCALL   DDE
    mov   r1,#50

    lcall   DELAY_Mm
    SETB   E
    NOP
    NOP
       
    mov   a,#00111111b
    mov   p0,a
    LCALL   DDE
    mov   r1,#15

    lcall   delay_mm
    SETB   E
    NOP
    NOP

    mov   a,#00111111b
    mov   p0,a
    LCALL   DDE
    mov   r1,#1
    lcall   delay_mm

    clr   p1.1
    setb   p1.0


    MOV   A,#00111110B
    MOV   P0,A
    LCALL   QQ
    MOV   A,#00001000B
    MOV   P0,A
    LCALL   QQ
    MOV   A,#00000001B
    MOV   P0,A
    LCALL   QQ
    MOV   A,#00000111B
    MOV   P0,A
    LCALL   QQ





    DDE:
    CLR   E
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    RET


    QQ:
    AA:
    JB   P0.7,AA
    RET





    DELAY_MM:
    MOV   R1,#100
    SKOK:
    DJNZ   R1,SKOK
    DJNZ   R2,SKOK
    RET





    END
  • Poziom 25  
    Krótko: haos :] Rozumiem że to:
    -lcall DELAY_MM
    -lcall DELAY_Mm
    -lcall delay_mm
    to wywołania jednej i tej samej funkcji DELAY_MM?

    Następnie:
    Code:
    mov   r1,#50
    

    lcall   DELAY_Mm

    Po co wpisujesz wartość do r1 skoro przy wywołaniu funkcji delay_mm i tak ją od razu zmieniasz?

    Code:
    mov   a,#00111111b
    
    mov   p0,a

    a- zmienna? nie prośniej poprostu "mov p0,#00111111b"?
    i poraz kolejny czemu raz piszesz "a" a innym razem "A"? Może sie czepiam (co jest możliwe gdyż nie pisałem nigdy nic na '51) ale większośc kompilatorów wywala błędy przy takim zapisie... jak deklarujesz zmienną jako "a" to tak jej też używaj, to samo tyczy sie nazw funkcji.
  • Poziom 15  
    myślałem ze wielkość liter nie ma znaczenia. A tak poza tym co jest z tym nie tak?? bo to nie działa.
    nie bardzo wiem czy dorze się posłużyłem linią zatwierdzająceą"E"
  • Pomocny post
    Poziom 24  
    Kolego kamilcendrowski, próbowałem uruchomić Twój program inicjalizacji lcd na symulatorze - nie ruszył z miejsca.
    Przeanalizuj (lub użyj) program który Ci posłałem, ten działa na pewno, nie wysyłam niesprawdzonego kitu by zdobyć punkty, bo mnie one nie interesują.
    I pamiętaj że P0 ma otwarte kolektory.
  • Poziom 15  
    adamwesola dziękuję ci bardzo. Wyświetlaczyk działa. Masz wiedzę. oczywiście pomógł