Pages: [1]   Go Down
Author Topic: ST7565 aggiungere custom fonts  (Read 743 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 49
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ciao! Ho acquistato un display grafico 128x64 ed ora ho la necessitá di modificare tipo e grandezza dei font. Sulla libreria Adafruit (https://github.com/adafruit/ST7565-LCD) vi sono due funzioni principali per l'output del testo:

 
Code:
void ST7565::drawstring(uint8_t x, uint8_t line, char *c) {
  while (c[0] != 0) {
    drawchar(x, line, c[0]);
    c++;
    x += 6; // 6 pixels wide
    if (x + 6 >= LCDWIDTH) {
      x = 0;    // ran out of this line
      line++;
    }
    if (line >= (LCDHEIGHT/8))
      return;        // ran out of space :(
  }
}

void  ST7565::drawchar(uint8_t x, uint8_t line, char c) {
  for (uint8_t i =0; i<5; i++ ) {
    st7565_buffer[x + (line*128) ] = pgm_read_byte(font+(c*5)+i);
    x++;
  }

  updateBoundingBox(x, line*8, x+5, line*8 + 8);
}

L'unico font disponibile é strutturato in questa maniera (lo riporto parzialmente dato che é lungo):

Code:
uint8_t font[] PROGMEM = {
  0x0, 0x0, 0x0, 0x0, 0x0,       // Ascii 0
  0x7C, 0xDA, 0xF2, 0xDA, 0x7C,  //ASC(01)
  0x7C, 0xD6, 0xF2, 0xD6, 0x7C,  //ASC(02)
  0x38, 0x7C, 0x3E, 0x7C, 0x38,
  0x18, 0x3C, 0x7E, 0x3C, 0x18,
  0x38, 0xEA, 0xBE, 0xEA, 0x38, };

Per ora ho provato a utilizzare vari programmi di conversione da font a hex, da bmp a hex ecc. , ho provato a modificare la funzione drawchar, ma senza alcun successo.
Ora ho la necessitá che mi spieghiate in detaglio, dato che in C++ sono un po' niubbo, cosa fanno esattamente le due funzioni e come modificarle per ottenere delle funzioni universali in cui poter inserire il tipo di font e la rispettiva dimensione.

Grazie!
Logged

Padova
Offline Offline
Jr. Member
**
Karma: 4
Posts: 87
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Purtroppo per come è strutturata la libreria i font sono raster, e quindi non c'è modo di fare un font unico per tutte le dimensioni. Non credo neanche che arduino abbia abbastanza potenza da poter gestire dei font vettoriali...

Quindi l'unica alternativa è usare un array diverso per ogni dimensione che ti serve, e modificare di conseguenza le funzioni drawstring\drawchar per adattarle alle misure diverse. Cosa che di certo non è impossibile, ma richiede non poco lavoro.

Tieni conto poi che usare tanti font diversi occupa un sacco di memoria flash!
Logged

BZ (I)
Online Online
Brattain Member
*****
Karma: 263
Posts: 21584
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Come detto quel display é un display grafico che devi settare e cancellare ogni pixel. per quello devi avere una "memoria di font" dove sono disposti i pixel di ogni carattere. per avere diversi font o diverse grandezze di caratteri serve avere un altro set di caratteri e percui piú memoria.
È facilmete realizzabiel un carattere della grandezza doppia di quello originale settando 4 pixel al posto di 1 ma la qualitá sará scadente.

Ciao Uwe
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 49
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Benissimo. diciamo che voglio, per ora, solamente inserire un set di caratteri numerici da 0 a 9 piú grandi dei precedenti.
1) da immagini bitmap di dimensione 20x34 li converto in hex e li scrivo in un altro array denominato numBig
2) alla funzione drawchar inserisco il parametro font e le dimensioni del carattere drawchar(uint8_t x,uint8_t line, char c,uint8_t W, uint8_t H, char font)
3) la funzione drawchar verrá quindi modificata ma non so da dove partire. Potreste farmi un esempio?

Grazie ancora
Logged

Camisano Vicentino (VI), Italy
Offline Offline
God Member
*****
Karma: 5
Posts: 956
ƎR like no other.
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Benissimo. diciamo che voglio, per ora, solamente inserire un set di caratteri numerici da 0 a 9 piú grandi dei precedenti.
1) da immagini bitmap di dimensione 20x34 li converto in hex e li scrivo in un altro array denominato numBig
2) alla funzione drawchar inserisco il parametro font e le dimensioni del carattere drawchar(uint8_t x,uint8_t line, char c,uint8_t W, uint8_t H, char font)
3) la funzione drawchar verrá quindi modificata ma non so da dove partire. Potreste farmi un esempio?

Grazie ancora

ce l'ho anch'io quel display lì e anch'io volevo creare il modo di scrivere con dimensioni diverse, però non ho ancora avuto tempo di dedicarmi a farlo... smiley-sad
per creare dei caratteri speciali, non presenti nella libreria, ho li ho inseriti con il metodo drawbitmap e gli ho messo le dimensioni e la posizioni...
per fare un nuovo metodo drawstring avevo pensato di mettergli in memoria tutti i caratteri come bitmap e poi scriverli usando drawbitmap, così da risparmiarmi tante noie, e con la possibilità di scrivere su ogni pixel e non ogni 8 pixel, perchè se devo scrivere in centro ad una figura vorrei essere in grado di centrare il più possibile la scritta... non so se sonoriuscito a spiegarti le mie idee smiley-sweat

Tieni conto poi che usare tanti font diversi occupa un sacco di memoria flash!
per fortuna io ho un arduino mega perchè il programma che sto facendo è 28.034 bytes e penso di essere più o meno a metà del codice  smiley-sweat
Logged

Riccardo Ertolupi of the Vicenza Thunders Team: http://www.VicenzaThunders.com

Padova
Offline Offline
Jr. Member
**
Karma: 4
Posts: 87
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Benissimo. diciamo che voglio, per ora, solamente inserire un set di caratteri numerici da 0 a 9 piú grandi dei precedenti.
1) da immagini bitmap di dimensione 20x34 li converto in hex e li scrivo in un altro array denominato numBig
2) alla funzione drawchar inserisco il parametro font e le dimensioni del carattere drawchar(uint8_t x,uint8_t line, char c,uint8_t W, uint8_t H, char font)
3) la funzione drawchar verrá quindi modificata ma non so da dove partire. Potreste farmi un esempio?

Grazie ancora


Alla fin fine senza andare a mettere le mani sulla lib se devi stampare solo delle cifre numeriche ti conviene, come diceva ƎR, usare questi caratteri come delle bitmap e stamparle con drawbitmap.
Nel tuo sketch faresti bene anche a scriverti una funzione che date le coordinate e un numero (una stringa tipo "1234" o un intero tipo 1234) richiami drawbitmap per ogni singola cifra posizionandole correttamente una dopo l'altra, in modo che se scrivere più volte dei numeri col font più grande non devi ripetere codice smiley
Logged

Pages: [1]   Go Up
Jump to: