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

LCD en serie + PIC 18F45K22
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 » lun. 28 sept. 2015 22:08

Bonsoir à tous,

Après le message intéressant de AchileT, sur les champs de bits et les structures, j'ai voulus approfondir mes maigres connaissances sur le sujet . Par la même occasion je me suis dis pour quoi pas utiliser le LCD série qui est sur la carte Easypic, histoire d'apprendre 2 choses en même temps. et finir par un tuto !.

Oui mais voila, je comprends déjà pas le LCD serie avec MikroC ?

Ça m'aurais parus plus simple après le LCD en I²C . et ben non .

Mon but premier était de créer un affichage du reflet des sorties du PORTC En appuyant sur les BP respectifs du PORTD. Donc afficher huit "0" quand toutes les sorties du PORTC sont à 0. Si il y à un appui sur un BP du PORTD cela change la valeur de sortie en "1" et je le vois changer aussi à l'écran . Tout ça afin de simuler des Tout ou Rien, pour travailler sur les structures.

J’espère avoir été assez explicite dans le but final .

Oui mais voila rien ne se passe comme prévu.

Surtout pour la longueur de l'affichage . Voici un programme avec seulement 2 BP au lieu de 8. Mais mon affichage se fait sur 4 caractères, donc j'efface les chiffres avant car je ré-écris dessus .

Je n'ai pas trouvé de recette miracle pour n'afficher qu'un seul caractère ?

Ça doit vous paraitre bête mais j'ai cherché un moment !
Je programme avec MikroC sur un PIC 18F45K22 (datasheet)
Le schéma de la carte Easypic7 se trouve ici : Lien

Code : Tout sélectionner

/*##################################################################################
##############################     Variable / Constante    #########################
##################################################################################*/

char BP0,BP1;
char *text[4];

// Connexions du module LCD
sbit LCD_RS at LATB4_bit;
sbit LCD_EN at LATB5_bit;
sbit LCD_D4 at LATB0_bit;
sbit LCD_D5 at LATB1_bit;
sbit LCD_D6 at LATB2_bit;
sbit LCD_D7 at LATB3_bit;

sbit LCD_RS_Direction at TRISB4_bit;
sbit LCD_EN_Direction at TRISB5_bit;
sbit LCD_D4_Direction at TRISB0_bit;
sbit LCD_D5_Direction at TRISB1_bit;
sbit LCD_D6_Direction at TRISB2_bit;
sbit LCD_D7_Direction at TRISB3_bit;
// FIN Connexions du module LCD

/*##################################################################################
############################   PROGRAMME PRINCIPAL    ##############################
##################################################################################*/
void main(){
  ANSELB = 0;                        // Configure le PORTB en digital
  TRISB = 0b00000000;                // Configure le PORTB en Sortie
  LATB = 0;                          // Initialise à 0

  ANSELC = 0;                        // Configure le PORTC en digital
  TRISC = 0b00000000;                // Configure le PORTC en Sortie
  LATC = 0;                          // Initialise à 0

  ANSELD = 0;                        // Configure le PORTD en digital
  TRISD = 0b11111111;                // Configure le PORTD en Entrée
  LATD = 0;                          // Initialise à 0

  Lcd_Init();                        // Initialisation du LCD

  Lcd_Cmd(_LCD_CLEAR);               // On efface l'écran
  Lcd_Cmd(_LCD_CURSOR_OFF);          // On arrête le curseur
  delay_ms(500);                     // pause de 500ms
  Lcd_Out(2,1,"7 6 5 4 3 2 1 0");  // Affichage du numéro des BP sur la ligne du bas

  BP0 = 0;
 //##########################    BOUCLE INFINIE    ##################################
  while(1) {                         // boucle sans fin

    if (PORTD.B0 == 1){              // Détection d'appui sur un BP
       delay_ms(30);
          if (PORTD.B0 == 1){
             while (PORTD.B0 == 1);  // Anti-rebond
             PORTC.B0 = ~PORTC.B0 ;  // On inverse la sortie si l'Appui est validé
             BP0 = PORTC.B0;         // On affecte l'état de la sortie à une variable
             ByteToStr (BP0,text);   // On convertie la variable en string pour affichage
             Lcd_Out(1,13,text)  ;   // On affiche notre valeur
            }
      }
    if (PORTD.B1 == 1){              // Même procédé mais avec le BP1
       delay_ms(30);
          if (PORTD.B1 == 1){
             while (PORTD.B1 == 1);
             PORTC.B1 = ~PORTC.B1 ;
             BP1 = PORTC.B1;
             ByteToStr (BP1,text);
             Lcd_Out(1,11,text)  ;
            }
      }
  }
}
C'est en faisant des erreurs, que l'on apprend le mieux !!!

LCD en serie + PIC 18F45K2
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2589
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#2 Message par paulfjujo » mar. 29 sept. 2015 18:24

bonsoir,


Attention

Code : Tout sélectionner

char *text[4]; 


est un tableau de 4 pointeurs !
char text[5]; // tableau de 5 emplacement ou chaine de 4 caracteres
text peut alors etre utilisé directement comme pointeur sur la table text[];

pour etre plus explicite, tu pourrais definir comme ceci
char text[17]; // pourquoi ne pas definir une taille de 17 pour pouvoir loger un string (chaine de 16 caracteres) = 1 ligne de 16 car LCD
char *p ; // definition d'un pointeur de charactere

dans le main() , ne pas oublier de l'initialiser sur le premier emplacement( [0] de la table text
p=&text[0]; // & = adresse de
et ensuite on utilise p (pointeur) pour la convertion et l'affichage LCD

Code : Tout sélectionner


ByteToStr 
(BP0,p);
Lcd_Out(1,11,p);
 
Aide toi, le ciel ou FantasPic t'aidera

LCD en serie + PIC 18F45K2
Jérémy
Administrateur du site
Administrateur du site
Messages : 2722
Âge : 44
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#3 Message par Jérémy » mar. 29 sept. 2015 22:24

Re,

J'ai essayer ton astuce Paulfjujo, mais le hic c'est que quand j’écris un chiffre à droite cela m'efface celui de gauche !Je crois que cela est normal car le text est sur 3 caractères ? donc espace espace chiffre non ?

Quand j’écris char *p; il me marque une erreur lors de la compilation ;
7 393 'p' Identifier redefined Structure de bits.c

j'ai du ecrirechar *ptr; . Peut être que c'est trop court ?

Bon j'avoue du coup être un peu perdu avec ces pointeurs , ca me fait un bon exercice en tout cas . Je sens que je suis pas loin mais j'y arrive pas .

Voici mon programme modifié : mais qui m'efface les chiffres

Code : Tout sélectionner

/*##################################################################################
##############################     Variable / Constante    #########################
##################################################################################*/

char BP0,BP1;
char text[17];
char *ptr ;

// Connexions du module LCD
sbit LCD_RS at LATB4_bit;
sbit LCD_EN at LATB5_bit;
sbit LCD_D4 at LATB0_bit;
sbit LCD_D5 at LATB1_bit;
sbit LCD_D6 at LATB2_bit;
sbit LCD_D7 at LATB3_bit;

sbit LCD_RS_Direction at TRISB4_bit;
sbit LCD_EN_Direction at TRISB5_bit;
sbit LCD_D4_Direction at TRISB0_bit;
sbit LCD_D5_Direction at TRISB1_bit;
sbit LCD_D6_Direction at TRISB2_bit;
sbit LCD_D7_Direction at TRISB3_bit;
// FIN Connexions du module LCD

