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

Compter le nombre de caractéres d'une variable
Jérémy
Administrateur du site
Administrateur du site
Messages : 2723
Âge : 45
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#1 Message par Jérémy » mer. 9 sept. 2015 15:53

Bonjour à tous ,

Je cherche la manière de compter le nombre de caractères présents dans une variable de type texte (string je crois ?) afin d'afficher cela sur un LCD. Mais seulement le bon nombres de caractères et non pas toute une ligne avec des blancs.

Essayant de rentrer dans les entrailles des LCD avec MikroC et mon PIC 18F45K22, je test et re-test.

En fait je voudrais créer une routine qui m'affiche un texte, à partir d'un point de départ .

Je pense, ne pas avoir tout compris le système de pointeur, voici mon travail effectué jusqu' a présent .

Je créer un pointeur que je nomme text de cette façon :

Code : Tout sélectionner

char *text;                     // Création d'un pointeur nommé text  


Je vous passe les détails de l'initialisation du LCD .

Dans ma boucle principale j’écris ceci

Code : Tout sélectionner

  //##########################   BOUCLE INFINIE   ##################################
  while(1)
  {
    text = "essai" ;      // mon texte à affiché
    I2C1_Start();         // Ouverture d'une Com I2C
    I2C1_Wr(LCD_ADR);     // Envoi de l'adresse esclave
    I2C1_Wr(0x00);        // Byte de controle pour envoyer une instruction
    I2C1_Wr(0x80);        // INSTRUC : position de l'ADDR du curseur 1ere ligne de 80 à 8F
    I2C1_Repeated_Start();// Repetition de l'ouverture de la com I2C
    I2C1_Wr(LCD_ADR);     // Envoi de l'adresse esclave
    I2C1_Wr(0x40);        // Byte de controle pour envoyer une DATA
    
      for 
( i=0;i<=4;i++)// Boucle pour répéter 5 fois l'action sur la premiere ligne
       {
         I2C1_Wr(0x80 + text[i] );    // Envoie une donnée
       }

       
     Delay_ms
(1000);
    I2C1_Stop();
  }


Avec ceci ça fonctionne !! ;)
Voila ce que je crois comprendre:
- dans la première boucle , j'affiche "text[0]" qui correspond à la premier lettre de mon texte("e") d’après mon pointeur.
- la boucle suivante "i" est incrémenté donc j'affiche text[1], qui correspond à la deuxième lettre donné par le pointeur soit ("s")
|
|
-La dernière boucle "i" est encore incrémenté donc j'affiche text[4], qui correspond à ("i")

Malheureusement avec ce système je dois déterminé manuellement la longueur du TEXTE pour répété la boucle autant de fois que nécessaire, mais pas plus sinon des caractères hasardeux s'affiche ( sont dans la DDRAM de l'écran) et pas moins sinon je mange le texte. Dnas l'exemple grace à

Code : Tout sélectionner

for ( i=0;i<=4;i++) 


L’idée c'était de connaitre le nombre de caractères dans ma chaine ? auriez vous une idée sur comment compter ces lettres ?
C'est en faisant des erreurs, que l'on apprend le mieux !!!

Compter le nombre de caractéres d'une variable
Pat
Débutant
Débutant
Messages : 43
Enregistré en : juillet 2015

#2 Message par Pat » mer. 9 sept. 2015 16:37

En C le chaines de caractères doivent être terminé par un 0 , écrire '\0'

Il suffit donc de tester si le caractère est '\0'

Code : Tout sélectionner


     i
=0;
     while (  
text[i] != '\0' )// 
       
{
         
I2C1_Wr(0x80 text[i++] );    // Envoie une donnée
       
}
 

Compter le nombre de caractéres d'une variable
Pat
Débutant
Débutant
Messages : 43
Enregistré en : juillet 2015

#3 Message par Pat » mer. 9 sept. 2015 16:41

Notez aussi que si on fabrique une chaine il faudra aussi mettre un 0 à la fin et déclarer la longueur + 1

exemple fair une CR/LF

Code : Tout sélectionner


unsigned char cr
[3];
cr[0]=13;
cr[1]=10;
cr[2]='\0';

// strlen() renvoie la longueur d'une chaine
// i = strlen(cr);   // donne 2 le 0 n'est pas compté
 

Compter le nombre de caractéres d'une variable
Jérémy
Administrateur du site
Administrateur du site
Messages : 2723
Âge : 45
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#4 Message par Jérémy » mer. 9 sept. 2015 17:01

Pat a écrit :En C le chaines de caractères doivent être terminé par un 0 , écrire '\0'

Il suffit donc de tester si le caractère est '\0'

Code : Tout sélectionner


     i
=0;
     while (  text[i] != '\0' )// 
       {
         I2C1_Wr(0x80 + text[i++] );    // Envoie une donnée
       }


Génial .

Vraiment super conseil, ça fonctionne parfaitement ! Je peux rentrer n'importe quel texte de n'importe quelle longueur , ça s'adapte tout seul.

Je vais donc essayer de créer ma routine ce soir , il suffira d'indiquer , le numéro de la ligne ( 1 ou 2) , suivis du numéro de départ sur la dites ligne ( 1 à 16) et du texte . et hop , cela s’affichera tout seul .

Concernant ton deuxième conseil, j'ai pas tout compris , je dois encore travaillé les tableaux et les pointeurs .
C'est en faisant des erreurs, que l'on apprend le mieux !!!

Compter le nombre de caractéres d'une variable
Jérémy
Administrateur du site
Administrateur du site
Messages : 2723
Âge : 45
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#5 Message par Jérémy » mer. 9 sept. 2015 21:10

Jérémy a écrit :Source du message Concernant ton deuxième conseil, j'ai pas tout compris , je dois encore travaillé les tableaux et les pointeurs .


J'ai un peu travaillé dessus ; Mais en fait soit je n'arrive pas a faire ce qu'il faudrait, soit ce n'est pas possible .

En écrivant ceci ça fonctionne .

Code : Tout sélectionner

char text[] = "un texte";     // en début dans la déclaration de variable 


Puis dans le programme principal:

Code : Tout sélectionner

while(1)
  {
    
strlen(text);    // on calcul la longueur de notre texte
              
|
              |
              |    
    
I2C1_Wr0xB0 );  // On affiche le nombre de lettre
     


En faisant comme ceci, ce n'est pas très intuitif car on est obligé de déclaré nos tableaux en début de programme .
Je n'ai pas réussis à ecrire un texte "à la volée" comme avec la première solution.
C'est en faisant des erreurs, que l'on apprend le mieux !!!

Compter le nombre de caractéres d'une variable
Pat
Débutant
Débutant
Messages : 43
Enregistré en : juillet 2015

#6 Message par Pat » jeu. 10 sept. 2015 11:59

routines pour afficher des valeurs numériques
0 à 255 en décimale et en hexa

data(code) affiche le code
48 code ascii décimale pour le '0'

en hexa
si ça dépasse 9 on doit mettre un A pour 10
donc pour passer de 0x3A à 0x41 on fait +7

il faut adapter à cette afficheur

Code : Tout sélectionner



void cstring
(unsigned int q)
{
    data(48 + (/ 100));
    q %= 100;
    data(48 + (/ 10));
    q %= 10;
    data(48 + (q));
}

void hstring(unsigned int q)
{
unsigned char i;
    i =  (/ 16)  ;
    if (i>9) i=i+7;
    data(48 + i );
    q %= 16;
    if (q>9) q=q+7;
    data(48 + (q));
}

Compter le nombre de caractéres d'une variable
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2597
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#7 Message par paulfjujo » mar. 9 févr. 2016 14:15

bonjour ,


Code : Tout sélectionner

char text[] = "un texte"


le fait d'affecter un string (chaine de caractere ) dans la table text
fait que le zero terminateur est deja inseré à la fin de la table text.
On a donc pas à s'en soucier .

