Bienvenue aux nouveaux arrivants sur FantasPic !

- Pensez à lire les règles durant votre visite, il n'y en a pas beaucoup, mais encore faut-il les respecter .
- N’hésitez pas à faire des remarques et/ou suggestions sur le Forum, dans le but de l'améliorer et de rendre vos prochaines visites plus agréables.
- Vous pouvez regarder votre "panneau de l'utilisateur" afin de configurer vos préférences.
- Un passage par "l'utilisation du forum" est recommandé pour connaître les fonctionnalités du forum.

--- L’équipe FantasPic ---
Forum général sur le langage C !

Modérateur : Jérémy

Fonctionnement des "FONT" sur écran OLED
Guest
Confirmé
Confirmé
Messages : 800
Enregistré en : mars 2017

#71 Message par Guest » sam. 21 mai 2016 12:05

Oui mais trop facile la :lol: , et si tu n'avais pas la largeur?

Bien toujours avec 4 prendre le pointeur de 5 faire la soustraction des 2 pointeurs, si =16 alors petit, sinon grand :wink:

Fonctionnement des "FONT" sur écran OLED
Guest
Confirmé
Confirmé
Messages : 800
Enregistré en : mars 2017

#72 Message par Guest » sam. 21 mai 2016 16:18

Bon je pense avoir compris le Kerning, c'est la table qui contient la largeur de ta matrice de caractères et je suppose au vue du nombre que tu dois pouvoir mettre d'autreS typeS de matrice avec la même table. Tout cela tourne, Bien sous MICROC :wink: pas chez moi

A+

PS: tu as le temps que tu mets pour faire la conversion du chiffre 4 ?

Fonctionnement des "FONT" sur écran OLED
Jérémy
Administrateur du site
Administrateur du site
Messages : 2723
Âge : 45
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#73 Message par Jérémy » sam. 21 mai 2016 21:11

Tout cela tourne, Bien sous MICROC :wink: pas chez moi

Non il faut modifier quelques trucs de mon coté aussi !

PS: tu as le temps que tu mets pour faire la conversion du chiffre 4 ?

Non je ne sais pas faire encore. Faut vraiment que je trouve le temps pour apprendre l'IDE de MikroC
C'est en faisant des erreurs, que l'on apprend le mieux !!!

Fonctionnement des "FONT" sur écran OLED
Jérémy
Administrateur du site
Administrateur du site
Messages : 2723
Âge : 45
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#74 Message par Jérémy » dim. 22 mai 2016 08:40

Bonjour,

Bon je m'embrouille encore avec ces maudits tableaux et pointeurs !

Avec ce code il ne detecte pas la fin de mon tableau, la boucle continue "ad vitam æternam" .

Savez vous comment faire, car j'ai essayer des centaines combinaisons .

Programme simplifié :

Code : Tout sélectionner

//##########################  DECLARATION       #############################

unsigned int tempo, position, valeur, i=0, j=0, k=0, m=;
unsigned int ecart, lettre, x, y;

void affichage_Lettre2(unsigned int lettre);
void affichage_Texte(unsigned int x, unsigned int y, unsigned char txt[]);



Code : Tout sélectionner

     efface_ecran();        // On efface l'écran et la RAM

     affichage_Texte(32,1,"QRSD");

     delay_ms(5000);
//############################     BOUCLE INFINIE     ##############################
 while(1){
 }
}
//##################################################################################
//#########################     PROGRAMME SECONDAIRE    ############################
//##################################################################################

void affichage_Texte(unsigned int x, unsigned int y, unsigned char txt[]){
    
   unsigned char index
=;

   while ( (txt[index]) != 0  ){
      
      zone_ecran
(x,x+15,y,y+1);
      lettre = txt[index];
      lettre = ( (lettre-33)*2)+1;
      affichage_Lettre2 (descriptors[lettre]);
       x += 17 ;
    }
}
C'est en faisant des erreurs, que l'on apprend le mieux !!!

Fonctionnement des "FONT" sur écran OLED
Jérémy
Administrateur du site
Administrateur du site
Messages : 2723
Âge : 45
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#75 Message par Jérémy » dim. 22 mai 2016 12:50

Impossible d’arrêter le défilement de mon texte !

Si le texte ne s’arrête pas, c'est que la valeur txt[index] n'est jamais égale à "NUL" donc à mon terminateur de string !

Pourtant je stocke bien mon texte dans un tableau ! le terminateur de string est rajouté automatiquement ?
Sinon c'est que ma valeur index n'est pas bonne et ne pointe jamais vers le terminateur de string. pourtant je ne vois pas pourquoi elle n’atteindrais jamais le terminateur. Comme c'est une variable locale, est-elle remise à zéro quand j’exécute la fonction affichage_Lettre2 (descriptors[lettre]);?

Je comprends vraiment pas ! en manuelle ca fonctionne impeccable, dès que je veut faire avec le terminateur de string ca tourne en boucle sans jamais s'arreter
C'est en faisant des erreurs, que l'on apprend le mieux !!!

Fonctionnement des "FONT" sur écran OLED
Jérémy
Administrateur du site
Administrateur du site
Messages : 2723
Âge : 45
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#76 Message par Jérémy » dim. 22 mai 2016 12:57

Voila comment m’énerver pour rien .....

Si je n’incrémente pas mon index, ça ne risque pas de fonctionner !
C'est en faisant des erreurs, que l'on apprend le mieux !!!

Fonctionnement des "FONT" sur écran OLED
Claudius
Avatar de l’utilisateur
Passioné
Passioné
Messages : 260
Âge : 69
Enregistré en : septembre 2015
Localisation : ELANCOURT (78 - YVELINES)
Contact :

#77 Message par Claudius » dim. 22 mai 2016 13:43

Bonjour,

Effectivement ... :bravo:

Étant en charge de l'écriture de guidelines pour le Langage C (et autres langages ;-), j'ai été amené à mettre en garde voire "interdire" l'utilisation de la structure while(condition) au profit de la structure for (initialisation; incrément ou décrément; condition fin) sauf dans un et un seul cas; à savoir: while (true) avec naturellement une éventuelle condition de break mais pas toujours nécessaire dans un logiciel embarqué :wink:

Dans ton cas, cette structure while (condition fin) peut alors être écrite et ce d'une manière "auto-documentée" par:

Code : Tout sélectionner

unsigned char index;
for (index = 0; txt[index] != 0; index++) {
    ...
}


De plus, si les textes à afficher sont manifestement de taille inférieure à une valeur connue (disons 80 par exemple), il est conseillé de rajouter une sécurité avec:

Code : Tout sélectionner

unsigned char index;
for (index = 0; txt[index] != 0 && index < 80; index++) {
    ...
}


Code qui n'accroit pas la durée d'exécution mais ô combien sécurisé, tout cela en une seule ligne qui se lit comme un poème :-D

Fonctionnement des "FONT" sur écran OLED
Jérémy
Administrateur du site
Administrateur du site
Messages : 2723
Âge : 45
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#78 Message par Jérémy » dim. 22 mai 2016 15:20

@Claudius : :bravo: pour ce conseil !

Le but est d’empêcher un blocage dans une boucle n'est ce pas ?

Je viens de tester et ça fonctionne parfaitement (je n'en doutais pas :lol: ).
Voila je viens de finir ma petite libraire de convertion , à but pédagogique . Encore pas mal de choses apprises avec ceci.

Y'a-t-il une convention concernant l’écart entre deux lettres consécutives ? par exemple ici j'ai mis 2 pixels vides entre deux lettres, ce qui me parait pas trop mal!

Je sais pas si j'ai mis plus de temps à faire la "font" plutôt que d'essayer de la convertir mais bon . Je dispose maintenant de cette font qui est d'une taille intermédiaire pour cette écran.

Je ferais peut-être un tuto dès que j'aurais 5 minutes :-D ( c'est pas gagné ) . Me contacter si le code vous intéresse et si voulez des explications, car du coup ça offre pas mal de font toute faites !

Code : Tout sélectionner


     affichage_Texte
(32,1,"0123456789");
     affichage_Texte(32,3,"AaBbCcDd");

//############################     BOUCLE INFINIE     ##############################
 while(1){
 }
}
//##################################################################################
//#########################     PROGRAMME SECONDAIRE    ############################
//##################################################################################

//------------------     affiche le texte     ----------------------------------
// Paramétres d'entrée : 1) position du début du texte en X de 32 à 95
// Paramétres d'entrée : 2) position du haut du texte en Y de 0 à 4
// Paramétres d'entrée : 3) le texte à afficher
void affichage_Texte(unsigned int x, unsigned int y, unsigned char txt[]){
    
   unsigned char index
=0, ecart=;

    for (index = 0; txt[index] != 0 && index < 255; index++){

          if (txt[index]==32) txt[index]=128;
          ecart = descriptors[((txt[index]-33)*2)] ;  // calcul la largeur d'une lettre pour ajuster l'espace entre chaques lettres
          lettre = ((txt[index]-33)*2) + 1;  //  calcul l'emplacement de la matrice lettre
          if (ecart>=9){                     // si lettre sur 32 octets
              zone_ecran(x,x+15,y,y+1);
              affichage_Lettre2 (descriptors[lettre]);
             }
             else{                           // Si lettre sur 16 Octets
             zone_ecran(x,x+7,y,y+1);
             affichage_Lettre (descriptors[lettre]);
             }
          x += ecart+;   // Positionne le curseur pour la prochaine lettre avec 2 espaces entre chaque lettres
      }
}

//------------------Convertit une lettre composée de 32 Octets -----------------
// Paramètre d'entrée : la position dans le tableau "alphabet" du premier des 32 Octets
void affichage_Lettre2(unsigned int position){

     i = j = k = m = valeur = 0;

     for (k=0;k<=1;k++){
         for (m=0;m<=1;m++){
             position += m;
             for (i=0;i<=7;i++){
                 for (j=0;j<=7;j++){
                      valeur +=  (  (((font16x8[(position+(k*15)+(j*2))])>>(7-i)) & (0x01))  << j  )  ;
                  }
                  OLED_M_data(valeur);
                  valeur = 0 ;
              }
          }
      }
}

//------------------Convertit une lettre composée de 16 Octets -----------------
// Paramètre d'entrée : la position dans le tableau "alphabet" du premier des 16 Octets
void affichage_Lettre(unsigned int position){

     i = j = k = m = valeur = 0;
     
     for 
(k=0;k<=1;k++){
          for (i=0;i<=7;i++){
               for (j=0;j<=7;j++){
                    valeur +=  (  (((font16x8[(position+(k*8)+j)])>>(7-i)) & (0x01))  << j  )  ;
                }
                OLED_M_data(valeur);
                valeur = 0 ;
           }
      }
}
 


Sans titre.jpg
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
C'est en faisant des erreurs, que l'on apprend le mieux !!!

Fonctionnement des "FONT" sur écran OLED
sylvain54
Avatar de l’utilisateur
Amateur
Amateur
Messages : 194
Âge : 51
Enregistré en : août 2015
Localisation : Dans l'est de la France

#79 Message par sylvain54 » ven. 27 mai 2016 18:01

:bravo:
Une chose de faite.

Fonctionnement des "FONT" sur écran OLED
Jérémy
Administrateur du site
Administrateur du site
Messages : 2723
Âge : 45
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#80 Message par Jérémy » sam. 28 mai 2016 16:09

Hello,

sylvain54 a écrit :Source du message Une chose de faite.


Oui c'est plutôt cool, car cela ouvre énormément de possibilité .

je viens de travailler sur une re-fonte de ma librairie, mais je n'arrive pas à la simplifier ! A part le remplacement des variables par leur valeur calculé , ce qui évitera de rechercher une variable . Mais en dur dans la formule je ne vois pas comment faire .

j'ai essayé en traitant les lettres de 32 Octets de différentes manières mais ça reviens toujours au même ! car les caractères en 32 Octets et en 16 Octet ne sont pas traités de la même façon .

Je vais m’arrêter la !!!!

La librairie convertit toutes les caractères, du moment qu'ils fassent 16x16 pixels max ! ( 16 en hauteur et 16 en largeur)
C'est en faisant des erreurs, que l'on apprend le mieux !!!


Retourner vers « Langage C »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 62 invités