www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Displayposition angeben


Autor: Avusgalaxy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi.

Ich habe ein 2x20 Display und einen Atmel 89C52. Ich schreibe in
Assembler und habe folgendes Problem:

Ich möchte ein Wort in das Display schreiben, aber nicht am Anfang des
Displays sondern ca. in der Mitte.

Wie kann ich die Cursor Position angeben?

Es würde zwar mit Leerzeichen gehen, aber da würde ich ein anderes Wort
überschreiben, und das darf nicht sein.

Zeile1:
 DB "     Atmel",0
Zeile2:
 DB "89C51",0 ; <-- dies sollte dann in der Mitte stehen, ohne

Auswirkung auf die anderen Wörter im Display.

Wie kann ich das realisieren?

Vielen Dank im voraus.

Avusgalaxy

Autor: Thomas K (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
http://www.geocities.com/dinceraydin/lcd/commands.htm

Set cursor position (DDRAM address)   x80+ addr

Autor: Avusgalaxy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja, aber wie kann ich die Cursor Position setzen?


Wie sieht das aus?

Autor: Thomas K (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du kannst schon Englisch, oder?

Autor: Avusgalaxy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Muss ich diesen Befehl dann einfach fünfmal oder so eingeben?

Move cursor one character right  20  14

Nicht besonders gut,leider, wäre aber dankbar wenn mir weiterhelfen
könntest

Autor: Avusgalaxy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ah, diesen hier:

Set cursor position (DDRAM address)   x80+ addr

Geht das so?
LCD_RAM         DATA 08h
MOV LCD_RAM,#81h

Steht es dann eins weiter rechts? Oder wie ist das gemeint?

Autor: Reinhard Biegel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi!

Nein, der Cursor steht dann nicht eins weiter rechts, sondern an der
Position 1. Bei 0x80 + 5 steht er an der Position 5. (Beachte: 1.
Stelle = Position 0 !).
Wahrschein mußt du noch mit einer Steuerleitung dem Display sagen, dass
es sich um einen Steuerbefehl handelt.

mfg
Reinhard

Autor: Avusgalaxy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vestehe, aber wie sieht der Befehl aus, damit das Wort 5 Zeichen weiter
rechts steht?

Autor: Avusgalaxy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und wo muß ich den Befehl hinschreiben?

Autor: Thorsten (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie schon erwähnt gibts den Befehl "Set DDRAM adress", der zugehörige
Befehlscode ist 128+position. Um nun an die 5. Stelle in der ersten
Zeile zu kommen, mußt du 128+5=133 an das LCD schicken. Analog geht das
mit der zweiten Zeile, du mußt nur die Adresse des ersten Zeichens in
der zweiten Zeile kennen. Angenommen die Adresse ist 21 und du möchtest
an die 11. Stelle der zweiten Zeile etwas schreiben, so ist der Wert
128+21+11=160 zu schicken. "Set DDRAM adress" bewirkt das Setzen des
Cursors an einer bestimmten Stelle, es wird nicht überschrieben. Aber
vorsicht, die Adresse des ersten Zeichens der zweiten Zeile muß nicht
21 sein, bei einem 4x16 Display z. B. ist sie 64. Im Zweifelsfall also
am besten mal ins Datenblatt  schauen oder einfach ausprobieren.

Gruß
Thorsten

Autor: Avusgalaxy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
INCLUDE 89c52.MC

; Konstanten-, Speicher- und Portbelegung
;---------------------------------------------------------------
StackP      DATA 0Dh        'Start Adresse des Stack Pointers

LCD_RAM         DATA 08h        'Ans LCD zu Sendende Byte
LCD_RS          EQU P3.0        'RS Leitung des LCD
LCD_RW          EQU P3.1        'RW Leitung des LCD
LCD_ENABLE      EQU P3.2        'Enable Leitung des LCD
LCD_DATEN      EQU P1          'Datenport des LCD
LCD_Zeile1      EQU !10000000    'Adresse der 1.Zeile,1.Stelle
LCD_Zeile2      EQU !11000000   'Adresse der 2.Zeile,1.Stelle
LCD_Clear       EQU !00000001   'Löscht die Anzeige (Adresse 00 =
10000000b, AutoIncrement)
LCD_homereturn  EQU !00000010   'Adresszähler auf 00h
LCD_Modus       EQU !00000110   'Betrieb Increment (ohne Shift)
LCD_on          EQU !00001100   'Display-Ausgabe An (Kein Coursor,
Kein Blinken)
LCD_links       EQU !00011100   'Bewegt Displayinhalt um 1 nach links
LCD_rechts      EQU !00011000    'Bewegt Displayinhalt um 1 nach
rechts
LCD_interface   EQU !00101000   'Betreibsmodus Interface (zwei Zeilen,
4Bit)
LCD_DDRAM       EQU !00100000  <------------------------------------

