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

Créer sa propre librairie pour LCD
Jérémy
Administrateur du site
Administrateur du site
Messages : 2722
Âge : 44
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#1 Message par Jérémy » dim. 20 mars 2016 11:52

Bonjour ,

Voila je me suis mis en tête d'apprendre à créer ma propre librairie pour afficher du texte sur un LCD tout ce qu'il y a de plus classique .

Je possède MikroC pro avec cette librairie déjà implanté ; Il me suffirais donc d'ecrire Lcd_init() et LCD_out pour ecrire du texte tout seul .
Oui mais ce n'ai pas très instructif !.

Je dis pas que je veux ré-inventer la roue, mais inventer ma propre roue ( avec ces défauts certes mais la mienne). Je pense pouvoir apprendre beaucoup en faisant cela. ensuite je pourrais utiliser sans vergogne la librairie toute faites de mikroC.

Je travaille avec un PIC 18F46K22
ma plaque easy PIC 7 tant qu'a faire . Et voici l'écran que j'ai dessus : Lien vers DS

Je bloque d'entrée de jeu sur la facon de faire l'initialisation.

Je dois créer une fonction pour envoyer des commandes . avec le registre-select (RS) à 0 mettre la données sur le PORTB . Oui mais comment l'envoyer ensuite ? qu'est ce qui fait que ca l'envoie la donnée ? comme il n'y a pas d'horloge !

Voici le schéma de cablage :
Sans titre.png


Je pense déjà qu'il faut que j'arrive à affiche les valeurs sur le PORTB correctement en fonction de la donnée que je veux envoyer !. Pour avoir une fonction généraliste .

Ensuite je confusionne un peu tout !
Page 15 de la DS de l''écran , pour envoyer un clear display : il faut mettre DB0 à 1 . donc le PORTB donc être = 0b00000001.
mais le PORTB n'a que 4 sorties de branchées(mode 4 bits), il faut donc envoyer en deux fois . d'abord 4 bit puis les 4 bit suivantes ? mais dans quel ordre ? les LSB, ou MSB en premier ?
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 !!!

Créer sa propre librairie pour LCD
Jérémy
Administrateur du site
Administrateur du site
Messages : 2722
Âge : 44
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#2 Message par Jérémy » dim. 20 mars 2016 12:28

Oui mais comment l'envoyer ensuite ? qu'est ce qui fait que ca l'envoie la donnée ? comme il n'y a pas d'horloge !

Un problème de moins, c'est la broche ENABLE qui va faire office d'horloge . Il faudra bien pensé a la remettre à 0 a chaque fois.
C'est en faisant des erreurs, que l'on apprend le mieux !!!

Créer sa propre librairie pour LCD
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2589
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#3 Message par paulfjujo » dim. 20 mars 2016 14:40

bonjour Jeremy

donc le PORTB donc être = 0b00000001.

ne pas oublier d'utiliser LAT au lieu de PORT pour ecrire sur un port avec un 18F.
Aide toi, le ciel ou FantasPic t'aidera

Créer sa propre librairie pour LCD
Jérémy
Administrateur du site
Administrateur du site
Messages : 2722
Âge : 44
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#4 Message par Jérémy » dim. 20 mars 2016 17:11

Bon avant de partir quelques semaines , je ne crois pas que c'était une bonne idée de me lancer la dedans.

j'ai sous estimé la difficulté ou sur-estimé mon niveau ou les deux :D

Je vais laisser de cote cette idée pour le moment
C'est en faisant des erreurs, que l'on apprend le mieux !!!

Créer sa propre librairie pour LCD
satinas
Expert
Expert
Messages : 1225
Enregistré en : novembre 2015

#5 Message par satinas » dim. 20 mars 2016 17:35

Salut

Oui, c'est la broche Enable qui déclenche la lecture du port data par l'afficheur. D'après les timings dans ta doc, il faut lever Enable, positionner les datas, et ensuite baisser Enable. De mon côté, j'ai toujours d'abord positionné les datas, ensuite une impulsion high/low sur Enable

