Forum: Mikrocontroller und Digitale Elektronik Mit 8051 auf Display schreiben


von Mr Gast (Gast)


Lesenswert?

Hallo,

ich versuche gerade über Memory Mapped(8-Bit Interface), also vom 8051er 
ausgesehn, das Display wie einen externen RAM zu benutzen, Glue Logic 
halt.

Die IDE ist Keil und Programmiersprache C.

Hier mein bisheriger Code: http://pastebin.com/0Rx7XX5Y

Also Text auf dem Display ausgeben funktioniert schonmal.

Ein Tabulator ist 4 Charakters lang, d.h. 1-4, 4-8 etc.

Wenn ich schreibe: printf("hallo\t"); dann werden ja die Zeichen einzeln 
in putChar(http://www.keil.com/support/man/docs/c51/c51_putchar.htm) 
eingelesen und aufs Display ausgegeben. Wenn aber nach dem 'o'(das wäre 
jetzt der 5te character) ein \t kommt, also ein tabulator muss ich den 
cursor auf stelle 8 setzen, weil nach dem o rausschreiben der Cursor auf 
Position 5 ist und 5 ist zwischen 4 und 8.

Wie verschiebe ich nun den Cursor dahin?
Wie muss ich das bei \n machen und bei \b(display löschen)?

Sorry leute, aber ich stehe da vollkommen an irgendwie. Auch wenn ich 
mir eine deutsche Beschreibung von dem Display 8-Bit interface und die 
ganzen instructions des Displays durchlese komme ich nicht weiter.

Also ich vermute mal ich muss die Funktion gotoXY verwenden, aber wie 
soll ich die schreiben, ich brauche da bitte ein bisschen Hilfe. Ich 
denke an der Programmiersprache C dürfte es nicht wirklich scheitern. 
Ich kenn mich wie gesagt mit der Hardware nicht aus und auch wenn ich 
mir die Beschreibung durchlese stehe ich an, darum bitte ich hier um 
Hilfe.



-----

Folgende Infos zum Aufbau des Displays etc. habe ich mir notiert:

LCD_GotoXY(Eingabeparameter X, Eingabeparameter Y)
=> Aufruf IR mit SetDDRAM ADDR

setzt den Cursor in eine Zeile und eine Spalte!

für x geht 0-19 oder 1...20  Pos auf der Zeile
für Y geht 0-3  oder 1...4   Zeilen


1.Zeile: 0 - 19   dez
2.Zeile: 64 - 83  dez
3.Zeile: 20 - 39  dez
4.Zeile: 84 - 103 dez

Im H-File für das Unterprogramm LCD_CursorPos(X,Y)

=> #define LCD_LINE_LENGTH 20
   #define LCD_ADDR_LINE1   0
   #define LCD_ADDR_LINE2  0x40
   #define LCD_ADDR_LINE3  (LCD_ADDR_LINE1 + LCD_LINE_LENGTH)
   #define LCD_ADDR_LINE4  (LCD_ADDR_LINE2 + LCD_LINE_LENGTH)


Für das Cursor setzen!

char La[]={LA1,LA2,LA3,LA4}   =   ARRAY

La...jeweils Startwerte der 4 Zeilen

Vorteile des Arrays:
braucht keine Abfragen

damit man das in den Code-Speicher schreiben kann muss man const davor 
schreiben!

z.B.: const char j[] = {La1,La2,La3,La4}

geht aber mit einem if oder switch auch.

------

Ich verstehe nicht, was dieses const char j[] = {La1,La2,La3,La4} 
bringen soll.

Und man kann es auch mit if und switch machen? Was ist damit gemeint in 
Bezug auf was?


Bitte helft mir auf die Sprünge.

Danke!

mfg

Gast

von Mr Gast (Gast)


Lesenswert?

Sorry, hab das Datenblatt des Display vergessen:
http://pdf1.alldatasheet.com/datasheet-pdf/view/63673/HITACHI/HD44780.html

von Mr Gast (Gast)


Lesenswert?

Also naja falls jetzt so ein \t kommt, dann brauche ich ja die aktuelle 
Curser Position.

Wie bekomme ich die?

Durch lesen von CGRAM, DDRAM oder Adress Counter?

von ich (Gast)


Lesenswert?

Mr Gast schrieb:
> Also naja falls jetzt so ein \t kommt, dann brauche ich ja die aktuelle
> Curser Position.
>
> Wie bekomme ich die?

zähl doch einfach von anfang an, oder von jedem ClearScreen oder 
CursorHome konsequent mit.

von Mr Gast (Gast)


Lesenswert?

Ok danke, ich habs fast.

y ist im dem Fall die Zeile und x die Position.

Tabstops sind ja 0,4,8,12 etc.

Aber wenn ich jetzt schreib: "hallo\t". Wenn putChar versucht \t zu 
schreiben, gehts in die if rein und aktuell beträgt x dann 6 und wie 
soll ich das dann machen das erkennt wird das da 6 drinnen steht und das 
ich cursor dann um lines[y]+(x+z) verschieben muss. das z wäre jetzt 
z.B. die 2, aber wie finde ich den heraus wie viel ich noch zu einem 
Tabstop brauche?

hier der aktuelle code:

http://pastebin.com/CtsH6K20

von xfr (Gast)


Lesenswert?

Du willst also das hier?
1
Vorher Nachher
2
0      4
3
1      4
4
2      4
5
3      4
6
4      8
7
5      8
8
...    ...

Das geht mit:
1
nachher = vorher + 4 - (vorher % 4);

von Mr Gast (Gast)


Lesenswert?

Ok, danke aber wenn jetzt vorher = 2 ist:

nachher = vorher + 4 - (vorher % 4)

nachher = 6 -(rest von 2/4) so kanns ja nciht funktionieren?

Hab ich das falsch verstanden?

Ander Frage: Gibts eine 2. Möglichkeit wie ich das Problem lösen könnte?

von Peter D. (peda)


Lesenswert?

Mr Gast schrieb:
> Tabstops sind ja 0,4,8,12 etc.

Nö, die sind so, wie Du es im Editor eingestellt hast. Ansonsten ist der 
Standard 8.

Tabs braucht man aber nur bei der Eingabe per Tastatur. Will man auf 
einem LCD nur was anzeigen, braucht man sie nicht.
\b,\t,\n werden daher auf einem LCD nicht unterstützt.

Ein LCD in einem, Geräte funktioniert so. Man setzt den Kursor auf die 
gewünschte Position und gibt den Text aus. Kann der Text kürzer als der 
vorherige sein, füllt man mit Leerzeichen auf, damit alles überschrieben 
wird.

Eine ganz schlechte Idee ist es, das LCD zu löschen. Das ergibt ein 
deutliches Flackern, bis der neue Text wieder geschrieben wurde. Wäre 
ungefähr so, als wenn Dein PC-Bildschirm jedesmal komplett dunkel würde, 
sobald Du eine Taste drückst.


Peter

von Mr Gast (Gast)


Lesenswert?

Wenn ich Set DDRAM machen, setzt das den Cursor dann auch auf diese 
adresse?

Folgendes haben wir ja aufgeschrieben, das ich machen soll:

LCD_GotoXY(Eingabeparameter X, Eingabeparameter Y) => Aufruf IR mit 
SetDDRAM ADDR

das SetDDRAM was hat das mit gotoXY zu tun?

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.