/*##################################################################################
############################   PROGRAMME PRINCIPAL    ##############################
##################################################################################*/
void main(){
  
ANSELB 0;                        // Configure le PORTB en digital
  
TRISB 0b00000000;                // Configure le PORTB en Sortie
  
LATB 0;                          // Initialise à 0

  
ANSELC 0;                        // Configure le PORTC en digital
  
TRISC 0b00000000;                // Configure le PORTC en Sortie
  
LATC 0;                          // Initialise à 0

  
ANSELD 0;                        // Configure le PORTD en digital
  
TRISD 0b11111111;                // Configure le PORTD en Entrée
  
LATD 0;                          // Initialise à 0

  
Lcd_Init();                        // Initialisation du LCD

  
Lcd_Cmd(_LCD_CLEAR);               // On efface l'écran
  
Lcd_Cmd(_LCD_CURSOR_OFF);          // On arrete le curseur
  
delay_ms(500);                     // pause de 500ms

  
Lcd_Out(1,1,"0 0 0 0 0 0 0 0");  // Initialisation des valeurs à zero ( toutes les led sosnt éteintes !)
  
Lcd_Out(2,1,"7 6 5 4 3 2 1 0");  // Affichage du numero des BP sur la ligne du bas

  
ptr=&text[0];
  
BP0 0;

 
//##########################    BOUCLE INFINIE    ##################################
  
while(1) {                         // boucle sans fin

    
if (PORTD.B0 == 1){              // Detection d'appui sur un BP
       
delay_ms(30);
          if (
PORTD.B0 == 1){
             while (
PORTD.B0 == 1);  // ANti-rebond
             
PORTC.B0 = ~PORTC.B0 ;  // On inverse la sortie si l'Appui est validé
             
BP0 PORTC.B0;         // On affecte l'état de la sortie à une variable
             
ByteToStr (BP0,ptr);   // On convertie la vriable en string pour affichage
             
Lcd_Out(1,13,ptr)  ;   // On affiche notre valeur
            
}
      }
    if (
PORTD.B1 == 1){              // Même procédé mais avec le BP1
       
delay_ms(30);
          if (
PORTD.B1 == 1){
             while (
PORTD.B1 == 1);
             
PORTC.B1 = ~PORTC.B1 ;
             
BP1 PORTC.B1;
             
ByteToStr (BP1,ptr);
             
Lcd_Out(1,11,ptr)  ;
            }
      }
  }
C'est en faisant des erreurs, que l'on apprend le mieux !!!

LCD en serie + PIC 18F45K2
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 » mar. 29 sept. 2015 23:38

Re moi,

Voila je pense avoir un peu compris le fonctionnement de ce pointeur , mais ce n'est pas encore très transparent !.

en tout cas j'ai réussis à avancer et le programme s’exécute parfaitement .

J'affiche donc un parfait reflet de mes sorties du PORTC quand je les changes avec les BP du PORTD
0 = éteint , 1=allumer;

Peut-être qu'il possède des erreurs ou améliorations a faire etc ....

Code : Tout sélectionner

/*##################################################################################
##############################     Variable / Constante    #########################
##################################################################################*/

char text[17];     // création d'un tableau pour aceuillir une chaine de 16 caracteres + terminaison ( 1 ligne)
char *ptr ;        // Création d'un pointeur

void affichage (); // Déclaration de la fonction ( mise à la fin)

// Connexions du module LCD
sbit LCD_RS at LATB4_bit;
sbit LCD_EN at LATB5_bit;
sbit LCD_D4 at LATB0_bit;
sbit LCD_D5 at LATB1_bit;
sbit LCD_D6 at LATB2_bit;
sbit LCD_D7 at LATB3_bit;

sbit LCD_RS_Direction at TRISB4_bit;
sbit LCD_EN_Direction at TRISB5_bit;
sbit LCD_D4_Direction at TRISB0_bit;
sbit LCD_D5_Direction at TRISB1_bit;
sbit LCD_D6_Direction at TRISB2_bit;
sbit LCD_D7_Direction at TRISB3_bit;
// FIN Connexions du module LCD

/*##################################################################################
############################   PROGRAMME PRINCIPAL    ##############################
##################################################################################*/
void main(){
  
ANSELB 0;                        // Configure le PORTB en digital
  
TRISB 0b00000000;                // Configure le PORTB en Sortie
  
LATB 0;                          // Initialise à 0

  
ANSELC 0;                        // Configure le PORTC en digital
  
TRISC 0b00000000;                // Configure le PORTC en Sortie
  
LATC 0;                          // Initialise à 0

  
ANSELD 0;                        // Configure le PORTD en digital
  
TRISD 0b11111111;                // Configure le PORTD en Entrée
  
LATD 0;                          // Initialise à 0

  
Lcd_Init();                        // Initialisation du LCD

  
Lcd_Cmd(_LCD_CLEAR);               // On efface l'écran
  
Lcd_Cmd(_LCD_CURSOR_OFF);          // On arrete le curseur
  
delay_ms(500);                     // pause de 500ms

  
Lcd_Out(1,1,"0 0 0 0 0 0 0 0");  // Initialisation des valeurs à zero ( toutes les led sosnt éteintes !)
  
Lcd_Out(2,1,"7 6 5 4 3 2 1 0");  // Affichage du numero des BP sur la ligne du bas

  
ptr=&text[2];                    // Le pointeur désigne le 3iéme caractère de la variable "text" (0,1,2, /0)

 //##########################    BOUCLE INFINIE    ##################################
  
while(1) {                   // boucle sans fin

      
if (PORTD.B0 == PORTD.B1 == PORTD.B2 == PORTD.B3 == |  // Detection d'appui sur un BP
          
PORTD.B4 == PORTD.B5 == PORTD.B6 == PORTD.B7 == )
          {
            
affichage();  // Si un BP est appuyé on effectue la focntion affichage
           
}
  }

}

/*##################################################################################
############################   PROGRAMME SECONDAIRE    #############################
##################################################################################*/
 
void affichage(){        // Focntion qui determine le BP appuyé et qui change la valeur de sortie
    
      
delay_ms(30);         // delais anti-rebond

       
if (PORTD.B0 == 1){            // Si c'est le BP0 qui est appuyé
           
while (PORTD.B0 == 1);     // Anti-rebond , en bouclant tant qu'on a pas relaché
           
PORTC.B0 = ~PORTC.B0 ;     // On inverse la sortie si l'Appui est validé
           
ByteToStr (PORTC.B0,text); // On convertit la valeur de sortie en string pour pouvoir l'afficher
           
Lcd_Out(1,15,ptr)  ;       // On affiche notre valeur via le pointeur positionner sur le 3 caractères de "text"
         
}

        if (
PORTD.B1 == 1){             // Même procédé
            
while (PORTD.B1 == 1);
            
PORTC.B1 = ~PORTC.B1 ;
            
ByteToStr (PORTC.B1,text);
            
Lcd_Out(1,13,ptr)  ;
          }

        if (
PORTD.B2 == 1){              // Même procédé
            
while (PORTD.B2 == 1);
            
PORTC.B2 = ~PORTC.B2 ;
            
ByteToStr (PORTC.B2,text);
            
Lcd_Out(1,11,ptr)  ;
          }

         if (
PORTD.B3 == 1){             // Même procédé
             
while (PORTD.B3 == 1);
             
PORTC.B3 = ~PORTC.B3 ;
             
ByteToStr (PORTC.B3,text);
             
Lcd_Out(1,9,ptr)  ;
           }
       if (
PORTD.B4 == 1){               // Même procédé
           
while (PORTD.B4 == 1);
           
PORTC.B4 = ~PORTC.B4 ;
           
ByteToStr (PORTC.B4,text);
           
Lcd_Out(1,7,ptr)  ;
         }

        if (
PORTD.B5 == 1){              // Même procédé
            
while (PORTD.B5 == 1);
            
PORTC.B5 = ~PORTC.B5 ;
            
ByteToStr PORTC.B5,text);
            
Lcd_Out(1,5,ptr)  ;
          }

        if (
PORTD.B6 == 1){              // Même procédé
            
while (PORTD.B6 == 1);
            
PORTC.B6 = ~PORTC.B6 ;
            
ByteToStr (PORTC.B6,text);
            
Lcd_Out(1,3,ptr)  ;
          }

         if (
PORTD.B7 == 1){             // Même procédé
             
while (PORTD.B7 == 1);
             
PORTC.B7 = ~PORTC.B7 ;
             
ByteToStr (PORTC.B7,text);
             
Lcd_Out(1,1,ptr)  ;
           }
  }
 
C'est en faisant des erreurs, que l'on apprend le mieux !!!

LCD en serie + PIC 18F45K2
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2589
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#5 Message par paulfjujo » mer. 30 sept. 2015 20:54

bonsoir,


Code : Tout sélectionner

j'ai du ecrire char *ptr; . Peut être que c'est trop court 


ce doit etre parce que MikroC se l'a accaparé pour son propre usage !
avec un PIC18F8750 ..pas de rejet.. avec l'usage de char *p;

LCD en serie + PIC 18F45K2
Jérémy
Administrateur du site
Administrateur du site
Messages : 2722
Âge : 44
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#6 Message par Jérémy » ven. 2 oct. 2015 20:53

Bonsoir,

Pou continuer mes investigations , je cherche a affiché une variable sur le LCD en Binaire ?

j'ai beau réfléchir je ne vois pas trop comment faire ?
Le but étant de recouper avec le post de AchileT, et de faire un programme qui change un Bit d'une variable quand on appuie sur le BP correspondant et d'afficher cette variable en binaire . Ainsi je pourrais expliquer le champ de bit ! c'est l'idée générale du programme que j'ai en tête
C'est en faisant des erreurs, que l'on apprend le mieux !!!

LCD en serie + PIC 18F45K2
Guest
Confirmé
Confirmé
Messages : 800
Enregistré en : mars 2017