Code : Tout sélectionner

while(1)
  {
    j = strlen(text);    // on calcul la longueur de notre texte
             |
              |
              |    
    I2C1_Wr
( 0xB0 + j );  // On affiche le nombre de lettre     

Là je ne comprends pas ce que tu veux faire ?
si c'est le nombre de caractere de text[] que tu veux afficher
le nombre j doit etre convertit en ascii

soit une table
char Text1[7];
si j est un unsigned char (0 à255)

Code : Tout sélectionner

ByteToStr(j,Text1); 

ou j un unsigned int (0 à 65535)

Code : Tout sélectionner

WordToStr(j,Text1); 

ensuite on affiche Text1

une fonction pour afficher un char a une adresse ligne col du LCD

Code : Tout sélectionner



void LCD_Write_Chr_At
(int Ligne,int col,char c1)
{
 //.. ligne 1 ou 2
  //.. col de 1 à 16
  I2C1_Start() ;
  I2C1_Wr(LCD_ADR); // i2c slave Adress
  I2C1_Wr(0x00); // Control byte for Instruction
  if(col>16) col=16;
  switch (Ligne)
  {
  case 1:
      I2C1_Wr(0x80+col-1); // DDRAM Address 1ere ligne
      break;
  case 2:
      I2C1_Wr(0xc0+col-1); // DDRAM Address 2em ligne
      break;
  default:
      break ;
  }
  I2C1_Repeated_Start() ;
  I2C1_Wr(LCD_ADR); // i2c slave Address
  I2C1_Wr(0x40); // Control byte for Data
  I2C1_Wr(80+c1);
  Delay_ms(10);                      // Pause de 10ms
  I2C1_Stop();
 }
 


ou pour afficher un texte à partir d'une L et C du LCD
en verifiant qu'on ne deborde pas des 16 cars du LCD

Code : Tout sélectionner



void LCD_Write_Text_At
(unsigned int Ligne,unsigned int col,char * t1)
{
 //.. ligne 1 ou 2
  //.. col de 1 à 16
  int i;
  I2C1_Start();
  I2C1_Wr(LCD_ADR); // i2c slave Address
  I2C1_Wr(0x00); // Control byte for Instruction
  if(col>16) col=16;
  switch (Ligne)
  {
  case 1:
      I2C1_Wr(0x80+col-1); // DDRAM Address 1ere ligne
      break;
  case 2:
      I2C1_Wr(0xc0+col-1); // DDRAM Address 2em ligne
      break;
  default:
      break ;
  }
  I2C1_Repeated_Start();
  I2C1_Wr(LCD_ADR); // i2c slave Adress
  I2C1_Wr(0x40); // Control byte for Data
  i=0;
  while(*(t1))
  {
  I2C1_Wr(0x80+*(t1));
  t1++;
  i++;
  if (i>16) break;
  }
  I2C1_Stop();
}

 


on peut faire une version plus simple pour ecrire un texte , si au prealable
on a positionné le curseur sur la bonne ligne L et en Colonne 1

Code : Tout sélectionner


void LCD_Write_Text
(char * t1)
{
  int i;
  I2C1_Start();
  I2C1_Wr(LCD_ADR); // i2c slave Adress
  I2C1_Wr(0x40); // Control byte for Data
  i=0;
  while(*(t1))
  {
  I2C1_Wr(0x80+*(t1));
  t1++;
  i++;
  if (i>16) break;
  }
  I2C1_Stop();
}
 


et pour afficher la longueur de text

Code : Tout sélectionner

 j = strlen(text);    // on calcul la longueur de notre texte
 ByteToStr(j,Text1); // conversion en ascii
LCD_RAZ_Ligne( 1); // on nettoie la ligne 1 et remet le curseur au debut
LCD_Write_Text(Text1); // affiche la longueur    



nota: code issu de LCD2119 I2C 2x16 car
Aide toi, le ciel ou FantasPic t'aidera


Retourner vers « Langage C »

Qui est en ligne

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