Forum: Mikrocontroller und Digitale Elektronik Displayposition angeben


von Avusgalaxy (Gast)


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

von Thomas K (Gast)


Lesenswert?

http://www.geocities.com/dinceraydin/lcd/commands.htm

Set cursor position (DDRAM address)   x80+ addr

von Avusgalaxy (Gast)


Lesenswert?

ja, aber wie kann ich die Cursor Position setzen?


Wie sieht das aus?

von Thomas K (Gast)


Lesenswert?

Du kannst schon Englisch, oder?

von Avusgalaxy (Gast)


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

von Avusgalaxy (Gast)


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?

von Reinhard Biegel (Gast)


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

von Avusgalaxy (Gast)


Lesenswert?

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

von Avusgalaxy (Gast)


Lesenswert?

Und wo muß ich den Befehl hinschreiben?

von Thorsten (Gast)


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

von Avusgalaxy (Gast)


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...

von Andi (Gast)


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

von Avusgalaxy (Gast)


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?

von Andi (Gast)


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

von Avusgalaxy (Gast)


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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.