#7 Message par Guest » sam. 3 oct. 2015 09:44

bonjour

On utilise des structures et union pour regrouper des variables ou des bits ( dans une fonction par exemple) qui interagissent entre elles .Faire attention les structures ne sont pas uniquement des BITS .On peut aussi utiliser des structures pour optimiser son code. par exemple utiliser 4 variables pour ne changer leur valeurs que de un ou de zéro, c'est plus rapide de passer par une structure de bits pourquoi: ->modification des bits bien plus court et plus rapide et l'on gagne 3 variables .Mais je ne sais pas si c'est le but des programmes en C la j'ai un DOUTE
Après a toi de voir.

Pour ton tuto je vois bien comme cela
une structure union ->positon
une variable -> affic

-Pour la modification des bits tu peux mettre chacun des 8 bits de structure position dans un test sur etat du bit correspondant du BP et positionner le fag position en fonction de cette état. le tout bien sur dans une boucle.
-Pour affichage faire un tableau de 8 variables affic valeurs des variables 0X30 ,dans une boucle une rotation a gauche de ta variable position puis additionner affic avec une valeur nul, cela va te donner 0X30+0+RETENU. si carry =1-> 0X31, sinon 0X30

A+

LCD en serie + PIC 18F45K2
HULK28
Avatar de l’utilisateur
Amateur
Amateur
Messages : 106
Enregistré en : août 2015
Localisation : IdF

#8 Message par HULK28 » sam. 3 oct. 2015 11:45

paulfjujo a écrit :bonsoir,


Code : Tout sélectionner

j'ai du ecrire char *ptr; . Peut être que c'est trop court ?


ce doit etre parce que MikroC se l'a accaparé pour son propre usage !
avec un PIC18F8750 ..pas de rejet.. avec l'usage de char *p;


Bonjour,

tout comme il n'y aurait pas de rejet pour

Code : Tout sélectionner

char *schtroumpf;


schtroumpf, ptr ou p peu importe le nom, est un pointeur qui pointe vers une cellule mémoire de type char (donc 1 octet), c'est tout simple.

MikroC est ANSI donc conforme à la norme, ils ne s'accaparent rien dans cette écriture classique, ou bien je n'ai pas compris le sens de ta remarque.
@+
"Pour la carotte, le lapin est la parfaite incarnation du mal" -Robert Shecley-

LCD en serie + PIC 18F45K2
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2589
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#9 Message par paulfjujo » dim. 4 oct. 2015 15:49

bonjour


ma remarque parce que Jeremy signalait :
7 393 'p' Identifier redefined Structure de bits.c


alors que personellement , je n'avais aucun compterendu sur ce genre de declaration
char *p;

je suis tout à fait d'accord que le nom d'un pointeur peut etre quelconque et de longueur variable
SAUF si il est semblable à des mots reservés par le compilo!

essaie avec
char *data;
293 396 Invalid declarator expected'(' or identifier ...

alors que
char *data1; passe sans probleme
Aide toi, le ciel ou FantasPic t'aidera


Retourner vers « Langage C »

Qui est en ligne

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