Forum: Mikrocontroller und Digitale Elektronik Font Array auslesen?!


von Peter W. (Gast)


Lesenswert?

Hallo,

ich möchte gerne eine Funktion schreiben die mir mein Character aus dem 
Array zieht.

Wie berechne Ich denn nun den Start bzw. Anfang von meinem Zeichen?
1
https://github.com/johnmccombs/arduino-libraries/blob/master/glcd/fonts/Arial14.h

Würde mich über Anregungen freuen.

von Martin (Gast)


Lesenswert?

Es gibt ja einen Bereich in dem steht wie breit ein Zeichen ist (in 
words - 16 Bit). Du musst also die Beiten aller Zeichen die vor deinem 
gesuchten Zeichen im Array stehen aufsummieren.

von Peter W. (Gast)


Lesenswert?

Martin schrieb:
> Es gibt ja einen Bereich in dem steht wie breit ein Zeichen ist
> (in
> words - 16 Bit). Du musst also die Beiten aller Zeichen die vor deinem
> gesuchten Zeichen im Array stehen aufsummieren.

Und woher weiß Ich wie viele ich aufsummieren muss bis mein Zeichen 
kommt?

von Alex G. (dragongamer)


Lesenswert?

Peter W. schrieb:
> Und woher weiß Ich wie viele ich aufsummieren muss bis mein Zeichen
> kommt?
Du wirst ja wohl wissen wo das Zeichen steht, sonst könntest du es ja 
garnicht verwenden.

von dummschwaetzer (Gast)


Lesenswert?

>Es gibt ja einen Bereich in dem steht wie breit ein Zeichen ist (in
>words - 16 Bit). Du musst also die Beiten aller Zeichen die vor deinem
>gesuchten Zeichen im Array stehen aufsummieren.
+ die 6Byte für size .. + 96 Bytes für die char widths

von Martin (Gast)


Lesenswert?

Peter W. schrieb:
> Und woher weiß Ich wie viele ich aufsummieren muss bis mein Zeichen
> kommt?

Weißt du was ASCII ist? Jedes Zeichen entspricht einer Nummer.

von Martin (Gast)


Lesenswert?

Den Ofset musst du aber auch berücksichtigen, die Tabelle fängt erst 
beim Space (0x20) an.

von Martin (Gast)


Lesenswert?

bzw. noch ein Zeichen da nach.

von Peter W. (Gast)


Lesenswert?

Die Tabelle folgt doch gar nicht der ASCII Tabelle?

von Peter W. (Gast)


Lesenswert?

1
int main()
2
{
3
  printf("%d",Arial_14['0']);  
4
    return 0 ;
5
}

Wie bekomme ich das erste Byte von der '0'?

von Martin (Gast)


Lesenswert?

Peter W. schrieb:
> Die Tabelle folgt doch gar nicht der ASCII Tabelle?

Martin schrieb:
> Den Ofset musst du aber auch berücksichtigen, die Tabelle fängt erst
> beim Space (0x20) an.

von Martin (Gast)


Lesenswert?

Am Ende jeder Zeile steht der Code für das Zeichen in dezimaler 
Schreibweise.

von Peter W. (Gast)


Lesenswert?

Martin schrieb:
> Am Ende jeder Zeile steht der Code für das Zeichen in dezimaler
> Schreibweise.

Der Offset müsste 102 sein anstatt 96 oder nicht?

von Martin (Gast)


Lesenswert?

dummschwaetzer schrieb:
> + die 6Byte für size .. + 96 Bytes für die char widths

von Martin (Gast)


Lesenswert?

Ich meine aber noch was anderes. Das erste Zeichen ist nicht ASCII 0x00 
sondern 0x21 (33).

von Peter W. (Gast)


Lesenswert?

Martin schrieb:
> dummschwaetzer schrieb:
>> + die 6Byte für size .. + 96 Bytes für die char widths

Ah okay überlesen.
Nun wenn ich '0' + 102 rechne komme Ich immer noch nicht an den Anfang 
der Zahl '0' ich muss die breiten von den vorherigen Zahlen noch hinzu 
rechnen oder?

von Peter W. (Gast)


Lesenswert?

Oben steht es ja.

Wie stelle ich das an? Woher weiß Ich wie viel Ich aufsummieren muss? 
Stehe auf dem Schlauch.

von Martin (Gast)


Lesenswert?

Wie ist der ASCII von '0'?

von Dominik (Gast)


Lesenswert?

Martin schrieb:
> '0'

0x30

von Peter W. (Gast)


Lesenswert?

48

Martin schrieb:
> Wie ist der ASCII von '0'?

48

von Martin (Gast)


Lesenswert?

genau!

Das erste Zeichen in der Tabelle ist das Space  0x20  32. Wobei das 
Space eine Breite von 0 hat. Das nöchste Zeiche (0x21 / 33) ist das '!' 
. Das hat eine Breite von 1 Pixel.

// char widths
0x00, 0x01, 0x03, 0x08, 0x07, 0x0A, 0x08, 0x01, 0x03, 0x03,

// font data
0xFE, 0x14, // 33
0x1E, 0x00, 0x1E, 0x00, 0x00, 0x00, // 34

Beachte, da jedes Zeichen 14 Bit hoch ist benötigt jede Spalte 2 Byte. 
Jetzt musst du nur von 0x20 (32, Space) bis 0x30 (48, '0') zählen und 
die Werte unter "char widths" aufaddieren.

von Martin (Gast)


Lesenswert?

Das dann mal 2 wegen 2 Byte pro Spalte + den Offset von 102 Byte.

von Peter W. (Gast)


Lesenswert?

Und das aufsummieren?
1
int8_t calcFontStart(uint8_t c)
2
{
3
  int8_t start=c-32;
4
  for( ; start <= c ; start++)
5
  start += Arial_14[start+6];
6
  
7
  return start;
8
}

von Martin (Gast)


Lesenswert?

Da würfelst du was durcheinander.

Peter W. schrieb:
> start++

Peter W. schrieb:
> start +=

Und zum Schluß die 102 Byte nicht vergessen.

von Martin (Gast)


Lesenswert?

Und die 2 Byte pro Pixel Spalte auch nicht unterschlagen.

von Martin (Gast)


Lesenswert?

In dem Array stecken mehr als 256 Byte. Deswegen kommst du mit int8_t 
nicht aus.

Was hällst du von :
1
int16_t calcFontStart(uint8_t c)
2
{
3
  
4
  int16_t byte_nr = 102;
5
  for(uint8_t zeichen = 0 ; zeichen <= c - 32 ; zeichen++)
6
        byte_nr += Arial_14[zeichen + 6] * 2;
7
  
8
  return start;
9
}
Um das Variabel zu halten kannst du auch die 32 durch  Arial_14[4] 
ersetzen usw.

von Martin (Gast)


Lesenswert?

sorry
1
return byte_nr;

von Peter W. (Gast)


Lesenswert?

Ich müsste am besten wirklich eine Struktur anlegen oder?
Brauche ja noch noch die Breite für das Zeichen.

von Martin (Gast)


Lesenswert?

Könnte man machen. Ich denke der Übersichtlichkeit würde es was bringen. 
Verstanden hast du jetzt aber alles?

von Martin (Gast)


Lesenswert?

Du musst dann aber aufpassen, dass die Struktur auch auf andere Fonts / 
Fontgrößen angewendet werden kann.

von Peter W. (Gast)


Lesenswert?

Ich werde es mir gleich mal anschauen und versuchen was auszugeben.

von Peter W. (Gast)


Lesenswert?

