Displayposition angeben

Gast #129877
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
Gast #129883
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
Gast #129886
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
Gast #129887
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...
Gast #129890
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
Gast #129891
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren