Reduzierter Zeichensatz für LCD 5110

Hallo miteinander,

ich hänge mal wieder >:( Für ein wenig Speicherreduktion versuche ich, den Zeichensatz für das 5110 LCD auszudünnen.

Ich verwende dazu die Lib von Rinky-Dink.

Erst mal alles bis auf den Small-Font und die Big-Numbers rausgeworfen, läuft. Jetzt scheitere ich daran, auch noch den Small-Font auszudünnen. Ich habe mal versucht nachzuvollziehen, was da genau passiert, aber ich komm nicht dahinter. Amateur halt :confused:

Beispiel:

fontdatatype SmallFont[] PROGMEM =
{
0x06, 0x08, 0x20, 0x5f,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,   // sp
0x00, 0x00, 0x00, 0x2f, 0x00, 0x00,   // !
0x00, 0x00, 0x07, 0x00, 0x07, 0x00,   // "
0x00, 0x14, 0x7f, 0x14, 0x7f, 0x14,   // #
0x00, 0x00, 0x41, 0x7F, 0x41, 0x00,   // I
};

Zeichen bis zur Raute funktionieren bei der Ausgabe, das große "I" nicht mehr. Hat das was mit Speicherorganisation zu tun oder Indexierung oder oder ???

Sachdienliche Hinweise sind wie immer willkommen.

Die ASCII Nummer eines Zeichens entspricht dem Index im Array Plus 32. Weil das Leerzeichen #32 im ASCII Zeichensatz ist und die Steuerzeichen davor hier nicht enthalten sind. Also Leerzeichen hat ASCII Code 32 und Index 0. Entsprechend muss normal z.B. ‘0’ auf Index 16 stehen (48 - 32) oder ‘a’ auf Index 63 (95 - 32).

Wenn du jetzt Zeichen dazwischen entfernst musst du in der Ausgabe Routine der Library diesen Offset anpassen. Normal wird da einfach vom Zeichen 32 abgezogen um auf den Index im Array zu kommen. Man kann aber auch sowas in der Art machen:

if (c >= ' ' && c <= '#)
{
}
else if (c >= '0' && c <= '9)
{
}
else if (c >= 'A' && c <= 'Z)
{
}
else if (c >= 'a' && c <= 'z')
{
}

Und dann den Offset für jeden Bereich so anpassen so das die Umrechnung vom ASCII Code auf den Array Index überall stimmt

Das muss aber eben in der Library selbst geschehen. Nicht in deinem externen Code. An dieser Stelle in _print_char():

int font_idx = ((c - cfont.offset)*(cfont.x_size*(cfont.y_size/8)))+4;

cfont.offset ist dabei das 0x20 (Dezimal 32) was bei dir am Anfang im Font Array steht. Allerdings ist der Code dann nicht mehr für alle Fonts gleich. Die reinen Zahlen Fonts haben z.B. einen anderen Offset. Aber wenn du nur den SmallFont willst, geht es. Man könnte das auch nur machen wenn der Offset 0x20 ist. Dann müssten nur alle kompletten Fonts gleich strukturiert sein und die kleineren Zahlen Fonts gehen noch für sich

Und wenn du schon dabei bist, kannst du das gleich aus der for-Schleife raus tun und nach oben schieben :stuck_out_tongue: Das ändert sich nämlich nie wenn ich das richtig sehe

Gut erklärt - danke (und Karma + :) )

Ich versuch mich da mal durchzuwurschteln, wenn ich weiter hänge frag ich noch mal frech nach.

So, hab mal einen ganz wüsten Ansatz gewählt: einfach meine Wunschbuchstaben aus dem Originalarray genommen, in das Zielarray kopiert und dann im Code die dem Index entsprechenden Zeichen geschickt.

Funktioniert :grin:

Sicher nicht die eleganteste Art, aber mein Ziel ist erreicht.

Dass da einfach die ASCII-Tabelle geführt ist habe ich nicht umrissen - jetzt isses klar.

Danke nochmal!

So, hab mal einen ganz wüsten Ansatz gewählt: einfach meine Wunschbuchstaben aus dem Originalarray genommen, in das Zielarray kopiert und dann im Code die dem Index entsprechenden Zeichen geschickt.

Das hätte ich auch fast vorgeschlagen (oder ich habe dich falsch verstanden. Kann auch sein). Allerdings musst du dann immer diesen Umweg nehmen und kannst keine String Literale direkt senden. Und die Funktionen um Zahlen direkt zu drucken kann man auch nicht mehr nehmen.

Klar schränkt das ein, aber es geht hier um kurzen statischen Hinweistext, da ist das unproblematisch.

Der eigentliche Messwert wird in großen Zahlen angezeigt, funktioniert prima.

Der Font hat also nur noch big Numbers und die nötigen Codes für meine fixen Zeichen. Und flott Speicher gespart :sunglasses: