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

Gestion d'un lcd OEM 4x20 par un pilote i2c CLCD420C
francknvs
Débutant
Débutant
Messages : 82
Enregistré en : septembre 2017
Localisation : Paca-toulon

#1 Message par francknvs » dim. 29 oct. 2017 16:51

Bonjour à tous,
je viens de terminer un projet en i2c permettant la gestion d'un afficheur lcd OEM par maitre pic 16f876a
je me sers du DS 16F876A
du DS pilote i2c fournis par lextronic
Datasheet du lcd I²c-CLCD.pdf

du DS Lcd GDM2004D
GDM2004D.pdf

Le projet etant piloté en I2c, j'utilise la doc contenant les instrucions de cmd du pilote CLCD420C
Or, les commande sont tres limitées
    effacer l'ecran
    curseur ON/OFF
    retro -eclairage ON/OFF
    Position curseur
le programme fonctionne bien et les routines de commande et d'affichage classique (puts(),putchar() fonctionnent correctement.
en revanche:
lorsque j'ecris une chaine de caractere superieure à 20 caracteres, ma suite de texte ne s'affiche pas sur la ligne suivante de mon lcd
---> elle saute une ligne pour s afficher sur la suivante.
exemple:
puts("abcdefghij0123456789ABCDEFGH"
s'affichera sur mon LCD de la façon suivante;

1ere ligne: abcdefghij0123456789
2me ligne: rien
3me ligne ABCDEFGH
4me ligne: rien

1/j'ai essayé de trouver un lien logique entre les instructions de commande en hexa du pilote gerant le lcd et les commandes du lcd seul
2/j'ai essayé differente routine en c pour modifier la construction du puts()....RIEN Y FAIT
Dès que je depasse les 20 caracteres de mon texte balisé par '\0', les caracteres suivants jusqu'à la fin de mon texte ('\0'), saute d'une ligne et viennent se placer sur la suivante

voici mon code:

Code : Tout sélectionner

//----------Initialisation du port MSSP (16F876A )-----------------

    i2c_Init();    // cette fct appelle le fichier "Mon_i2c.c"

    //----------Initialisation & Parametrage du LCD OEM 4*20-----------

    lcd_Init();        // pour initialiser le lcd     
    lcd_Clear();    // efface l'ecran durant 15ms
__delay_ms(500);
    lcd_Posit(0x00,0x00);// Valeurs "Colonne,Ligne" du curseur à placer

    //----------Programme Principale en Boucle------------------------

lcd_puts("abcdefghij0123456789ABCDEFG");
//lcd_Posit(0x00,0x01);// Valeurs "Colonne,Ligne" du curseur à placer
//lcd_puts("HIJKLMNO");
while(1);

}
   
//*****************************************************************
//--------------Fin du programme Principal-----------------------
//*****************************************************************    
  


//*****************************************************************
//---------------STRUCTURE DES FONCTIONS LOCALES----------------
//*****************************************************************


//*****************************************************************************************
//  Structure des fonctions permettant de traiter une chaine de caractere
//____________________________________________

// 1_Ecriture d'1 Donnée de caractere sur LCD 
void lcd_putch(unsigned char c)
{
    lcd_ecriture(c);// ici la variable de type char contient la valeur mise dans la fct putch
}
//____________________________________________

// 2_Ecriture d'une chaine de Donnée de caracteres sur LCD
void lcd_puts(const unsigned char *chaine)
{

 for (int j=0;chaine[j]!='\0';j++)
  {
    lcd_putch(chaine[j]);
  }
}


merci pour vos idées
(afin de ne pas rendre ce sujet indigeste, je n'ai volontairement pas mis l'ensemble du projet qui comprend 5 fichiers modulaire....par la suite, pour ceux et celles que ça intéresse, j'ouvrirai un tuto complet sur le projet en C)
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.

Gestion d'un lcd OEM 4x20 par un pilote i2c CLCD420C
satinas
Expert
Expert
Messages : 1225
Enregistré en : novembre 2015

#2 Message par satinas » dim. 29 oct. 2017 21:01

Bonsoir francknvs,

C'est tout à fait normal qu'il passe à la 3ème ligne en fin de 1ère ligne. Regarde la page 8 de ta documentation, les adresses de la DDRAM associées à chaque ligne de l'afficheur.
DDRAM_GDM2004D.png

La fonction lcd_Posit(0x00,0x00) se positionne en début de 1ère ligne, donc à l'adresse 0. Le lcd place chaque caractère reçu à l'adresse courante de la DDRAM, puis incrémente l'adresse. Lorsqu'il passe de l'adresse 0x13 à 0x14, il change de ligne et passe à la 3ème ligne.

Au départ ils avaient sans doute prévu de faire des afficheurs avec seulement 2 lignes et de largeur variable, donc ils ont prévu de la marge pour le nombre de caractères par ligne, avec le début de la deuxième ligne en 0x40. Il n'y a donc pas de continuité d'adresse entre la fin d'une ligne et la suivante.
Ensuite quand ils sont passés à plus de 2 lignes, les adresses étant limitées à 7 bits, ils ont pris la suite des adresses existantes. Je me souviens avoir eu un lcd de 4 lignes de 40 caractères de Lextronic, qui suivait le même principe.

Il faut s'y faire, et le plus simple est de ne jamais écrire en dehors de l'écran, sauf à ajouter sa propre fonction gérant le changement de ligne (ta bibliothèque possède peut être cette fonction).
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.

Gestion d'un lcd OEM 4x20 par un pilote i2c CLCD420C
francknvs
Débutant
Débutant
Messages : 82
Enregistré en : septembre 2017
Localisation : Paca-toulon

#3 Message par francknvs » lun. 30 oct. 2017 01:36

Bonsoir satinas....

Grrrrrr comment ai je loupé cette info qui etait sous mes yeux!!!!!!!!
A force d avoir la tete dans le guidon...on ne voit pas l obstacle... :eek: :mur:
Merci a toi
Ma seule routine est de gerer le nbr de caractère par ligne et de repositionner mon curseur a la suivante :cry:
Apres tout, un lcd n est pas fait pour ecrire de longues phrases, juste des indications et des valeurs de variable.

En tout cas merci pour tes infos Merci !

Gestion d'un lcd OEM 4x20 par un pilote i2c CLCD420C
satinas
Expert
Expert
Messages : 1225
Enregistré en : novembre 2015

#4 Message par satinas » lun. 30 oct. 2017 06:34

Hello,

ben non, il fonctionnait pas pareil le lcd 4x40, puisqu'on ne peut pas mettre 2 fois 40 caractères dans les adresses 0 à 0x3F.
En fait il avait 2 pins Enable, une pour les 2 premières lignes, la seconde pour les lignes 3 et 4.

Bonne journée


Retourner vers « Langage C »

Qui est en ligne

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