Font Array auslesen?!

Gast #5314099
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.
Gast #5314202
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?
Gast #5314250
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
Gast #5314343
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?
Gast #5314389
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.
Gast #5314449
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.
Gast #5314543
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
}
Gast #5314620
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?
Gast #5314867
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.
Gast #5314887
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.
Gast #5314899
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
}
Gast #5314942
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.
#5314964
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
Gast #5314982
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?
#5314992
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.
Gast #5315002
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-
Gast #5315058
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.
Gast #5315413
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren