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

druga linia wyswietlacza LCD DSM51

04 Kwi 2007 21:38 2463 12
  • Poziom 14  
    Koledzy nie wiem jak wyswietlić napis w drugiej lini wyswietlacza lcd w dsm51 (asembler) (caly program ma na zmiane co sekunde zamieniac pierwsza linie z drugą) siedzialem nad tym troche i nie wiem jak wpisac tekst do drugiej lini. oto moje wypociny:
    LJMP START
    ORG 100H
    START:

    MOV R0,#LCDWC ;adres wpisu instrukcji
    MOV R1,#LCDRC ;adres odczytu stanu

    MOV A,#1 ;kasuj dane wy˜wietlacza
    LCALL WRITE

    MOV A,#0FH ;wˆĄcz wy˜wietlacz,kursor
    LCALL WRITE ;i mruganie kursora

    ; MOV A,#06H ;ustaw kierunek
    ; LCALL WRITE ;przesuwania si© kursora

    INC R0 ;adres wpisu danych
    MOV DPTR,#TEXT ;adres tekstu

    WRITE_TXT:
    CLR A ;pobranie kolejnego
    MOVC A,@A+DPTR ;znaku tekstu
    JZ TEXT_END ;bajt=0 - koniec tekstu

    ACALL WRITE ;wpisanie na wy˜wietlacz
    INC DPTR ;modyfikacja adresu
    ;pobrania kolejnego znaku
    SJMP WRITE_TXT ;pobierz kolejny znak

    TEXT_END:
    MOV A,#10
    LCALL DELAY_100MS
    MOV R0,#LCDWC ;adres wpisu instrukcji
    MOV R1,#LCDRC ;adres odczytu stanu

    MOV A,#1 ;kasuj dane wy˜wietlacza
    LCALL WRITE

    MOV A,#0FH ;wˆĄcz wy˜wietlacz,kursor
    LCALL WRITE ;i mruganie kursora

    ; MOV A,#06H ;ustaw kierunek
    ; ACALL WRITE ;przesuwania si© kursora

    INC R0 ;adres wpisu danych
    MOV DPTR,#TEXT2 ;adres tekstu

    WRITE_TXT2:
    CLR A ;pobranie kolejnego
    MOVC A,@A+DPTR ;znaku tekstu
    JZ KONIEC ;bajt=0 - koniec tekstu

    ACALL WRITE ;wpisanie na wy˜wietlacz
    INC DPTR ;modyfikacja adresu
    ;pobrania kolejnego znaku
    SJMP WRITE_TXT2 ;pobierz kolejny znak
    KONIEC:
    MOV A,#10
    LCALL DELAY_100MS
    LJMP START
    WRITE:
    MOV R2,A ;przechowanie danych
    BUSY:
    MOVX A,@R1 ;odczyt stanu
    JB ACC.7,BUSY ;oczekiwanie na BUSY=0
    MOV A,R2 ;odtworzenie danych
    MOVX @R0,A ;wysˆanie danych
    RET
    TEXT:
    DB 'TEKST 1'
    DB ' '
    DB 'tekst 2',0


    TEXT2:
    DB 'tekst 2'
    DB ' '
    DB 'TEKST 1',0

    aktualnie program dziala tylko ta opcja z spacjami raczej nie przejdzie na zaliczeniu prosze o jakąs pomoc
    pozdro
  • Pomocny post
    Poziom 22  
    Witam
    Wystarczy przed rozpoczęciem wypisywania tekstu podać mu gdzie ma zacząć pisać. W Twoim przypadku musimy wpisać to jeszcze przed INC R0. I tak pierwsza lina ma adres 00H a druga 40H.
    chcąc pisać w pierwszej piszemy
    Code:

    MOV LDI A,#80H     ; 0H+80H
    ACALL WRITE

    chcąc w drugiej
    Code:

    MOV LDI A,#C0H     ; 40H+80H
    ACALL WRITE

    Po co to 80h odsyłam do instrukcji sterownika HD44780
    Pozdrawiam
  • Poziom 14  
    dzięki kolego za wyjasnienia ale cos to nie chce chulac
    jak wkleje przed INC RO któryś z kodów co napisaleś wyskakuje błąd. jak bys mugl to wyjasnij mi to. pozdro
  • Pomocny post
    Poziom 26  
    tprzemko napisał:
    Witam
    Code:

    MOV LDI A,#80H     ; 0H+80H
    ACALL WRITE


    Code:

    MOV LDI A,#C0H     ; 40H+80H
    ACALL WRITE



    Przecierz to 8051. LDI - co to jest?
    Code:

    MOV A,#C0H     ; 40H+80H
    ACALL WRITE
  • Poziom 14  
    kolego Starob nadal ta 2 linia nie dziala - pierwsza linia jest w pozadku a jak dam C0H to wyskakuje błąd tak jak by ta wartość byla niewlasciwa. Jesli dam 80h to tekst sie wpisuje w pierwszej lini (tak jak bylo do tej pory) jak by ktos wiedzial co z tym adresem jest nie tak niech napisze dzięki pozdro
  • Pomocny post
    Poziom 22  
    Witam
    Oczywiście że nie ma LDI jestem teraz na etapie AVR-ków i troszkę pojechałem po bandzie :D. Niżej poprawiony kod który powinien zadziałać. Błąd był prawdopodobnie podczas interpretacji liczby Jeżeli liczba zaczyna się od litery to trzeba ją poprzedzić zerem.
    Pozdrawiam

    Code:

    LJMP START
    ORG 100H
    START:

    MOV    R0,#LCDWC       ;adres wpisu instrukcji
    MOV    R1,#LCDRC        ;adres odczytu stanu

    MOV    A,#1                  ;kasuj dane wy˜wietlacza
    LCALL WRITE

    MOV    A,#0FH               ;
    LCALL WRITE                 ;i mruganie kursora

    MOV    A,#80
    LCALL WRITE                 ;**tutaj adres pierwszej linii**

    INC     R0                      ;adres wpisu danych
    MOV    DPTR,#TEXT       ;adres tekstu

    WRITE_TXT:
    CLR     A                       ;pobranie kolejnego
    MOVC  A,@A+DPTR        ;znaku tekstu
    JZ       TEXT_END           ;bajt=0 - koniec tekstu

    ACALL WRITE                 ;wpisanie na wy˜wietlacz
    INC     DPTR                  ;modyfikacja adresu
                                         ;pobrania kolejnego znaku
    SJMP   WRITE_TXT          ;pobierz kolejny znak

    TEXT_END:
    MOV    A,#10
    LCALL  DELAY_100MS
    MOV    R0,#LCDWC        ;adres wpisu instrukcji
    MOV    R1,#LCDRC         ;adres odczytu stanu

    MOV    A,#1                   ;kasuj dane wy˜wietlacza
    LCALL WRITE

    MOV   A,#0FH                ;
    LCALL WRITE                 ;i mruganie kursora

    MOV   A,#0C0H              ;***ADRES DRUGIEJ LINII***
    LCALL WRITE

    INC     R0                      ;adres wpisu danych
    MOV    DPTR,#TEXT2      ;adres tekstu

    WRITE_TXT2:
    CLR     A                       ;pobranie kolejnego
    MOVC  A,@A+DPTR       ;znaku tekstu
    JZ        KONIEC             ;bajt=0 - koniec tekstu

    ACALL WRITE ;wpisanie na wy˜wietlacz
    INC DPTR ;modyfikacja adresu
    ;pobrania kolejnego znaku
    SJMP WRITE_TXT2 ;pobierz kolejny znak
    KONIEC:
    MOV A,#10
    LCALL DELAY_100MS
    LJMP START
    WRITE:
    MOV R2,A ;przechowanie danych
    BUSY:
    MOVX A,@R1 ;odczyt stanu
    JB ACC.7,BUSY ;oczekiwanie na BUSY=0
    MOV A,R2 ;odtworzenie danych
    MOVX @R0,A ;wysˆanie danych
    RET
    TEXT:
    DB 'TEKST 1'
    DB ' '
    DB 'tekst 2',0


    TEXT2:
    DB 'tekst 2'
    DB ' '
    DB 'TEKST 1',0
  • Poziom 14  
    dzięki kolego tylko pojawil mi sie następny problem mianowicie jak wyswietle cos na 1 lini i chcę wyswietlić drugi tekst na 2 lini to ten tekst z pierwszej lini sie kasuje. wiesz moze jak se z tym poradzić?

    Dodano po 4 [minuty]:

    jaki ja glupi jestem. Już wszystko dziala dzieki za pomoc. a nie wiesz jai adres ma pierwszy niewidoczny (17 znak) pierwszego wiersza??
    pozdro
  • Pomocny post
    Poziom 22  
    Witam
    Znaki znikają bo po wpisaniu tekstu dajesz komendę czyść ekran. Aby obliczyć adres znaku musisz dodać poprostu jego adres do adresu pierwszego znaku w linii. np:
    pierwsza linia 0+17 pierwszy niewidoczny - 11H
    druga linia 64+17 pierwszy nie widoczny - 51H
    Oczywiście aby poprawnie ustawić adres na wyświetlaczu musisz pamiętać coby dodać jeszcze do tak obliczonego adresu 80H.
    Pozdrawiam
  • Poziom 14  
    dzięki wielkie. Mam jeszcze jedno pytanie. Mam animacje (wjazd tekstu na ekran) jak zmienić zeby tekst wiechal z lewej strony?? Mam program napisany i tekst wjeżdza z prawej strony a chce zeby wjechal na ekran od lewej. Oto ten tekst:
    Code:

    LJMP   START
       ORG   100H

    START:
       MOV   R0,#LCDWC
       MOV   R1,#LCDRC
       MOV   R3, #14
       MOV   A,#1
       LCALL   WRITE
       MOV   A,#8EH
       LCALL   WRITE
       INC   R0
       MOV   DPTR,#TEXT

    WRITE_TXT:
       CLR   A
       MOVC   A,@A+DPTR
       JZ   TEXT_END
       ACALL   WRITE
       INC   DPTR
       SJMP   WRITE_TXT

    TEXT_END:
       DEC   R0

    LOOP:
       MOV   A,#5
       LCALL   DELAY_100MS
       MOV   A,#18H
       LCALL   WRITE
       DJNZ   R3, LOOP
       SJMP   $

    WRITE:
       MOV   R2,A

    BUSY:
       MOVX   A,@R1
       JB   ACC.7,BUSY
       MOV   A,R2 
       MOVX   @R0,A
       RET

    TEXT:
       DB   'HELLO!!!',0
  • Pomocny post
    Poziom 22  
    Witam
    Masz tutaj wszystko co Ci potrzebne.
    http://www.edw.com.pl/pdf/k09/23_01.pdf
    http://www.edw.com.pl/pdf/k09/24_07.pdf
    http://www.edw.com.pl/pdf/k09/25_10.pdf
    http://www.edw.com.pl/pdf/k09/27_01.pdf

    Możesz to zrobić w następujący sposób:

    1 - Ustawiasz adres na niewidoczny obszar z lewej strony
    2 - Wpisujesz tekst do wyświetlacza
    3 - przesuwasz w pętli to co chcesz wyświetlić

    Zresztą patrze to tak zrobiłeś :D
    W swoim programie dajesz instrukcję 18H odwrotna jest 1CH.

    Pozdrawiam
  • Poziom 14  
    kolego dzięki wielkie za pomoc. wlasnie o tą odwrotna instrukcje mi chodzilo. Pozdro tylko mam problem z tym adresem tekstu. skoro pierwsza komurka ma adres 80H to pierwsza niewidoczna powinna mieć 7FH lecz jesli dam 7FH tekst ucieka dzies daleko i widac tylko sam przesuwający sie kursor(a powinno być widać tekst bez pierwszej litery). czy coś robie nie tak?? dodam ze jesli dam np 81H to wszystko dziala (tekst zaczyna sie od drugiego znaku)
  • Pomocny post
    Poziom 22  
    Witam
    Nie odrobiłeś lekcji. Adres pierwszego widocznego znaku po inicjalizacji to 00H. Aby sterownik wiedział że podajesz mu adres pod który będziesz wpisywał dane ustawiasz najstarszy bit. Dlatego wcześniej napisałem 00+80.
    Jeśli pierwsza komórka drugiej linii ma adres 40H to pierwsza niewidoczna z lewej pierwszej linii ma 3FH. Wypadało by wpisać adres 3Fh+80H=BFH
    Pozdrawiam
  • Poziom 14  
    dzięki za pomoc juz wszystko dziala (trochu zle to robilem przecież pierwszy niewidoczny znak z lewej strony jest ostatnim niewidocznym znakiem prawej strony) jeszcze raz wielkie dzięki za pomoc i wesolych swiąt
    Pozdro