Benötigt man noch was?
1
font_t calcFontStart(uint8_t c, font_t font)
2
{
3
  uint8_t charNum = 0;
4
  font.width = Arial_14[c+6];
5
  
6
    font.indexNum = 102;
7
    for(; charNum <= c - 32 ; charNum++)
8
  font.indexNum += Arial_14[charNum + 6] * 2;
9
  
10
    return font;
11
}
12
13
int main()
14
{
15
  font_t fontInfo = calcFontStart('0', fontInfo);
16
  
17
  printf("%d",fontInfo.indexNum);
18
    return 0 ;
19
}

von Peter W. (Gast)


Lesenswert?

Peter W. schrieb:
> font_t calcFontStart(uint8_t c, font_t font)
> {
>   uint8_t charNum = 0;
>   font.width = Arial_14[c+6];
>
>     font.indexNum = 102;
>     for(; charNum <= c - 32 ; charNum++)
>   font.indexNum += Arial_14[charNum + 6] * 2;
>
>     return font;
> }

Sicher das die Rechnung so richtig ist?

von Peter W. (Gast)


Lesenswert?

Wenn ich die Werte aufsummiere für den Anfang von '0'
komme ich auf 271.

Dort steht aber was anderes als die Pixel für '0'

von Peter W. (Gast)


Lesenswert?

Habe es jetzt hin bekommen.

Nur, irgendwie.. Fehlt immer eine Spalte von den Zahlen oder 
Buchstaben.. das sieht echt komisch aus...

von Peter W. (Gast)


Angehängte Dateien:

Lesenswert?

Hier mal das Foto.
Was kann das sein? Muss ja irgendwie was fehlen?

von Nico W. (nico_w)


Lesenswert?

Zeile 42.

von dummschwaetzer (Gast)


Lesenswert?

nein, 2 Zeilen zuviel

von dummschwaetzer (Gast)


Lesenswert?

stell mal / \ dar, oder ein anderes Zeichen mit Diagonale

von noch_einer (Gast)


Lesenswert?

es fehlt keine Zeile, es ist eine "leere" Zeile zu viel

von dummschwaetzer (Gast)


Lesenswert?

>stell mal / \ dar, oder ein anderes Zeichen mit Diagonale
Ww bitte

von dummschwaetzer (Gast)


Lesenswert?

