Forum: Mikrocontroller und Digitale Elektronik DOGL128-6 von Font-Tabelle auf ASCII


von Chris (Gast)


Lesenswert?

Liebe Kollegen,

ich habe ein EA DOGL128-6 Display.

Da es keine Zeichentabelle enthält habe ich eine Zeichentabelle 
definiert:
1
// Font 6x8 Pixel.
2
const unsigned short Zeichen[] =
3
{
4
0x7C,0x12,0x11,0x12,0x7C,0x00,  // 'A' ASCII 65 (0x41);
5
0x7F,0x49,0x49,0x49,0x36,0x00,  // 'B' ASCII 66 (0x42);
6
0x3e,0x41,0x41,0x41,0x22,0x00   // 'C' ASCII 67 (0x43);
7
};

Ein 'A' beginnt also bei Index 0, ein 'B' bei Index 6 und ein 'C' bei 
Index 12.

Wie ist jetzt der Ansatz, wenn ich eine write, print, etc. Routine für 
das Display schreiben will.

write("AC");

Wie komme ich vom ASCII Zeichen nun auf meinen Index in der Tabelle? 
(Ich kann ja schlecht 127 if Abfragen schreiben, wie if ('A') then Index 
= 0; etc.)

Ich hoffe ich hab die Frage verständlich formuliert und freu mich 
Antworten und Denkanstöße,

lieben Gruß,
Chris

von Erich (Gast)


Lesenswert?

Deine Tabelle sollte bei Index 0 beginnen und 128 Zeichen haben.

Und beim Zugriff brauchste Multiplikation mit 6, wenn deine Zeichen 
jeweils 6 Byte umfassen.

von Harry L. (mysth)


Lesenswert?

1
// Font 6x8 Pixel.
2
const unsigned short Zeichen[][6] =
3
{
4
  {0x7C,0x12,0x11,0x12,0x7C,0x00},  // 'A' ASCII 65 (0x41)
5
  {0x7F,0x49,0x49,0x49,0x36,0x00},  // 'B' ASCII 66 (0x42)
6
  {0x3e,0x41,0x41,0x41,0x22,0x00}   // 'C' ASCII 67 (0x43)
7
};

: Bearbeitet durch User
von Chris (Gast)


Lesenswert?

Erich schrieb:

> Deine Tabelle sollte bei Index 0 beginnen und 128 Zeichen haben.
>
> Und beim Zugriff brauchste Multiplikation mit 6, wenn deine Zeichen
> jeweils 6 Byte umfassen.

Hallo Erich,

ah, das klingt logisch. Jedes ASCII Zeichen dann mit "Index = 'A' * 6;" 
errechnen. Danke für den Tipp!

von Chris (Gast)


Lesenswert?

Harry L. schrieb:
> // Font 6x8 Pixel.
> const unsigned short Zeichen[][6] =
> {
>   {0x7C,0x12,0x11,0x12,0x7C,0x00},  // 'A' ASCII 65 (0x41)
>   {0x7F,0x49,0x49,0x49,0x36,0x00},  // 'B' ASCII 66 (0x42)
>   {0x3e,0x41,0x41,0x41,0x22,0x00}   // 'C' ASCII 67 (0x43)
> };

Kannst mir erklären, welchen Vorteil dieses Array für die Font-Tabelle 
hat? Blicke da jetzt nicht durch.

von Harry L. (mysth)


Lesenswert?

Chris schrieb:
> Erich schrieb:
>
>> Deine Tabelle sollte bei Index 0 beginnen und 128 Zeichen haben.
>>
>> Und beim Zugriff brauchste Multiplikation mit 6, wenn deine Zeichen
>> jeweils 6 Byte umfassen.
>
> Hallo Erich,
>
> ah, das klingt logisch. Jedes ASCII Zeichen dann mit "Index = 'A' * 6;"
> errechnen. Danke für den Tipp!

Ich habs dir doch vorgekaut:
Beitrag "Re: DOGL128-6 von Font-Tabelle auf ASCII"

Nimm nen 2-dimensionales Array und fertig!
Überlas doch dem Compiler das Rechnen!

von Harry L. (mysth)


Lesenswert?

Chris schrieb:
> Kannst mir erklären, welchen Vorteil dieses Array für die Font-Tabelle
> hat? Blicke da jetzt nicht durch.

Der Zugriff auf den Buchstaben 'B' geht so:
1
  val = Zeichen[1][3];

Liefert den Wert des 4. Byte vom 2. Buchstaben.

: Bearbeitet durch User
von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Chris schrieb:
> Jedes ASCII Zeichen dann mit "Index = 'A' * 6;"
Mal abgesehen davon, dass die Formel für jedes ASCII-Teichen das selbe 
Ergebnis bringt, ist schon der Ansatz der Formel falsch. Mit ein wenig 
Nachrechnen kommst du da schnell drauf.

Chris schrieb:
> Kannst mir erklären, welchen Vorteil dieses Array für die Font-Tabelle
> hat? Blicke da jetzt nicht durch.
Es ist ein zweidimensionales Array: der erste Index gibt den Buchstaben 
an, der zweite Index ist ein einzelnes Byte dieses Buchstabens.

Wenn du dann ein Zeichen ausgeben willst, dann geht das etwa so:
1
const unsigned char Zeichen[][6] = ...(siehe 2D-Array oben)... ;
2
char auszugebendeszeichen;
3
:
4
:
5
// zum Test alle 3 Zeichen ausgeben
6
for (int j='A'; j<'C'); j++) {
7
   auszugebendeszeichen = j;
8
   for (int i = 0; i< 6 i++) {
9
      sendebyteandisplay(Zeichen[auszugebendeszeichen-'A'][i]);
10
   }
11
}

: Bearbeitet durch Moderator
von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Da übrigens das letzte Byte bei dir immer 0x00 ist, kannst du dir das 
sparen und die ganze Nummer als 5 Byte Array aufbauen. Die 0x00 
schreibst du in deiner Ausgangsroutine.

von Chris (Gast)


Lesenswert?

Lothar M. schrieb:

> Wenn du dann ein Zeichen ausgeben willst, dann geht das etwa so:

Das kann ich nachvollziehen, da wär ich nicht draufgekommen. Vielen Dank 
für Deine Mühe! Setz es gleich um :-)

von W.S. (Gast)


Lesenswert?

Chris schrieb:
> Da es keine Zeichentabelle enthält habe ich eine Zeichentabelle
> definiert

Hier in diesem Forum gibt es reichlich Beiträge, die sich mit den Themen 
Fonts und Grafik-Displays befassen. Selbst die "Lernbetty" hat vor etwa 
10 Jahren ein Grafik-LCD und Ausgabefunktionen nebst Fonts gehabt.

Du brauchst also nur etwas in diesem Forum zu suchen, um dir deine 
Fragen beantworten zu können und sehen zu können, wie sowas bereits von 
anderen gemacht wurde.

W.S.

von J. S. (jojos)


Lesenswert?

Hahaha, Code von W.S. ist gut, Adafruit und andere Libs sind böse.

von Chris (Gast)


Lesenswert?

W.S. schrieb:

Servus W.S.,

> Du brauchst also nur etwas in diesem Forum zu suchen, um dir deine
> Fragen beantworten zu können und sehen zu können, wie sowas bereits von
> anderen gemacht wurde.

ich hätte oben natürlich dazuschreiben müssen, dass ich seit Tagen mir 
die schon vorhandenen Libraries reingezogen habe. Leider habe ich keine 
zum Laufen gebracht und so manchen Code auch nicht verstanden.

Wollte keine unnötigen Fragen stellen, sorry.

von W.S. (Gast)


Angehängte Dateien:

Lesenswert?

Chris schrieb:
> ich hätte oben natürlich dazuschreiben müssen, dass ich seit Tagen mir
> die schon vorhandenen Libraries reingezogen habe. Leider habe ich keine
> zum Laufen gebracht und so manchen Code auch nicht verstanden.

Ich vermute mal, daß du mental auf dem falschen Dampfer bist. Wenn man 
vorhat, ein Grafikdisplay zu benutzen, dann ist es weitaus hilfreicher, 
zu lesen um die Prinzipien verstehen zu lernen als krampfhaft nach 
fertigen Libs zu suchen, die hoffentlich auf das eigene Vorhaben passen 
ohne daß es irgendwelcher Nacharbeiten bedarf. Entsprechendes gilt auch 
für alle anderen Vorhaben. Also verstehen lernen, damit man es dann 
selber kann.

Den Spruch jemandem einen Fisch zu geben versus ihn fischen zu lehren 
kennst du sicherlich.

Ich vermute mal, daß du zunächst vorhast, das Grafikdisplay als reines 
Textdisplay zu benutzen. Deshalb die Beschränkung auf einen Font mit 
durchgängig gleicher Zeichenbreite und -höhe.

Aber so ein Grafikdisplay kann weitaus mehr, so daß man recht bald zum 
einen Fonts verschiedener Größe und Aussehen und mit variabler 
Zeichenbreite als auch freie Positionierung der Zeichen auf dem Display 
haben will - selbst auf einem noch kleineren Display als deinem, siehe 
Bild von meiner Eigenbau-Lötstation. Dazu ist es aber erforderlich, daß 
du in der Lage bist, dir eigene Gedanken darüber zu machen, wie man so 
etwas macht.

W.S.

von Chris (Gast)


Angehängte Dateien:

Lesenswert?

W.S. schrieb:

Sehr schönes Bild. Informationen gut umgesetzt.

> Ich vermute mal, daß du zunächst vorhast, das Grafikdisplay als reines
> Textdisplay zu benutzen. Deshalb die Beschränkung auf einen Font mit
> durchgängig gleicher Zeichenbreite und -höhe.

Nein. Ich bau mir einen Joystick für eine selbstentwickelte Anwendung. 
Dazu sind im Display einigen Anzeigen notwendig. XYZ Koordinaten in 
größerer Schrift, Rahmen drum, gespeicherte Punkte, Schrittmotor 
Auflösung, etc. Will es also schon als Graphikanzeige nutzen.

Der Eindruck täuscht, dass ich nicht selbst in die Tiefe gehen will. Nur 
wenn eine Library schon fertig ist, warum nicht nutzen. Aber ich schaff 
das schon. Schließlich ist doch genau dafür dieses Forum da, um sich 
einen Gedankenanstoß zu holen, wenn ich beim alleine basteln wieder 
einmal in einer Sackgasse bin.

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.