Pour le mode 4 bit, on utilise les broches db7 à db3, et on envoie d'abord le quartet haut MSB, puis le quartet bas LSB. Le problème est qu'il démarre en mode 8 bits, donc il faudrait commencer par lui envoyer la commande 8 bits 0x28 (set mode 4 bits, 2 ligne 5x8)
Mais on a que 4 bits de données, dont on envoie le quartet 0x02 (set mode 4 bits) sur les 4 broches hautes. Mais c'est pas encore suffisant car le démarrage en 4 bits est un peu poussif, voila ce que fait Arduino dans sa librairie :

// we start in 8bit mode, try to set 4 bit mode
write4bits(0x03);
delayMicroseconds(4500); // wait min 4.1ms
// second try
write4bits(0x03);
delayMicroseconds(4500); // wait min 4.1ms
// third go!
write4bits(0x03);
delayMicroseconds(150);
// finally, set to 4-bit interface
write4bits(0x02);
Modifié en dernier par satinas le dim. 20 mars 2016 18:00, modifié 2 fois.

Créer sa propre librairie pour LCD
Guest
Confirmé
Confirmé
Messages : 800
Enregistré en : mars 2017

#6 Message par Guest » dim. 20 mars 2016 17:52

Bonsoir
je ne sais pas pourquoi mais moi cela me rappel cela viewtopic.php?t=117

A+

Créer sa propre librairie pour LCD
Jérémy
Administrateur du site
Administrateur du site
Messages : 2722
Âge : 44
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#7 Message par Jérémy » dim. 20 mars 2016 17:53

dehors!!
C'est en faisant des erreurs, que l'on apprend le mieux !!!

Créer sa propre librairie pour LCD
Jérémy
Administrateur du site
Administrateur du site
Messages : 2722
Âge : 44
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#8 Message par Jérémy » lun. 21 mars 2016 08:00

La nuit porte conseil ....

J'ai pensé à ceci , pour extraire les MSB et LSB de la donnée à traiter . Pour ensuite pouvoir affecter ces MSB et LSB de la donnée au LSB du PORTB, car ce sont RB0 à RB3 qui sont connectées.

Qu'en pensez vous dans les grandes lignes?

Code : Tout sélectionner

void LCD_cmde (int donnee)
{
  LCD_RS = 0 ;
  MSB = donnee >> 4 ;      // on sort les 4 MSB  de la donnée envoyé
  LSB = donnee & 0x0F;     // On sort les 4 LSB

  PORTB = (PORTB & 0xF0) + MSB ; // On affecte le MSB de la donnée au LSB du PORTB sans toucher au MSB du PORTB
  LCD_EN = 1;
  delay_ms(1);
  LCD_EN = 0;
  delay_ms(1);
  PORTB = (PORTB & 0xF0) + LSB ; // On affecte le MSB de la donnée au LSB du PORTB sans toucher au MSB du PORTB
  LCD_EN = 1;
  delay_ms(1);
  LCD_EN = 0;
  delay_ms(1);
}


Ma réflexion fut :
je doit envoyer une donnée de 8bits, en mode 4 bit. Donc je dois la divisée en deux pour récupérer chaque moitiés.
Une fois les moitiés enregistrer je dois les mettre sur le PORTB mais que sur les 4 premiers bits car les autres sont occupés. donc je fais un masque.

PAr contre j'ai un mauvais pressentiment sur le brochage. RB0 est mon LSB du PORTB . il est relié à D4 d'aprés le schéma? J'ai l'impression que D4 est le MSB de l'ecran ( 4bit) ? Il faudrait donc que j'inverse mes sorties ?
C'est en faisant des erreurs, que l'on apprend le mieux !!!

