Forum: Mikrocontroller und Digitale Elektronik Mikrocontroller


von Adnane E. (simsim)


Lesenswert?

Hallo Leute,
Möchte einen Graphik display mit dem ATmega32 steuern! Das Display hat
aber kein integrierter Zeichensatz, also hab ich in einer header Datei
die gesamte Ascii tabelle gegeben!
Meine Frage ist: wie kann ich kann ich jetzt ein zeichen oder satz auf
dem Display ausgeben????
ich programmiere in C!!!
Danke

von Karl H. (kbuchegg)


Lesenswert?

Indem Du Dir aus der Doku raussuchst, wie Du auf dem Display ein
einzelnes Pixel setzen kannst. Danach schreibst Du eine Funktion die
ein einzelnes Zeichen ausgibt. Die wird in deine 'ASCII-Tabelle'
(wie auch immer die aussehen mag) reingehen und aus den dort
vorhandenen Informationen raussuchen, welche Pixel (relativ zu
einer bestimmten Bildschirmposition) gesetzt werden muessen.
Wie man einzelne Pixel setzt weist Du ja schon.
Hast Du diese Funktion, schreibst Du eine weitere Funktion, die
einen kompletten String entgegennimmt und diesen Zeichen fuer
Zeichen mit der vorhergehenden Funktion ausgibt.

Wenn Dir das als Auskunft nicht reicht, dann musst Du schon
genauer werden:
 * Kannst Du ein einzelnes Pixel setzen oder nicht. Sprich: Hast
   Du bereits eine Funktion dafuer?
 * Wie ist der exakte Aufbau der Zeichensatztabelle?
 * Wo genau hast Du Schwierigkeiten

von Michael (Gast)


Lesenswert?

Einzelne Pixel zu setzen funktioniert, wird aber in der Geschwindigkeit
keinen berauschen.
Besser ist es byte-weise den Garfikspeicher zu beschreiben; dabei ist
zu beachten, ob aufsteigende Bytes von links nach rechts, von oben nach
unten, oder aber auch genau anders herum im Controller angeordnet sind.
In der Regel paßt ein Zeichen nicht auf Byte-Grenzen, sodaß auch noch
die auszugebende Zeile oder Spalte rotiert und auf zwei Byte verteilt
werden muß. Nebeneinander, untereinander, vorwärts, rückwärts, ....
Ein Blatt Papier nehmen, nachdenken und fleißig sein :-)

von Karl H. (kbuchegg)


Lesenswert?

> Einzelne Pixel zu setzen funktioniert, wird aber in der
> Geschwindigkeit keinen berauschen.

Meine volle Zustimmung.
Allerdings gibt es ein Sprichwort: Mach's zuerst korrekt
und dann erst schnell. Ein schnelles Programm das nicht
funktioniert, hat keinen Wert.

von Adnane E. (simsim)


Lesenswert?

Hallo Karl,
ich hab noch keine Funktion, die einzelne Pixel setzt!!! Wie soll das
funktionieren bitte??
hier ist ein Abschnitt zu meiner ASCII deklaration:

unsigned char Zeichensatz[128][5];

//Zahlen
Zeichensatz[48][0]=0b01111100;  //0
Zeichensatz[48][1]=0b10100010;
Zeichensatz[48][2]=0b10010010;
Zeichensatz[48][3]=0b10001010;
Zeichensatz[48][4]=0b01111100;
......//für weiter zeichen und Zahlen

dieser Deklaration habe ich in einer Header Datei und dann zum .c
Programm zugefügt!!
Um genauer zu sein, weiss nicht wie soll ich jetzt zum Beispiel eine 0
auf meinem Display raus geben :-(( Bin ganz ganz neu in diesem Bereich
Danke

von Karl H. (kbuchegg)


Lesenswert?

> ich hab noch keine Funktion, die einzelne Pixel setzt!!!
> Wie soll das funktionieren bitte??

Dann wirds Zeit das Datenblatt zum Display zu studieren.

von Adnane E. (simsim)


Lesenswert?

Hi Karl,
das Display ist schon initialisiert, geht schon an und aus
softwaremässig. Ich kann dadrin auch shcon 1 und 0 über die
Datenleitungen schreiben. Weiss jetzt aber nicht wie ist das mit den
Buchstaben und Sätze...... Ist überhaupt meine Zeichensatzdeklaration
richtig??
Danke

von Karl H. (kbuchegg)


Lesenswert?

Dein Zeichensatz sieht schon mal nicht schlecht aus.

Also was ist nun: kannst Du gezielt ein Pixel setzen oder nicht?

von Adnane E. (simsim)


Lesenswert?

Karl,
hab vorhin schon gesagt, daß ich ganz ganz neu in diesem Bereich :-))
Also, wenn ich über die Datenports eine 1010 zum bsp. eingebe kann das
Display diese Daten schon lesen! Aber wie soll das für A, B, C.....und
Sätze funktionieren??
Danke

von The Daz (Gast)


Lesenswert?

simsim,

jedes display hat einen satz von Kommandos die mit Datenparametern
versehen als Einsen und Nullen ueber die Datenleitung gehen. Ohne
Datenblatt zum Display kannst du nicht wissen welche Kommandos/Daten du
senden musst, um auch nur einen einzigen Pixel zu setzen. Damit ist die
Aufgabe fuer dich nicht zu loesen. Es gibt keine allgemein gueltiges
Verhalten von LC Displays.

