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
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
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?
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
Vestehe, aber wie sieht der Befehl aus, damit das Wort 5 Zeichen weiter rechts steht?
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
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...
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
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?
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.