Hast du irgendwo in der Doku die Beschreibung welches Bit welchem Pixel 
entspricht,
z.B Breite 1:
0xFE, 0x14, // 33
Das sind 16Bit, deine schrift iat aber nur 14Pixel(0x0E, // height) 
hoch.

von Peter W. (Gast)


Lesenswert?

dummschwaetzer schrieb:
> Hast du irgendwo in der Doku die Beschreibung welches Bit welchem
> Pixel
> entspricht,
> z.B Breite 1:
> 0xFE, 0x14, // 33
> Das sind 16Bit, deine schrift iat aber nur 14Pixel(0x0E, // height)
> hoch.

Bei meinem Display wird alles "senkrecht" geschrieben.
[C]
0 // Bit 7
0
0
0
0
0
0
0 // Bit 0
{/C]
Das wäre die Erste Zeile vom Display.

von dummschwaetzer (Gast)


Lesenswert?

das sind aber erst 8 der 14 Bit

von Peter W. (Gast)


Lesenswert?

dummschwaetzer schrieb:
> das sind aber erst 8 der 14 Bit

Die anderen werden dann daunter geschrieben.

von Peter W. (Gast)


Lesenswert?

Das ist mein aktueller Code
1
typedef struct
2
{
3
  uint16_t indexNum;
4
  uint8_t  width;
5
}font_t;
6
7
font_t calcFontStart(uint8_t c, font_t font)
8
{
9
  uint8_t charNum = 0;
10
  font.width = Arial_14[(c-' ')+6];
11
  
12
  font.indexNum = 102;
13
  for(; charNum <= c - ' ' ; charNum++)
14
  font.indexNum += (Arial_14[charNum + 6] * 2);
15
  
16
  font.indexNum -= (font.width*2);
17
  
18
  return font;
19
}
20
21
  
22
void test(void)
23
{
24
  char s[]= "TEST";
25
  uint8_t pos = 0;
26
  
27
  for (uint8_t i = 0 ; i < strlen(s) ; i++)
28
  {
29
    uint16_t x=0;
30
    font_t fontInfo = calcFontStart(s[i], fontInfo);
31
    
32
    glcdSetPageColumn(6,pos);
33
    for (x=0;x<fontInfo.width;x++)
34
    glcdSendData(swapBits(Arial_14[fontInfo.indexNum+x]));
35
    
36
    glcdSetPageColumn(5,pos);
37
    for (x=fontInfo.width;x<(fontInfo.width*2);x++)
38
    glcdSendData(swapBits(Arial_14[fontInfo.indexNum+x]));  
39
    
40
    pos+=10;    
41
  }
42
}

von dummschwaetzer (Gast)


Lesenswert?

da hast du dann aber nur 6Bit???
Sicher, dass die Zeile 8 Pixel hoch ist?

von Peter W. (Gast)


Lesenswert?

dummschwaetzer schrieb:
> da hast du dann aber nur 6Bit???
> Sicher, dass die Zeile 8 Pixel hoch ist?
Wie kommst du auf 6 Bit?

von dummschwaetzer (Gast)


Lesenswert?

weil deine schrift nur 14 bit hoch ist

von dummschwaetzer (Gast)


Lesenswert?

mach mal das Ausrufezeichen, W, w, \, / mit in deinen teststring

von Peter W. (Gast)


Lesenswert?

dummschwaetzer schrieb:
> weil deine schrift nur 14 bit hoch ist

Ja und? Der Rest ist doch dann "0"

von Peter W. (Gast)


Lesenswert?

dummschwaetzer schrieb:
> mach mal das Ausrufezeichen, W, w, \, / mit in deinen teststring

Habe das Board gerade nicht zur Hand. Werde es morgen früh direkt 
ausprobieren.
Was soll das bringen?

von dummschwaetzer (Gast)


Lesenswert?

Welche Bits der 16 vorgegebenen sind zu viel?
Beispiel:
!
0xFE, 0x14, // 33
Zeile Interpretation1
 0    X -\
 1    X - \F
 2    X - /
 3    X -/
 4    X -\
 5    X - \E
 6    X - /
 7      -/
 8      -\
 9      - \1
10      - /
11    X -/
12      -\
13    X - \4
14      - /
15      -/

sieht komisch aus für ein Ausrufezeichen.

von Peter W. (Gast)


Lesenswert?

dummschwaetzer schrieb:
> Welche Bits der 16 vorgegebenen sind zu viel?
> Beispiel:
> !
> 0xFE, 0x14, // 33


Was soll mir das jetzt sagen? Die Zeichen sehen soweit richtig aus. Es 
wird glaube Ich mal nicht am Zeichensatz liegen, meinste nicht auch?

von Michael B. (laberkopp)


Lesenswert?

dummschwaetzer schrieb:
> sieht komisch aus für ein Ausrufezeichen.

Vom zweiten Byte nur 6 bit,
vom ersten kommt bit 0 natürlich nach oben

  7      - byte 0 bit 0
  6    X - byte 0 bit 1
  5    X - byte 0 bit 2
  4    X - byte 0 bit 3
  3    X - byte 0 bit 4
  2    X - byte 0 bit 5
  1    X - byte 0 bit 6
  0    X - byte 0 bit 7
 13    X - byte 1 bit 0
 12      - byte 1 bit 3
 11    X - byte 1 bit 4
 10      - byte 1 bit 5
  9      - byte 1 bit 6
  8      - byte 1 bit 7

von Peter W. (Gast)


Lesenswert?

Michael B. schrieb:
> dummschwaetzer schrieb:
>> sieht komisch aus für ein Ausrufezeichen.
>
> Vom zweiten Byte nur 6 bit,
> vom ersten kommt bit 0 natürlich nach oben


Ja gut. Soll das heißen das mein anderes Byte verkehrt rum geschrieben 
wird?

von dummschwaetzer (Gast)


Lesenswert?

und da sind seine zwei Leerzeilen in seinem Displaybild.
vom 2.Byte die ersten beiden Bits nicht auf das Display.

von Peter W. (Gast)


Lesenswert?

Dann muss ich das Byte um zwei nach oben verschieben. Sowas habe ich mir 
auch schon gedacht.. (PixelDatenVom2Byte<<2)

von Peter W. (Gast)


Lesenswert?

dummschwaetzer schrieb:
> und da sind seine zwei Leerzeilen in seinem Displaybild.
> vom 2.Byte die ersten beiden Bits nicht auf das Display.

Wieso wird dann solch ein Font erstellt? Das kommt doch sicherlich von 
einem PC Programm? Gibt es andere Displays die nicht senkrecht die Bytes 
auf dem Bildschirm werfen sondern waagerecht?

von Nico W. (nico_w)


Lesenswert?

Man kann je nach Setup viele Displays von oben nach unten, unten nach 
oben, links nach rechts oder rechts nach links beschreiben. Wie man es 
halt gerade braucht. Oder weil man das Display um 90° drehen möchte. 
Oder vielleicht hat man einen Spiegel dazwischen...


Und manch einer weiß das alles nicht und schreibt daher seinen Font 
komisch. Schon alles gesehen.

: Bearbeitet durch User
von Peter W. (Gast)


Lesenswert?

Nico W. schrieb:
> Man kann je nach Setup viele Displays von oben nach unten, unten
> nach
> oben, links nach rechts oder rechts nach links beschreiben. Wie man es
> halt gerade braucht. Oder weil man das Display um 90° drehen möchte.
> Oder vielleicht hat man einen Spiegel dazwischen...
>
> Und manch einer weiß das alles nicht und schreibt daher seinen Font
> komisch. Schon alles gesehen.

Na gut. Ich hoffe ja da drauf das es wirklich mit dem unteresBild<<2 ist 
und sich das Problem dadurch lösen lässt. Bin zuversichtlich-

von dummschwaetzer (Gast)


Lesenswert?

Korrektur:
Michael B. schrieb:
>   7      - byte 0 bit 0
>   6    X - byte 0 bit 1
>   5    X - byte 0 bit 2
>   4    X - byte 0 bit 3
>   3    X - byte 0 bit 4
>   2    X - byte 0 bit 5
>   1    X - byte 0 bit 6
>   0    X - byte 0 bit 7
>  13    X - byte 1 bit 0
>  12      - byte 1 bit 3
>  11    X - byte 1 bit 4
>  10      - byte 1 bit 5
>   9      - byte 1 bit 6
>   8      - byte 1 bit 7

dummschwaetzer schrieb:
> vom 2.Byte die ersten beiden Bits nicht auf das Display.

vom 2.Byte das zweite und dritte Bit nicht auf das Display.

von Jan H. (janiiix3)


Lesenswert?

Da hat doch Peter recht gehabt mit dem schieben oder nicht? Wenn das 
zweite und  dritte nicht aufs Display soll..

von Peter W. (Gast)


Lesenswert?

Tatsächlich! Das war es. Wieso aber funktioniert das? Hat man den Font 
extra so angelegt? Ist das jetzt wirklich Display spezifisch?

Danke an alle die geholfen haben.

von Peter W. (Gast)


Lesenswert?

Was mir jetzt noch aufgefallen ist. Wenn ich einen String ausgeben will 
mit dem Text, wie berechne Ich die Leerzeichen dazwischen? Aktuell 
schreib Ich jedes Zeichen auf das letzte..

von Peter W. (Gast)


Lesenswert?

Ah okay.
1
void glcdPutsSpecial(char *str, uint8_t x , uint8_t y)
2
{
3
  uint16_t space = 0;
4
  while (*str)
5
  {
6
    glcdPutcSpecial(*str++,x,space);
7
    space+=(font.width)+1;
8
  }
9
}

So habe Ich es jetzt gelöst.

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.