von Adnane E. (simsim)


Lesenswert?

Also Datenblatt zum Display habe ich schon und ich hab auch alles schon
initialisiert, funktioniert auch schon! De Frage ist nur wie man dann
Zeichen auf einem Display, der kein interiertes Zeichensatz besitzt,
ausgeben kann?? und wie kann ich auf die selber erstellte Zeichensatz
softwaremässig zugreifen??
Danke :-)

von Adnane E. (simsim)


Lesenswert?

Hallo Karl,
also einzelne Pixel kann ich auf jeden Fall schon setzen, hab gerade
nochmal geschaut!
Kannst du mir bitte nur erklären wie das dann für Zeichen(a, b,...)
über mein eigenen Zeichensatz oder für sätze zu schreiben
funktioniert??
Danke

von Black Friday (Gast)


Lesenswert?

Das ist auch von Display zu Display verschieden. Wie es jetzt genau bei
deinem Display geht, steht in deinem Datenblatt.
wie ist denn die Typenbezeichnung zu dem Display?

von Adnane E. (simsim)


Lesenswert?

das ist ein grphisches Display mit KS0108 kontroller! Er hat kein
integriertes Zeichensatz! Möchte nur den Prinzip zur Programmierung
verstehen!! Könntet Ihr mir bitte helfen?

von Karl H. (kbuchegg)


Lesenswert?

Das Prinzip ist, dass wenn Du ein 'A' ausgeben willst,
du dafuer sorgen musst, dass die entsprechenden Pixel
gesetzt werden.

In Deiner Zeichzensatztabelle stehen die entsprechenden
Pixel drin. Jedes Zeichen hat einen bestimmten Code (zb.
den ASCII Code, es gibt auch andere Codierungen aber meist
hat man es mit ASCII zu tun). Diesen Code kannst du als
Index in die Zeichensatztabelle nehmen und Dir da erst mal
die 5 Bytes rausholen in denen steht, welche Pixel gesetzt
werden muessen, damit du als Mensch diese Pixelansammlung als
'A' wahrnimmst. (Weder der µC noch das Display wissen irgendwas
von einem 'A'. Fuer die geht es nur darum Pixel gesetzt oder
nicht gesetzt.

zB. enthaelt deine Fonttabelle

Zeichensatz[48][0]=0b01111100;  //0
Zeichensatz[48][1]=0b10100010;
Zeichensatz[48][2]=0b10010010;
Zeichensatz[48][3]=0b10001010;
Zeichensatz[48][4]=0b01111100;

und 'zufaelligerweise' sollst Du nun genau das Zeichen '0' an
die LCD Position 12/15 ausgeben (12 ist die Spalte, 15 ist
die Zeile und wir vereinbaren, dass dort genau das linke obere
Eck des Zeichens zu liegen kommen soll)

Zeichensatz[48][0] und dort das rechteste Bit: das ist 0
also wird an 12/15 kein Pixel gesetzt
Zeichensatz[48][1] und dort das rechteste Bit: das ist 0
also wird an 13/15 kein Pixel gesetzt
Zeichensatz[48][2] und dort das rechteste Bit: 0
also wird an 14/15 kein Pixel gesetzt
Zeichensatz[48][3] und dort das rechteste Bit: 0
also wird an 15/15 kein Pixel gesetzt
Zeichensatz[48][4] und dort das rechteste Bit: 0
also wird an 16/15 kein Pixel gesetzt

damit ist die erste Zeile abgearbeitet, weiter gehts zur naechsten
Zeile:
Zeichensatz[48][0] und dort das zweite bit von rechts: das ist 0
also wird an 12/16 kein Pixel gesetzt
Zeichensatz[48][1] und dort das zweite bit von rechts: das ist 1
also wird an 13/16 ein Pixel gesetzt
Zeichensatz[48][2] und dort das zweite bit von rechts: das ist 1
also wird an 14/16 ein Pixel gesetzt
Zeichensatz[48][3] und dort das zweite bit von rechts: das ist 1
also wird an 15/16 ein Pixel gesetzt
Zeichensatz[48][4] und dort das zweite bit von rechts: das ist 0
also wird an 16/16 kein Pixel gesetzt

Naechste Zeile
Zeichensatz[48][0] und dort das dritte bit von rechts: das ist 1
also wird an 12/17 ein Pixel gesetzt
Zeichensatz[48][1] und dort das dritte bit von rechts: das ist 0
also wird an 13/17 kein Pixel gesetzt

...

usw. usw. bis die 8.te Zeile ausgegeben worden ist.
(die kommt dann in die Pixel 12/22 bis 16/22)

(Jetzt musst Du das ganze nur noch in Schleifen verpacken. Schau
dir einfach mal die Zahlen genauer an und du wirst sehen wie
die Schleifen aussehen muessen).

Das ist zwar, wie bereits gesagt, ziemlich langsam es so zu machen,
funktioniert aber unter allen Umstaenden, solange Du nur
ein Pixel gezielt ein und ausschalten kannst.

Wenn Du's so hinkriegst, dann hast Du bereits verstanden wie's
geht und kannst Dich damit beschaeftigen das ganze schneller zu
machen.

von Adnane E. (simsim)


Lesenswert?

Danke Karl :-) Ich werd's versuchen, falls ich Probleme habe melde ich
mich nochmals!
bis dann

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.