Créer sa propre librairie pour LCD
Jérémy
Administrateur du site
Administrateur du site
Messages : 2722
Âge : 44
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#9 Message par Jérémy » lun. 21 mars 2016 10:17

Ehehe j'ai avancé un peu, mais je me suis fais des idées .

En fait après programmation du PIC, sa fonctionne bien( j'affiche un le caractère 'A').
Mais si j’éteins tout après avoir programmé, et que je rallume cela ne fonctionne plus .
Certainement une erreur dans la configuration. J'a iessayé de respecter à la lettre la DS de l'écran . On voit au départ de la configuration que je fais un seul envoie comme sur la DS . Puis après je passe avec ma fonction "normale".

Voici mon code :

Code : Tout sélectionner

// Connexions du module LCD
// Broche Read/Write est reliée à la masse
#define LCD_RS PORTB.B4    // H:DATA, L:INST
#define LCD_EN PORTB.B5
#define DATA4 PORTB.B0
#define DATA5 PORTB.B1
#define DATA6 PORTB.B2
#define DATA7 PORTB.B3
// Fin de connexion

 unsigned int MSB,LSB, donnee ;

void LCD_cmde (int donnee)
{
  LCD_RS = 0 ;
  MSB = donnee >> 4 ;      // on sort les 4 MSB  de la donnée envoyé
  LSB = donnee & 0x0F;     // On sort les 4 LSB

  PORTB = (PORTB & 0xF0) + MSB ; // On affecte le MSB de la donnée au LSB du PORTB sans toucher au MSB du PORTB
  LCD_EN = 1;
  delay_ms(1);
  LCD_EN = 0;
  delay_ms(1);
  PORTB = (PORTB & 0xF0) + LSB ; // On affecte le MSB de la donnée au LSB du PORTB sans toucher au MSB du PORTB
  LCD_EN = 1;
  delay_ms(1);
  LCD_EN = 0;
  delay_ms(1);
}

 void LCD_data (int donnee)
{
  LCD_RS = 1 ;
  MSB = donnee >> 4 ;      // on sort les 4 MSB  de la donnée envoyé
  LSB = donnee & 0x0F;     // On sort les 4 LSB

  PORTB = (PORTB & 0xF0) + MSB ; // On affecte le MSB au PORTB
  LCD_EN = 1;
  delay_ms(1);
  LCD_EN = 0;
  delay_ms(1);
  PORTB = (PORTB & 0xF0) + LSB ; // On affecte le LSB au PORTB
  LCD_EN = 1;
  delay_ms(1);
  LCD_EN = 0;
  delay_ms(1);
}

void LCD_conf(){
  DATA4 = 1;
  DATA5 = 1;
  DATA6 = 0;
  DATA7 = 0;
  delay_ms(10);
  LCD_EN = 1;
  delay_ms(1);
  LCD_EN = 0;
  delay_ms(1);

  LCD_cmde (0x28);
  delay_ms(1);
  LCD_cmde (0x28);
  delay_ms(1);
  LCD_cmde (0x0F);
  delay_ms(1);
  LCD_cmde (0x01);
  delay_ms(1);
  LCD_cmde (0x06);
  delay_ms(1);
}

void main() {

  ANSELB = 0;          // PORTB en digital
  TRISB = 0;           // PORTB en sortie

  LCD_EN = 0;          // LCD désactivé
  delay_ms(10);
  LCD_conf();
  delay_ms(10);

while(
1)
 {

    LCD_data(66);
    delay_ms(100);

 }
}
C'est en faisant des erreurs, que l'on apprend le mieux !!!

Créer sa propre librairie pour LCD
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2589
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#10 Message par paulfjujo » lun. 21 mars 2016 12:06

LAT au lieu de PORT pour les sorties 18F
Aide toi, le ciel ou FantasPic t'aidera


Retourner vers « Langage C »

Qui est en ligne

Utilisateurs parcourant ce forum : Google [Bot] et 44 invités