Répondre à la discussion
Page 1 sur 2 1 DernièreDernière
Affichage des résultats 1 à 30 sur 54

Comment programmer un afficheur lcd en C ?



  1. #1
    tarelec

    Comment programmer un afficheur lcd en C ?


    ------

    Bonjour,
    dans le cadre d'un projet je dois programmer un afficheur lcd en c++. Je dispose de la maquette picdem2+ et du pic 18f4620 pour me familiariser. J'arrive à afficher un curseur clignotant en haut à gauche en faisant les 3 phases d'initialisation (functiunset, display control, entrymodeset) mais ensuite je n'arrive pas à écrire un caractère (ni à décaler le curseur). Quelqu'un aurait-il un exemple de programme en c pour écrire sur l'afficheur de cette maquette (picdem2+) ? Merci

    -----

  2. Publicité
  3. #2
    Niluje__

    Re : Comment programmer un afficheur lcd en C ?

    En C ou en C++ ??

    La synthaxe est sensiblement la même, mais la philosophie est complètement différente.

    Et quel est le type d'afficheur ? Utilises-tu 4 ou 8bits ?


    Sinon généralement, pour afficher un texte, il faut écrire dans la mémoire de l'afficheur dans certaines cases. Par exemple sur un 2x16, si tu écris de l'adresse 0x00 à l'adresse 0x0F, tu écris sur la partie visible de la première ligne. Si tu écris de l'adresse 0x40 à l'adresse 0x4F, tu écris sur la partie visible de la seconde ligne.

  4. #3
    tarelec

    Re : Comment programmer un afficheur lcd en C ?

    C'est en c pas en c++, au temps pour moi.
    Sinon l'afficheur c'est un 2x16, une ligne, utilisé en 4 bits. Et je pense connaitre la procédure pour écrire (encore que je me trompe peut etre en suivant des cours du net) mais sur chaque essai que je fais ça n'écrit rien.
    C'est pourquoi je voudrais un programme existant pour cet afficheur en particulier pour vérifier qu'il fonctionne correctement.

    Voila le dernier programme que j'ai testé se trouve ci-après. Sans demander d'écrire le 0 (write0() dans le main, le programme fonctionne... Sinon il ne se passe rien sur l'afficheur.

    Sinon j'ai un autre souci, je ne sais pas mesurer le temps de ma tempo, et j'ai mis la même partout bien que ce ne soit les temps minimums nécessaires entre els instructions varient... Je ne sais pas si cela peut poser problème.

    void main(void)
    {
    Tempo();

    functiunset();

    Tempo();

    displayoff();

    Tempo();

    cleardisplay();

    Tempo();

    entrymodeset();

    Tempo();

    displayon();

    Tempo();

    write0(); }

    /*prototypes de fonction*/
    void Tempo(void)
    {
    Byte i,j;
    for(i=0;i<99;i++)
    {
    for(j=0;j<99;j++)
    {}
    }
    }

    void functiunset(void)
    {
    TRISD=0b00000000;
    E=1;
    RW=0;
    RS=0;
    DB7=0;
    DB6=0;
    DB5=1;
    DB4=0;
    E=0;
    Tempo();
    E=1;
    DB7=0;
    DB6=0;
    DB5=0;
    DB4=0;
    E=0;
    }

    void displayon(void)
    {
    TRISD=0b00000000;
    E=1;
    RW=0;
    RS=0;
    DB7=0;
    DB6=0;
    DB5=0;
    DB4=0;
    E=0;
    Tempo();
    E=1;
    DB7=1;
    DB6=1;
    DB5=1;
    DB4=1;
    E=0;
    }


    void entrymodeset(void)
    {
    TRISD=0b00000000;
    E=1;
    RW=0;
    RS=0;
    DB7=0;
    DB6=0;
    DB5=0;
    DB4=0;
    E=0;
    Tempo();
    E=1;
    DB7=0;
    DB6=1;
    DB5=1;
    DB4=0;
    E=0;
    }

    void cleardisplay(void)
    {
    TRISD=0b00000000;
    E=1;
    RW=0;
    RS=0;
    DB7=0;
    DB6=0;
    DB5=0;
    DB4=0;
    E=0;
    Tempo();
    E=1;
    DB7=0;
    DB6=0;
    DB5=0;
    DB4=1;
    E=0;
    }

    void displayoff(void)
    {
    TRISD=0b00000000;
    E=1;
    RW=0;
    RS=0;
    DB7=0;
    DB6=0;
    DB5=0;
    DB4=0;
    E=0;
    Tempo();
    E=1;
    DB7=1;
    DB6=0;
    DB5=0;
    DB4=0;
    E=0;
    }

    void write0(void)
    {
    TRISD=0b00000000;
    E=1;
    RW=0;
    RS=1;
    DB7=0;
    DB6=0;
    DB5=1;
    DB4=1;
    E=0;
    Tempo();
    E=1;
    DB7=0;
    DB6=0;
    DB5=0;
    DB4=0;
    E=0;
    }

  5. #4
    Niluje__

    Re : Comment programmer un afficheur lcd en C ?

    Premièrement les prototypes de fonctions, c'est simplement

    le nom, les types d'arguments et le type de la valeur de retour :

    void Tempo(void) est un prototype de fonction


    void Tempo(void)
    {
    Byte i,j;
    for(i=0;i<99;i++)
    {
    for(j=0;j<99;j++)
    {}
    }
    }

    est une définition de fonction.



    ENsuite pour ta tempo, les PICs ont normalement des fonctions de tempo delay_ms() et delay_us().


    C'est normal que tu ne vois rien, ton PIC se bloque à la fin du programme :

    Termine ton programme par while(1) {}

  6. A voir en vidéo sur Futura
  7. #5
    tarelec

    Re : Comment programmer un afficheur lcd en C ?

    Je viens de mettre le while(1) il ne se passe rien de plus. De plus sans le write0 et le while(1) le programme tourne bien ...
    Et sinon comment fonctionne ces tempos ? Si j en veux une de 150 microsecondes apr exemple que dois ecrire ?

    Merci

  8. #6
    Niluje__

    Re : Comment programmer un afficheur lcd en C ?

    150 microsecondes

    delay_us(150);

    Le while(1) est obligatoire à la fin de tout programme principal sur microcontrôleur.

    Code:
    void main(void)
    {
    	delay_us(150);
    	functiunset();
    	
    	delay_us(150);
    
    	displayoff();
    
    	delay_us(150);
    
    	cleardisplay();
    
    	delay_us(150);
    
    	entrymodeset();
    
    	delay_us(150);
    
    	displayon();
    
    	delay_us(150);
    
    	write0();
    	
    	while (1)
    	{
    		/* Empeche  l'arret du programe */
    	}
    }
    Par contre je trouve étrange que tu ne fasses aucune configuration du pic en début du programme principale ?


    Et as-tu vérifié que E, RS, RW DB7, etc... pointe bien vers les broches demandées ?

  9. Publicité
  10. #7
    tarelec

    Re : Comment programmer un afficheur lcd en C ?

    Oui j'ai vérifié pour les broches, jai d'ailleurs le datasheet de la carte picdem2+. Et il y a ceci en début de programme:

    #include <p18f4620.h>

    /****************************** ****************************** ****************/
    /* C O N F I G U R A T I O N */
    /****************************** ****************************** ****************/
    #pragma config OSC = INTIO67
    #pragma config PWRT = OFF
    #pragma config WDT = OFF
    #pragma config BOREN = ON
    #pragma config PBADEN = OFF
    #pragma config LVP = OFF
    #pragma config XINST = OFF


    /****************************** ****************************** ****************/
    /* C O N S T A N T E S S Y M B O L I Q U E S */
    /****************************** ****************************** ****************/

    #define E PORTAbits.RA1
    #define RW PORTAbits.RA2
    #define RS PORTAbits.RA3
    #define DB7 PORTDbits.RD3
    #define DB6 PORTDbits.RD2
    #define DB5 PORTDbits.RD1

    J' ai pas mon matériel là, mais je vais réessayer en mettant les tempo avec le temps exact demandé entre chaque étape pour voir si ça marche.
    +++

  11. #8
    tarelec

    Re : Comment programmer un afficheur lcd en C ?

    c'est un détail puisque ma fonction tempo suffit, mais que faut il faire pour avoir accès aux fonctions delay dt tu me parle ?

  12. #9
    Niluje__

    Re : Comment programmer un afficheur lcd en C ?

    Normalement, elles sont présentes dans :

    #include <p18f4620.h>

  13. #10
    jorg1n

    Re : Comment programmer un afficheur lcd en C ?

    Bonjour,

    j'ai déjà utilisé la carte PICDEM2+, et j'utilisais un 18f4682, avec l'environnement MPLAB+compilateur C C18 de Microchip...quel compilateur C utilises-tu? moi j'utilisais la librairie xlcd.h du compilateur, et ça fonctionnait comme sur des roulettes...

    Bonne continuaton

  14. #11
    tarelec

    Re : Comment programmer un afficheur lcd en C ?

    Bonsoir,
    ben j'utilise le même compilateur que toi. T'as âs un exemple de programme tout fair pour écrire à m'envoyer stp ?
    Merci
    +++

  15. #12
    jorg1n

    Re : Comment programmer un afficheur lcd en C ?

    Bonjour,

    pour ma part, j'étais allez sur le site de l'académie de aix-marseille, et ils ont un tas de cours sur les PIC, dont un "TP" sur la carte PICDEM2+, pour faire fonctionner l'afficheur. MAIS, la librairie fournit avec le compilateur C18, n'est pas complétement correcte, mais le fichier fournit par l'académie te les donne, il faut les remplacer dans ton dossier \MCC18.
    Voila le lien:
    http://www.aix-mrs.iufm.fr/formation...indexPIC_C.htm
    pour télécharger le "TP" et la mise à jour de la bibliothèque xlcd, tu va sur le lien :
    http://www.aix-mrs.iufm.fr/formation...TPMCC18v14.zip

    Ensuite pour installer la mise à jour, va dans le pdf "MCC18 pour PIC 18", voila le lien:
    http://www.aix-mrs.iufm.fr/formation...CC18%20v14.pdf
    et c'est à la page 18/56 (mais lit bien TOUT le document, il est bien réalisé , instructif...et en français).
    Donc voila ce que je peu faire pour toi...mais avec tout ça, tu es sur d'y arriver. J'ai effectué la même procédure, et ça a marché...
    Bon courage, et hésiste pas à me contacter.
    Bonne journée

  16. Publicité
  17. #13
    tarelec

    Re : Comment programmer un afficheur lcd en C ?

    Ok je vais tenter çà, je te remercie.

  18. #14
    jorg1n

    Re : Comment programmer un afficheur lcd en C ?

    Tiens moi au courant...
    Bon courage

  19. #15
    tarelec

    Re : Comment programmer un afficheur lcd en C ?

    Bon j'ai lu les pages concernées du cours d'aix marseille et téléchargé le fichier de tp que tu ma mis en 2e lien. Par contre, j'avais récupéré MCC18 sur le site de microchip bien avant donc est-ce que je dois toujours remplacer le fichier xlcd.h ? Et sinon il faut juste remplacer ce fichier dans MCC18 par celui que je récupère dans ce que j'ai téléchargé (sur ton 2e lien) ?

  20. #16
    jorg1n

    Re : Comment programmer un afficheur lcd en C ?

    Oui , tu fais comme c'est écris dans le .pdf...et normalement, tout doit fonctionner ( après avoir configurer le soft) pour ton cablage de l'afficheur bien sur.

  21. #17
    tarelec

    Re : Comment programmer un afficheur lcd en C ?

    Dsl si je demande qqc chose de peut-être trivial mais dans le pdf c'est écrit:

    Pour pouvoir utiliser la bibliothèque XLCD de mcc18 pour piloter l'afficheur de la carte PICDEM2plus
    il faut :
    1 - Copier le fichier modifié xlcd.h dans le répertoire \mcc18\h du disque d'installation
    2 - Copier le fichier modifié openxlcd.c dans \mcc18\src\pmc\XLCD\18Cxx\
    3 - Recompiler la bibliothèque p18f452.lib --> makeonep18f242 18f452
    Un fichier de commande fourni avec les exemples du cours, install.bat effectue ces tâches
    automatiquement

    Donc copier les fichiers ok, mais qu'entend-on par recompilerla bibliothèque ? (moi c'est un pic 18f4620)

    Et ne faut-il pas copier aussi le fichier initxlcd.h dont on se sert dans certains programme d'écriture du tp ?

    Merci de ton aide, c'est sympa!

  22. #18
    jorg1n

    Re : Comment programmer un afficheur lcd en C ?

    Bonjour,

    mais qu'entend-on par recompilerla bibliothèque ?
    moi, je ne faisais que recompiler tout mon projet sous MPLAB...et ça fonctionnait.

    Et ne faut-il pas copier aussi le fichier initxlcd.h dont on se sert dans certains programme d'écriture du tp ?
    mon fichier main.c se présentai sous cette forme là:
    Code:
    #include <p18f4682.h> //pour toi se sera le tien
    #include "initxlcd.c"
    [...]
    void main (void)
    {
    
    OpenXLCD(FOUR_BIT & LINES_5X7 );	//Initialisation du LCD en 4 bits, 2x16
    DelayXLCD();						//Temporisation pour LCD
    
    
    SetDDRamAddr(0x00);	// positionne le curseur en x,y (1ère ligne-1er caractère
    putrsXLCD("BONJOUR");   
    DelayXLCD();			//Temporisation de 20 ms
    SetDDRamAddr(0x40);	  // positionne le curseur en x,y (Début 2ème ligne)
    putrsXLCD("TARELEC");  
    
    }//fin main
    Cet un exemple...
    Et sous mon projet MPLAB, dans source files, j'ai mis les fichiers:
    busyxlcd.c
    openxlcd.c
    putrxlcd.c
    readaddr.c
    readdata.c
    setcgram.c
    setddram.
    wcmdxlcd.c
    writdata.c
    et bien sur ton main.c
    Et il faut que tous ces fichiers la se trouve das le dossier de ton projet MPLAB où il y a ton main.c
    Et c'est tout...
    Tiens moi au courant, et bon courage

  23. Publicité
  24. #19
    tarelec

    Re : Comment programmer un afficheur lcd en C ?

    Bonsoir,
    donc là je vais modifier le fichier xlcd.h, voici un extrait du fichier :

    /* Interface type 8-bit or 4-bit
    * For 8-bit operation uncomment the #define BIT8
    */
    /* #define BIT8 */

    /* When in 4-bit interface define if the data is in the upper
    * or lower nibble. For lower nibble, comment the #define UPPER
    */
    /* #define UPPER */

    /* DATA_PORT defines the port to which the LCD data lines are connected */

    #define DATA_PORT PORTD
    #define TRIS_DATA_PORT TRISD

    /* CTRL_PORT defines the port where the control lines are connected.
    * These are just samples, change to match your application.
    */

    #define RW_PIN PORTDbits.RD1 /* PORT for RW */
    #define TRIS_RW DDRDbits.RD1 /* TRIS for RW */
    #define RS_PIN PORTDbits.RD0 /* PORT for RS */
    #define TRIS_RS DDRDbits.RD0 /* TRIS for RS */
    #define E_PIN PORTDbits.RD2 /* PORT for E */
    #define TRIS_E DDRDbits.RD2 /* TRIS for E */



    Moi j'ai les branchements suivants sur ma maquette :
    E PORTAbits.RA1
    RW PORTAbits.RA2
    RS PORTAbits.RA3
    DB7 PORTDbits.RD3
    DB6 PORTDbits.RD2
    DB5 PORTDbits.RD1
    DB4 PORTDbits.RD0


    Donc à la fin je vais devoir mettre :
    #define RW_PIN PORTAbits.RA2 /* PORT for RW */
    #define TRIS_RW DDRAbits.RA2 /* TRIS for RW */
    #define RS_PIN PORTAbits.RA3 /* PORT for RS */
    #define TRIS_RS DDRAbits.RA3 /* TRIS for RS */
    #define E_PIN PORTAbits.RA1 /* PORT for E */
    #define TRIS_E DDRAbits.RA1 /* TRIS for E */

    je me trompe pas ?

    Et par contre comment signaler que c'est les pins 0 à 3 du port d qu'on utlise pour envoyer les données ?

    Merci

  25. #20
    tarelec

    Re : Comment programmer un afficheur lcd en C ?

    Bon j'ai testé ce que j'ai dit plus haut, j'ai mis tous les fichiers sources que tu m as dit en les mettant ds le même dossier que la main, j'ai indiqué les chemins d'acés aux fichiers xlcd.h et p18f4620.h ( qui sont utilisé dans chacun des fichiers sources dont on se sert ) et j'ai modifié le fichier xlcd comme je pensaisle faire dans mon dernier post. Par contre quand je compile j'ai une liste d'erreurs de type "mismatch". T'as une idée de ce que ça peut être ? Voici la liste d'erreurs :

    D:\stef\MCC18\h\p18f4620.h:44: Error [1109] type mismatch in redeclaration of 'PORTAbits'
    D:\stef\MCC18\h\p18f4620.h:113 :Error [1109] type mismatch in redeclaration of 'PORTCbits'
    D:\stef\MCC18\h\p18f4620.h:340 :Error [1109] type mismatch in redeclaration of 'OSCTUNEbits'
    D:\stef\MCC18\h\p18f4620.h:390 :Error [1109] type mismatch in redeclaration of 'PIE2bits'
    D:\stef\MCC18\h\p18f4620.h:407 :Error [1109] type mismatch in redeclaration of 'PIR2bits'
    D:\stef\MCC18\h\p18f4620.h:424 :Error [1109] type mismatch in redeclaration of 'IPR2bits'
    D:\stef\MCC18\h\p18f4620.h:467 :Error [1109] type mismatch in redeclaration of 'TXSTAbits'
    D:\stef\MCC18\h\p18f4620.h:512 :Error [1109] type mismatch in redeclaration of 'CVRCONbits'
    D:\stef\MCC18\h\p18f4620.h:572 :Error [1109] type mismatch in redeclaration of 'CCP2CONbits'
    D:\stef\MCC18\h\p18f4620.h:591 :Error [1109] type mismatch in redeclaration of 'CCP1CONbits'
    D:\stef\MCC18\h\p18f4620.h:711 :Error [1109] type mismatch in redeclaration of 'T2CONbits'
    D:\stef\MCC18\h\p18f4620.h:752 :Error [1109] type mismatch in redeclaration of 'RCONbits'
    D:\stef\MCC18\h\p18f4620.h:825 :Error [1109] type mismatch in redeclaration of 'LVDCONbits'
    D:\stef\MCC18\h\p18f4620.h:836 :Error [1109] type mismatch in redeclaration of 'OSCCONbits'
    D:\stef\MCC18\h\p18f4620.h:854 :Error [1109] type mismatch in redeclaration of 'T0CONbits'
    D:\stef\MCC18\h\p18f4620.h:988 :Error [1109] type mismatch in redeclaration of 'STKPTRbits'
    D:\stef\MCC18\src\extended\pmc \XLCD\openxlcd.c:35:Error [1205] unknown member 'PSPMODE' in '__tag_146'
    D:\stef\MCC18\src\extended\pmc \XLCD\openxlcd.c:35:Error [1131] type mismatch in assignment

  26. #21
    jorg1n

    Re : Comment programmer un afficheur lcd en C ?

    Bonjour,
    Et par contre comment signaler que c'est les pins 0 à 3 du port d qu'on utlise pour envoyer les données ?
    Il faut que dans le fichier xlcd.h, tu définis le type de connexion que tu utilises:
    Code:
    /* Interface type 8-bit or 4-bit
     * For 8-bit operation uncomment the #define BIT8
     */
    /* #define BIT8 */
    
    /* When in 4-bit interface define if the data is in the upper
     * or lower nibble.  For lower nibble, comment the #define UPPER
     */
    /* #define UPPER */
    Il faut donc pour toi que tu décoches :
    Code:
    #define UPPER
    Ensuite pour les erreurs, il s'agit (si je me trompe pas ) d'une redéclaration des registres, alors supprime les chemins d'accès du fichier p18f4620.h ( pour infos, moi je n'avais redéfinit aucun chemin des fichiers xlcd.h et p18fxxxx.h)
    Essaye peut être.

    PS:je ne pourrai pas te répondre ce weekend...

  27. #22
    tarelec

    Re : Comment programmer un afficheur lcd en C ?

    Bonjour,

    mais j'avais justement indiqué les chemins d'accès parce sinon il ne les trouve pas :
    D:\stef\MCC18\src\extended\pmc \XLCD\busyxlcd.c:2:Error [1027] unable to locate 'p18f4620.h'
    D:\stef\MCC18\src\extended\pmc \XLCD\busyxlcd.c:3:Error [1027] unable to locate 'xlcd.h'

    J'avais même essayé de copier ces deux fichiers pour les mettre dans le dossier qui contient mon main.c et tous les autres fichiers sources mais il ne les trouvait pas non plus...

    Et sinon c'est logique de mettre un # define UPPER alors que j'utilise les pins 0à3 du port d ? Instinctivemet j'aurais penché pour un LOWER mais à vrai dire j'en sais rien du tout.

    Merci beaucoup, bon week end

  28. #23
    jorg1n

    Re : Comment programmer un afficheur lcd en C ?

    Désolé,

    en fait, ne fait rien , ne décoche rien du tout,c'est une erreur de ma part:
    Code:
    /* When in 4-bit interface define if the data is in the upper
     * or lower nibble.  For lower nibble, comment the #define UPPER
     */
    /* #define UPPER */
    Tu laisse donc commenté UPPER, il se mettera tout seul en mode LOWER...

    en ce qui concerne tes erreurs...je ne vois pas trop alors.
    Je vais retrouver mes dossiers, je jette un cou d'oeil.
    A tout a lheure

  29. #24
    jorg1n

    Re : Comment programmer un afficheur lcd en C ?

    Je viens de regarder, et dans mon projet j'ai:
    sources files:
    busyxlcd.c
    openxlcd.c
    putrxlcd.c
    readaddr.c
    readdata.c
    setcgram.c
    setddram.
    wcmdxlcd.c
    writdata.c
    et bien sur ton main.c

    dans linker: 18f4682.lkr (mais là tu met le tiens)

    et dans \project\built options\project\ onglet directories\library search path\ je n'ai que C:\MCC18\lib
    Je n'ai que ça...

  30. Publicité
  31. #25
    tarelec

    Re : Comment programmer un afficheur lcd en C ?

    Au début de ton fichier busyxlcd.c t'as bien quelquechose du genre :

    #include <p18f4620.h>
    #include <xlcd.h>

    ?

  32. #26
    jorg1n

    Re : Comment programmer un afficheur lcd en C ?

    Non j'ai exactement :
    Code:
    #include <p18cxxx.h>
    #include <xlcd.h>
    et ça dans tous les fichiers...sauf dans initxlcd

  33. #27
    mister_e

    Re : Comment programmer un afficheur lcd en C ?

    D'aussi loins qe je me rappelle PIC18cxxx n'existe pas chez microchip
    Steve

  34. #28
    jorg1n

    Re : Comment programmer un afficheur lcd en C ?

    Bonjour,

    en tout cas mon programme fonctionnait, et après vérification, il y a bien un fichier 18cxxx.h sous MCC18\h.
    Bonne continuation

  35. #29
    tarelec

    Re : Comment programmer un afficheur lcd en C ?

    Ah d'accord j'avais remplacé le p18cxxx de chaque fichier alors qu'il ne faut pas. Du coup j'ai plus que les deux erreurs liées au fichier openxlcd.h. Les deux portent sur la ligne suivante:

    DDREbits.PSPMODE = 0; /* Configure le port D en mode Entrées / Sorties générales */

    Tu peux regarder ton fichier et me dire ce que tu as ? Merci

  36. #30
    paterson

    Re : Comment programmer un afficheur lcd en C ?

    Moi , j'ai réaliser http://robotpassion.free.fr/index.php?showtopic=2569

    en c , il faudras juste voir les masque que j'ai du utiliser .
    Le 14 mars démonstration de robot mini sumo a Arles.

Page 1 sur 2 1 DernièreDernière

Discussions similaires

  1. programmer un afficheur lcd avec pic 16f877
    Par zamanu dans le forum Électronique
    Réponses: 5
    Dernier message: 08/05/2011, 20h49
  2. Réponses: 9
    Dernier message: 10/04/2009, 08h15
  3. Réponses: 4
    Dernier message: 01/04/2008, 21h15
  4. comment programmer un PIC pour un afficheur
    Par madbrain dans le forum Électronique
    Réponses: 10
    Dernier message: 14/06/2007, 15h29
  5. Comment fonctionne un afficheur LCD ( trame)
    Par paterson dans le forum Électronique
    Réponses: 6
    Dernier message: 09/03/2007, 22h52
Découvrez nos comparatifs produits sur l'informatique et les technologies.