- 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 ---
Modérateur : Jérémy
-
Jérémy
Administrateur du site- Messages : 2723
- Âge : 45
- Enregistré en : juillet 2015
- Localisation : Dans le sud
- Contact :
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 ?
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
}
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é
-
Jérémy
Administrateur du site- Messages : 2723
- Âge : 45
- Enregistré en : juillet 2015
- Localisation : Dans le sud
- Contact :
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 .
-
Jérémy
Administrateur du site- Messages : 2723
- Âge : 45
- Enregistré en : juillet 2015
- Localisation : Dans le sud
- Contact :
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)
{
j = strlen(text); // on calcul la longueur de notre texte
|
|
|
I2C1_Wr( 0xB0 + j ); // 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.
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 + (q / 100));
q %= 100;
data(48 + (q / 10));
q %= 10;
data(48 + (q));
}
void hstring(unsigned int q)
{
unsigned char i;
i = (q / 16) ;
if (i>9) i=i+7;
data(48 + i );
q %= 16;
if (q>9) q=q+7;
data(48 + (q));
}
- paulfjujo
Expert- Messages : 2597
- Âge : 73
- Enregistré en : juillet 2015
- Localisation : 01800
- Contact :
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
Qui est en ligne
Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 78 invités