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

Jak wyświetlić tekst w drugiej linii LCD DSM51 w asemblerze?

ciomateusz 04 Kwi 2007 21:38 3012 12
REKLAMA
  • #1 3753179
    ciomateusz
    Poziom 14  
    Posty: 144
    Ocena: 7
    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
  • REKLAMA
  • Pomocny post
    #2 3756328
    tprzemko
    Poziom 22  
    Posty: 413
    Pomógł: 54
    Ocena: 21
    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
    
    MOV LDI A,#80H     ; 0H+80H
    ACALL WRITE
    

    chcąc w drugiej
    
    MOV LDI A,#C0H     ; 40H+80H
    ACALL WRITE
    

    Po co to 80h odsyłam do instrukcji sterownika HD44780
    Pozdrawiam
  • REKLAMA
  • #3 3756840
    ciomateusz
    Poziom 14  
    Posty: 144
    Ocena: 7
    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
    #4 3757143
    starob
    Poziom 29  
    Posty: 1088
    Pomógł: 128
    Ocena: 137
    tprzemko napisał:
    Witam
    
    MOV LDI A,#80H     ; 0H+80H
    ACALL WRITE
    


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



    Przecierz to 8051. LDI - co to jest?
    
    MOV A,#C0H     ; 40H+80H
    ACALL WRITE
    
  • #5 3759141
    ciomateusz
    Poziom 14  
    Posty: 144
    Ocena: 7
    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
    #6 3759212
    tprzemko
    Poziom 22  
    Posty: 413
    Pomógł: 54
    Ocena: 21
    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

    
    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 
    
  • REKLAMA
  • #7 3759634
    ciomateusz
    Poziom 14  
    Posty: 144
    Ocena: 7
    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
  • REKLAMA
  • Pomocny post
    #8 3760317
    tprzemko
    Poziom 22  
    Posty: 413
    Pomógł: 54
    Ocena: 21
    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
  • #9 3760483
    ciomateusz
    Poziom 14  
    Posty: 144
    Ocena: 7
    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:
    
    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
    #10 3760720
    tprzemko
    Poziom 22  
    Posty: 413
    Pomógł: 54
    Ocena: 21
    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
  • #11 3760998
    ciomateusz
    Poziom 14  
    Posty: 144
    Ocena: 7
    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
    #12 3762240
    tprzemko
    Poziom 22  
    Posty: 413
    Pomógł: 54
    Ocena: 21
    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
  • #13 3763040
    ciomateusz
    Poziom 14  
    Posty: 144
    Ocena: 7
    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

Podsumowanie tematu

✨ Dyskusja dotyczy wyświetlania tekstu na drugiej linii wyświetlacza LCD sterowanego przez mikrokontroler DSM51 w asemblerze, z cykliczną zamianą tekstów między liniami co sekundę. Kluczowym zagadnieniem jest ustawienie odpowiedniego adresu DDRAM wyświetlacza HD44780, który wymaga dodania wartości 80H do adresu początku linii: 00H dla pierwszej i 40H dla drugiej linii. Poprawne wpisanie polecenia MOV A,#C0H (80H+40H) przed wysłaniem tekstu umożliwia wyświetlenie na drugiej linii. Problem z błędami składniowymi wynikał z użycia nieistniejącej instrukcji LDI zamiast MOV. Kolejnym aspektem było zapobieganie kasowaniu pierwszej linii podczas wyświetlania tekstu na drugiej, co wynikało z niepotrzebnego czyszczenia ekranu po wpisaniu tekstu. Adresowanie niewidocznych znaków po lewej stronie ekranu wymagało uwzględnienia ich przesunięcia względem pierwszego widocznego znaku (np. 17 znak w linii ma adres 11H dla pierwszej linii i 51H dla drugiej, do których dodaje się 80H). Do animacji tekstu wjeżdżającego z lewej strony stosuje się przesuwanie kursora instrukcją 1CH (odwrotność 18H). Wskazano również, że adres pierwszego niewidocznego znaku po lewej stronie pierwszej linii to 3FH, a zatem do ustawienia kursora należy dodać 80H, co daje BFH. Ostatecznie poprawne adresowanie i sterowanie kursorem pozwala na płynne wyświetlanie i animację tekstu na obu liniach LCD bez kasowania zawartości.
Wygenerowane przez model językowy.
REKLAMA