Hallo, versuche eine ganze Weile schon mein LCD 161 auszulesen. Und zwar geht es darum, Zeichen in das LCD Display zu schreiben und zu einem anderen Zeitpunkt wieder auszulesen. Das Ganze soll in Assembler für den AT89S51 geschrieben sein. Ich habe mir selbst eine kleine Bibliothek für das LCD geschrieben und kann prima schreiben, Cursor setzen, etc. aber schon beim Auslesen der RAM Adresse mit der Busy-Auslese Routine bekomme ich zwar Busy low aber stets die Adresse 00h. Beim Auslesen mittels RW=1,RS=1 bekomme ich nur Blödsinn. Ich teste in dem ich in die 1. Zeile einen Text schreibe, der Cursor wieder nach Home setze, den 1ten Buchstaben "A" versuche zu lesen, dann das RAM auf die 2te Zeile setze und den gelesenen Buchstaben wieder schreiben. Das Programm gibt den Text aus, und schreibt in die 2te Zeile Blödsinn. Habe meine LCD-Anzeige-Routine angehängt. Das Hauptprogramm ist eigentlich ganz einfach: Die wesentlichen Zeilen: acall LCD_init ; Initialisieren mov DPTR,#Text1 ; Text zum Ausgeben acall LCD_prints ; Ausgabe mit 0-Erkennung acall LCD_busy ; ACtr abfragen acall LCD_printbd ; dezimal ausgeben (immer 000) mov a,#80h ; Home acall LCD_com acall LCD_read_data ; lese DRAM mov r1,a mov a,#C0 ; 2te Zeile acall LCD_com mov a,r1 ; hole Zeichen nach Acc acall LCD_printc ; gib Zeichen aus #include (LCD_Anzeige.inc) Kann jemand helfen?? mfG Werner
Hallo, habe ein ähnliches Problem, möchte den ungenutzten DD-RAM oder CG-RAM als Puffer nutzen... Wäre schön, wenn hier jemand was schreiben könnte... MfG Holger
Naja! Vllt. hilft dir das Weiter Allerdings in 4-Bit Mode. Die Routine liest erst das Highnibble und danach das Lownibble und wird zum Schluss wieder richtig zu einem Datenbyte verknüpft. Auf Busy hab ich verzichtet, weil es nicht Funktionierte und auch Blödsinn raus kam. Deshalb ne Verzögerung von 4ms. ; ------------------------------------------------------------- ; LCD_GetChar ; ------------------------------------------------------------- ; Beschreibung: Liest ein Zeichen von der aktuellen Cursor Position ; LCD_buffer enthält empfangens Zeichen ; ------------------------------------------------------------- $Region "Ein Zeichen aus dem LCD auslesen" LCD_GetChar: MOV LCD_Port,#00111111b CALL LCD_Pause_4ms SETB LCD_EN MOV A,LCD_Port SWAP A ANL A,#0F0h CLR LCD_EN MOV LCD_buffer,A NOP SETB LCD_EN MOV A,LCD_Port ANL A,#0Fh CLR LCD_EN ORL LCD_buffer,A CLR LCD_RW CLR LCD_RS RET MfG Klaus
Ich wuerd mir das Lesen sparen. Denn dann muss man das Busy auswerten. Viel einfacher ist es nur zu schreiben, und zwar timerbasiert.
Ich spar's mir auch, im Gegenteil, ich spendiere dem LCD meist noch einen Bildschirmspeicher im AVR-SRAM. Das macht die Printroutinen des Programms schneller, da nur ins SRAM geschrieben wird, anstatt für jedes Byte auf das LCD zu warten. Der Inhalt des Bildschirmspeichers wird dann timersynchronisiert byteweise an das LCD geschaufelt. Die Nutzung des (unsichtbaren) DD- und CG-RAM als zusätzlichen Speicher für den AVR habe ich noch nicht ausprobiert, das wäre mir auch aufgrund des relativ langsamen LCD-Zugriffs zu langsam. Bisher hat mir der SRAM der kleineren AVRs auch immer gereicht. Bzw. der SRAM war für gewisse RAM-intensive Projekte (wie PC-kompatible SD-Card, Logger) so arg zu klein, dass auch der LCD-RAM nicht weitergeholfen hätte. ...
Guten Tag Klaus, Deine Routine deckt sich eigentlich mit meiner Routine mit Ausnahme der Zeitverzögerung. Nun habe ich mit der Busy-Abfrage (nach Tagelangem ändern, hab ich jetzt die Lösung gefunden) keine Probleme mehr und die Abfrage gibt mittlerweile auch die Adresse des Cursor mit aus. Trotzdem klappt die "Ausleserei" immer noch nicht. Als Anhang habe ich die geänderte und bzgl Busy jetzt funktionierende LCD_Anzeige.inc angehängt. Ich kriege beim Lesen auch was raus, aber einfach nicht das richtige Zeichen. Vielleicht kann doch noch jemand weiterhelfen. mfG Werner
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.