P1_tmp          DATA 0Ch        'Temp für Port 1 (LCD)

;Programmbeginn
;---------------------------------------------------------------
 MOV SP,#StackP                 'StackPointer verschieben
 JMP start                      'Sprung zum eigentlichten Anfang des
Programms
 INCLUDE wait.asm               'Einbindung der Wait Routinen
 INCLUDE lcd_4bit.asm           'Einbindung der LCD Routinen

start:
        CALL LCD_Init           'LC-Display Ansteuerung

        MOV LCD_RAM,#LCD_Interface
        CALL LCD_Befehl      'Sendet einen Befehl

        MOV LCD_RAM,#LCD_on    'Aktivierung der Anzeige
    CALL LCD_Befehl

    MOV LCD_DDRAM,#133d  <------------------------------------

    MOV LCD_RAM,#LCD_Zeile1 'Sprung zur ersten Stelle der ersten Zeile
    CALL LCD_Befehl      'Sendet einen Befehl
    MOV DPTR,#Zeile1    'Aufruf des Strings Zeile1
    CALL LCD_prints      'Schreiben eines Strings

    MOV LCD_RAM,#LCD_Zeile2 'Sprung zur ersten Stelle der zweiten
Zeile
    CALL LCD_Befehl
    MOV DPTR,#Zeile2    'Aufruf des Strings Zeile2
    CALL LCD_prints      'Schreiben eines Strings


ende:
        CALL wait_1000000

        CALL LCD_Befehl
    JMP ende

Zeile1:
 DB "Stefan",0 ;Zeile1 (max. 40 Zeichen)
Zeile2:
 DB "Heute is Montag",0 ;Zeile2 (max. 40 Zeichen)


Ich habs jetzt so gemacht, aber es funktioniert nichts...

Autor: Andi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was sendest Du am Ende innerhalb der ende-Schleife eigentlich ständig an
das LCD?
Ich hoffe, Du weißt was Du tust!

Gruß
Andi

Autor: Avusgalaxy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nein Andi, ich weiß leider nicht was ich tue.

Das Programm habe ich nicht geschrieben. Weißt du, was ich umändern muß
,damit es funktioniert?

Ist das nicht gut, wenn er immer sendet?

Autor: Andi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Na ja, als erstes würde ich die beiden CALL´s zwischen ende: und und JMP
ende rausschmeißen so dass das so aussieht:

 ende:
       JMP ende

Als nächstes folgenden Befehl

   MOV LCD_RAM,#LCD_Zeile1 'Sprung zur ersten Stelle der ersten Zeile

ändern in

   MOV LCD_RAM,#LCD_Zeile1+4 'Sprung zur fünften Stelle der ersten
Zeile

Dadurch wird der Cursor an Position 4 (fünfte Stelle von links) in der
2. Zeile gesetzt.

Wenn der Text in der ersten Zeile geänder werden soll dann änder es
dafür entsprechend ab.

Ansonsten schau erst mal, das Du mit dem Befehlssatz des 8051 klar
kommst sonnst hat das ganze wenig Sinn.

Gruß
Andi

Autor: Avusgalaxy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke Andy, normal sieht das Ende so aus:
Dann verstehst du warum

ende:
        CALL wait_1000000
        MOV LCD_RAM,#LCD_links  'Bewegt den Text nach links
        CALL LCD_Befehl
    JMP ende


ich habe es einfah nicht mehr abgeändert


Tausend Dank

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.