Comment programmer un afficheur lcd en C ? - Page 2
Répondre à la discussion
Page 2 sur 2 PremièrePremière 2
Affichage des résultats 31 à 54 sur 54

Comment programmer un afficheur lcd en C ?



  1. #31
    jorg1n

    Re : Comment programmer un afficheur lcd en C ?


    ------

    Bonjour,
    désolé de te répondre que maintenant, je regarde ça se matin et je te tiens au courant...

    -----

  2. #32
    jorg1n

    Re : Comment programmer un afficheur lcd en C ?

    Déjà, il s'agit plutot du fichier openxlcd.C et pas .h, ensuite peut tu nous dire quelle est le type d'erreur.
    Pour ma part, j'ai la même chose d'écrit que toi..

  3. #33
    invitee3b1bf3c

    Re : Comment programmer un afficheur lcd en C ?

    Bonjour,
    oui c'est bien un fichier.c. J'ai les deux erreurs suivantes :

    D:\stef\MCC18\src\extended\pmc \XLCD\openxlcd.c:35:Error [1205] unknown member 'PSPMODE' in '__tag_38'
    D:\stef\MCC18\src\extended\pmc \XLCD\openxlcd.c:35:Error [1131] type mismatch in assignment

    Et là je te mets mon fichier openxclc.c , si tu peux me dire en quoi le tien diffère:

    #include <p18cxxx.h>
    #include <xlcd.h>

    void Delay10TCYx(PARAM_SCLASS unsigned char);
    void Delay100TCYx(PARAM_SCLASS unsigned char);
    void Delay10KTCYx(PARAM_SCLASS unsigned char);
    void Delay1KTCYx(PARAM_SCLASS unsigned char);

    /****************************** ****************************** ********
    * Function Name: OpenXLCD (Pour PICDEM2plus) *
    * Return Value: void *
    * Parameters: lcdtype: sets the type of LCD (lines) *
    * Description: This routine configures the LCD. Based on *
    * the Hitachi HD44780 LCD controller. The *
    * routine will configure the I/O pins of the *
    * microcontroller, setup the LCD for 4- or *
    * 8-bit mode and clear the display. The user *
    * must provide three delay routines: *
    * DelayFor18TCY() provides a 18 Tcy delay *
    * DelayPORXLCD() provides at least 15ms delay *
    * DelayXLCD() provides at least 5ms delay *
    ****************************** ****************************** ********/

    void OpenXLCD(unsigned char lcdtype)
    {
    // The data bits must be either a 8-bit port or the upper or
    // lower 4-bits of a port. These pins are made into inputs
    ADCON1bits.PCFG0 = 0; /* Permettre au port RA de fonctionner en numérique */
    ADCON1bits.PCFG1 = 1; /* sauf pour le Bit RA0 pour la conversion anal/num */
    ADCON1bits.PCFG2 = 1;
    ADCON1bits.PCFG3 = 1;
    TRISAbits.TRISA1 = 0; /* Config des Bits du port RA1 à RA3 en Sortie pour */
    TRISAbits.TRISA2 = 0; /* l'afficheur LCD */
    TRISAbits.TRISA3 = 0;
    DDREbits.PSPMODE = 0; /* Configure le port D en mode Entrées / Sorties générales */

    TRIS_DATA_PORT &= 0xf0;
    DATA_PORT &= 0b00000011;

    TRIS_RW = 0; // All control signals made outputs
    TRIS_RS = 0;
    TRIS_E = 0;
    RW_PIN = 0; // R/W pin made low
    RS_PIN = 0; // Register select pin made low
    E_PIN = 0; // Clock pin made low

    // Delay for 15ms to allow for LCD Power on reset
    DelayPORXLCD();

    // Setup interface to LCD
    TRIS_DATA_PORT &= 0xf0;
    DATA_PORT &= 0xf0;
    DATA_PORT |= 0x03; // Function set cmd(4-bit interface)

    E_PIN = 1; // Clock the cmd in
    Delay100TCYx(1);
    E_PIN = 0;

    // Delay for at least 4.1ms
    DelayXLCD();

    // Setup interface to LCD
    DATA_PORT &= 0xf0; // Function set cmd(4-bit interface)
    DATA_PORT |= 0x03;

    E_PIN = 1; // Clock the cmd in
    Delay10TCYx(5);
    E_PIN = 0;

    // Delay for at least 100us
    Delay100TCYx(20);

    // Setup interface to LCD
    DATA_PORT &= 0xf0; // Function set cmd(4-bit interface)
    DATA_PORT |= 0x03;

    E_PIN = 1; // Clock cmd in
    Delay10TCYx(5);
    E_PIN = 0;

    TRIS_DATA_PORT |= 0xf0; // Make data nibble output
    DATA_PORT &= 0xf0; // Function set cmd(4-bit interface)
    DATA_PORT |= 0x02;

    E_PIN = 1; // Clock cmd in
    Delay10TCYx(5);
    E_PIN = 0;

    // Set data interface width, # lines, font
    while(BusyXLCD()); // Wait if LCD busy
    WriteCmdXLCD(0b00101000); // Function set cmd

    // Turn the display on then off
    while(BusyXLCD()); // Wait if LCD busy
    WriteCmdXLCD(0b00001000); // Display OFF/Blink OFF
    while(BusyXLCD()); // Wait if LCD busy
    WriteCmdXLCD(0b00001101); // Display ON/Blink ON

    // Clear display
    while(BusyXLCD()); // Wait if LCD busy
    WriteCmdXLCD(0b00000110); // Clear display

    // Set entry mode inc, no shift
    while(BusyXLCD()); // Wait if LCD busy
    WriteCmdXLCD(0b00000001); // Entry Mode

    // Set DD Ram address to 0
    while(BusyXLCD()); // Wait if LCD busy
    SetDDRamAddr(0); // Set Display data ram address to 0

    return;
    }

  4. #34
    jorg1n

    Re : Comment programmer un afficheur lcd en C ?

    J'ai comparé le fichier Openxlcd.c, et c'est exactement le même...
    Et en ce qui concerne l'erreur, je vois pas trop...n'aurais-tu pas oublié de remettre un #include <p18cxxx.h> quelque part???

  5. #35
    invitee3b1bf3c

    Re : Comment programmer un afficheur lcd en C ?

    Bonjour,
    bon j'ai été voir un prof qui m'a dit de supprimer cette ligne DDRE...

    Maintenant j'ai une nouvelle erreur mismatch :

    D:\stef\MCC18\src\traditional\ pmc\XLCD\putrxlcd.c:17:Error [1109] type mismatch in redeclaration of 'putrsXLCD'
    Halting build on first failure as requested.
    BUILD FAILED: Tue Apr 22 11:15:11 2008

  6. #36
    jorg1n

    Re : Comment programmer un afficheur lcd en C ?

    Bonjour,
    peut tu me dire comment est déclaré cette fonction dans le fichier :
    C:\...\MCC18\h\xlcd.h
    de meme que dans ton fichier :
    C:\MCC18\src\pmc_common\XLCD\p utrxlcd.c
    Je crois qu'il y avait un problème dans cette fonction...
    PS:As tu eu des problèmes a te connecté sur le forum ce matin?

  7. #37
    invitee3b1bf3c

    Re : Comment programmer un afficheur lcd en C ?

    Voila le fichier putrxlcd.c:
    Code:
    /* $Id: putrxlcd.c,v 1.1 2003/12/09 22:52:09 GrosbaJ Exp $ */
    #include <p18cxxx.h>
    #include <xlcd.h>
    
    /********************************************************************
    *       Function Name:  putrsXLCD
    *       Return Value:   void
    *       Parameters:     buffer: pointer to string
    *       Description:    This routine writes a string of bytes to the
    *                       Hitachi HD44780 LCD controller. The user
    *                       must check to see if the LCD controller is
    *                       busy before calling this routine. The data
    *                       is written to the character generator RAM or
    *                       the display data RAM depending on what the
    *                       previous SetxxRamAddr routine was called.
    ********************************************************************/
    void putrsXLCD(const rom char *buffer)
    {
            while(*buffer)                  // Write data to LCD up to null
            {
                    while(BusyXLCD());      // Wait while LCD is busy
                    WriteDataXLCD(*buffer); // Write character to LCD
                    buffer++;               // Increment buffer
            }
            return;
    }
    
    
    et le fichier xlcd.h:
    
    
    //    xlcd.h Modifié pour PICDEM2plus
    //    voir fin fichier xlcd.h 
    //    C.D 11/2005
    
    #ifndef __XLCD_H
    #define __XLCD_H
    #include <delays.h>	// temporisation pour afficheur LCD
    
    
    
    /* PIC 17Cxxx and 18Cxxx XLCD peripheral routines.
     *
     *   Notes:
     *      - These libraries routines are written to support the
     *        Hitachi HD44780 LCD controller.
     *      - The user must define the following items:
     *          - The LCD interface type (4- or 8-bits)
     *          - If 4-bit mode
     *              - whether using the upper or lower nibble
     *          - The data port
     *              - The tris register for data port
     *              - The control signal ports and pins
     *              - The control signal port tris and pins
     *          - The user must provide three delay routines:
     *              - DelayFor18TCY() provides a 18 Tcy delay
     *              - DelayPORXLCD() provides at least 15ms delay
     *              - DelayXLCD() provides at least 5ms delay
     */
    
    
    
    /* 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 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 */
    
    
    /* Display ON/OFF Control defines */
    #define DON         0b00001111  /* Display on      */
    #define DOFF        0b00001011  /* Display off     */
    #define CURSOR_ON   0b00001111  /* Cursor on       */
    #define CURSOR_OFF  0b00001101  /* Cursor off      */
    #define BLINK_ON    0b00001111  /* Cursor Blink    */
    #define BLINK_OFF   0b00001110  /* Cursor No Blink */
    #define CLEAR_DISP  0b00000001  /* Clear Display   */
    #define RET_HOME	0b00000010  /* Return Home     */
    
    
    /* Cursor or Display Shift defines */
    #define SHIFT_CUR_LEFT    0b00010011  /* Cursor shifts to the left   */
    #define SHIFT_CUR_RIGHT   0b00010111  /* Cursor shifts to the right  */
    #define SHIFT_DISP_LEFT   0b00011011  /* Display shifts to the left  */
    #define SHIFT_DISP_RIGHT  0b00011111  /* Display shifts to the right */
    
    /* Function Set defines */
    #define FOUR_BIT   0b00101111  /* 4-bit Interface               */
    #define EIGHT_BIT  0b00111111  /* 8-bit Interface               */
    #define LINE_5X7   0b00110011  /* 5x7 characters, single line   */
    #define LINE_5X10  0b00110111  /* 5x10 characters               */
    #define LINES_5X7  0b00111011  /* 5x7 characters, multiple line */
    
    
    #define PARAM_SCLASS auto
    #define MEM_MODEL far  /* Change this to near for small memory model */
    
    /* OpenXLCD
     * Configures I/O pins for external LCD
     */
    void OpenXLCD(PARAM_SCLASS unsigned char);
    
    /* SetCGRamAddr
     * Sets the character generator address
     */
    void SetCGRamAddr(PARAM_SCLASS unsigned char);
    
    /* SetDDRamAddr
     * Sets the display data address
     */
    void SetDDRamAddr(PARAM_SCLASS unsigned char);
    
    /* BusyXLCD
     * Returns the busy status of the LCD
     */
    unsigned char BusyXLCD(void);
    
    /* ReadAddrXLCD
     * Reads the current address
     */
    unsigned char ReadAddrXLCD(void);
    
    /* ReadDataXLCD
     * Reads a byte of data
     */
    char ReadDataXLCD(void);
    
    /* WriteCmdXLCD
     * Writes a command to the LCD
     */
    void WriteCmdXLCD(PARAM_SCLASS unsigned char);
    
    /* WriteDataXLCD
     * Writes a data byte to the LCD
     */
    void WriteDataXLCD(PARAM_SCLASS char);
    
    /* putcXLCD
     * A putc is a write
     */
    #define putcXLCD WriteDataXLCD
    
    /* putsXLCD
     * Writes a string of characters to the LCD
     */
    void putsXLCD(PARAM_SCLASS char *);
    
    /* putrsXLCD
     * Writes a string of characters in ROM to the LCD
     */
    void putrsXLCD(PARAM_SCLASS const MEM_MODEL rom char *);
    
    /* User defines these routines according to the oscillator frequency */
    
    extern void DelayFor18TCY(void);
    extern void DelayPORXLCD(void);
    extern void DelayXLCD(void);
    Dernière modification par HULK28 ; 22/04/2008 à 11h30. Motif: ajout des balises "code"

  8. #38
    invitee3b1bf3c

    Re : Comment programmer un afficheur lcd en C ?

    oui oui je n'arrivais pas à acéder au forum ce matin

  9. #39
    jorg1n

    Re : Comment programmer un afficheur lcd en C ?

    J'ai les mêmes fichiers que toi... mais je ne sais plus si j'ai les bon, car je bosse avec un autre PC, et je ne me suis pas resservi de la librairie, mais je me souviens qu'il fallait modifier quelque chose...dans la décllaration de la fonction..mais quoi??
    il doit y avoir un sujet sur ce forum que j'avais créer et on mavait donné la solution, mais je ne le retrouve pas...
    je vais réessayer de retrouver...

  10. #40
    jorg1n

    Re : Comment programmer un afficheur lcd en C ?

    JE L'AI.....
    http://forums.futura-sciences.com/sh...librairie+xlcd
    Lit le sujet..et tu trouveras ta solution...
    c'est dans la déclaration de putrsxlcd(...far...)
    voila
    ça devrait marcher...

  11. #41
    jorg1n

    Re : Comment programmer un afficheur lcd en C ?

    Regarde aussi, si il ne prend les bon fichier(fichiers que tu as modifié grace au site AIX MARSEILLE....), et pas ceux de la librairie de base..car j'avais eu ce problème...

  12. #42
    invitee3b1bf3c

    Re : Comment programmer un afficheur lcd en C ?

    Ok je regarde ça et te tiens au courant
    Merci

  13. #43
    invitee3b1bf3c

    Re : Comment programmer un afficheur lcd en C ?

    J'ai rajouter le far dans le fichier putrxlcd.c, jai bien maintenant:

    void putrsXLCD(const far rom char *buffer)

    {...}

    Quand je compile je n'ai plus d'erreur: build succeeded

    Mais il ne se passe rien sur l'afficheur (enfin je vois juste les rectangles de la ligne du haut en bleu clair) ...

    J'ai essayé de rajouter un while(1); à la fin du programme mais ça en change rien

  14. #44
    jorg1n

    Re : Comment programmer un afficheur lcd en C ?

    As tu regarder le contraste de ton afficheur...
    Ou le paramètrage pour la vitesse du quartz...car il se peut que l'afficheur n'est pas le temps d'acquérir toutes les infos..
    Dernière modification par jorg1n ; 22/04/2008 à 12h30.

  15. #45
    invitee3b1bf3c

    Re : Comment programmer un afficheur lcd en C ?

    Euh comment on règle la vitesse du quartz ?

  16. #46
    jorg1n

    Re : Comment programmer un afficheur lcd en C ?

    Euh comment on règle la vitesse du quartz ?
    Dans la configuration des bits...
    soit dans l'onglet sous MPLAB: configure\configuration bits ou en faisant:
    Code:
    #pragma config OSC = HS			//OSCILLATOR
    Et la tu met HS ou XT ...tout dépend ton type d'oscillateur, et regarde la doc de ton pic..

  17. #47
    invitee3b1bf3c

    Re : Comment programmer un afficheur lcd en C ?

    Bonjour,

    bon ben en fait c'était pas un pb de quartz, donc mon prof m a conseillé de reprendre le pb du début et de reprogrammer sans se servir des fichiers du dossier xlcd.

    Merci qd même pour ton aide

    Bon week end

  18. #48
    RISC

    Re : Comment programmer un afficheur lcd en C ?

    Salut,

    Tu trouveras pas mal d'exemples de pilotage de modules LCD externes ici :
    http://www.sxlist.com/techref/io/lcd/pic.htm

    a+

  19. #49
    invite1109a825

    Re : Comment programmer un afficheur lcd en C ?

    Bonjour à tous ! Désole je ne suis malheureusement pas là pour apporter des réponses mais pour poser des questions =). Il se trouve que depuis peu j'essaye de programmer un LCD (2*16) en mode 4 bits avec un pic 18F4550. Le problème est le suivant : mon curseur clignote environ 1s (selon les délais mis dans mon code) puis passe tout à droite de la première ligne, puis s'éteint. Pourtant dans ma procédure, il devrait si le code est correct afficher un caractère (A en l'occurrence). Je n'arrive pas à afficher un quelconque symbole. Merci d'avance pour votre aide. Voici mon code (un peu bordélique car je ne dispose pas d'un PORT entier) :

    // Initialisation du LCD.
    Delay10KTCYx(1); // Démarrage de l'écran.
    PORTBbits.RB0 = 0; // RS en niveau bas : le LCD attend des instructions (et non des données).
    PORTBbits.RB1 = 0; // R/W en mode écriture.
    Delay10KTCYx(1);

    // Etape 1 (*3) : Mode 8 bits / 1 ligne / matrice 5*8.
    PORTBbits.RB2 = 1; // E à 1 puis à 0, après un délai : validation de la configuration.
    Delay10KTCYx(1);

    PORTBbits.RB6 = 0; // DB7.
    PORTBbits.RB5 = 0; // DB6.
    PORTBbits.RB4 = 1; // DB5.
    PORTBbits.RB3 = 1; // DB4.

    Delay10KTCYx(1);
    PORTBbits.RB2 = 0;
    Delay10KTCYx(1);

    PORTBbits.RB2 = 1; // E à 1 puis à 0, après un délai : validation de la configuration.
    Delay10KTCYx(1);

    PORTBbits.RB6 = 0; // DB7.
    PORTBbits.RB5 = 0; // DB6.
    PORTBbits.RB4 = 1; // DB5.
    PORTBbits.RB3 = 1; // DB4.

    Delay10KTCYx(1);
    PORTBbits.RB2 = 0;
    Delay10KTCYx(1);

    PORTBbits.RB6 = 0; // DB7.
    PORTBbits.RB5 = 0; // DB6.
    PORTBbits.RB4 = 1; // DB5.
    PORTBbits.RB3 = 1; // DB4.

    Delay10KTCYx(1);
    PORTBbits.RB2 = 0;
    Delay10KTCYx(1);

    PORTBbits.RB2 = 1; // E à 1 puis à 0, après un délai : validation de la configuration.
    Delay10KTCYx(1);

    // Etape 2 : Mode 4 bits.
    PORTBbits.RB6 = 0; // DB7.
    PORTBbits.RB5 = 0; // DB6.
    PORTBbits.RB4 = 1; // DB5.
    PORTBbits.RB3 = 0; // DB4.

    Delay10KTCYx(1);
    PORTBbits.RB2 = 0;
    Delay10KTCYx(1);

    // Etape 3 : Mode 4 bits / 2 lignes / 5*8.
    PORTBbits.RB6 = 0; // DB7.
    PORTBbits.RB5 = 0; // DB6.
    PORTBbits.RB4 = 1; // DB5.
    PORTBbits.RB3 = 0; // DB4.

    Delay10KTCYx(1);
    PORTBbits.RB2 = 0;
    Delay10KTCYx(1);

    PORTBbits.RB2 = 1; // E à 1 puis à 0, après un délai : validation de la configuration.
    Delay10KTCYx(1);

    PORTBbits.RB6 = 1; // DB7.
    PORTBbits.RB5 = 0; // DB6.
    PORTBbits.RB4 = 0; // DB5.
    PORTBbits.RB3 = 0; // DB4.

    Delay10KTCYx(1);
    PORTBbits.RB2 = 0;
    Delay10KTCYx(1);

    // Etape 4 : Display on / cursor on / blink on.
    PORTBbits.RB2 = 1; // E à 1 puis à 0, après un délai : validation de la configuration.
    Delay10KTCYx(1);

    PORTBbits.RB6 = 0; // DB7.
    PORTBbits.RB5 = 0; // DB6.
    PORTBbits.RB4 = 0; // DB5.
    PORTBbits.RB3 = 0; // DB4.

    Delay10KTCYx(1);
    PORTBbits.RB2 = 0;
    Delay10KTCYx(1);

    PORTBbits.RB2 = 1; // E à 1 puis à 0, après un délai : validation de la configuration.
    Delay10KTCYx(1);

    PORTBbits.RB6 = 1; // DB7.
    PORTBbits.RB5 = 1; // DB6.
    PORTBbits.RB4 = 1; // DB5.
    PORTBbits.RB3 = 1; // DB4.

    Delay10KTCYx(1);
    PORTBbits.RB2 = 0;
    Delay10KTCYx(1);

    // Etape 5 : Clear display.
    PORTBbits.RB2 = 1; // E à 1 puis à 0, après un délai : validation de la configuration.
    Delay10KTCYx(1);

    PORTBbits.RB6 = 0; // DB7.
    PORTBbits.RB5 = 0; // DB6.
    PORTBbits.RB4 = 0; // DB5.
    PORTBbits.RB3 = 0; // DB4.

    Delay10KTCYx(1);
    PORTBbits.RB2 = 0;
    Delay10KTCYx(1);

    PORTBbits.RB2 = 1; // E à 1 puis à 0, après un délai : validation de la configuration.
    Delay10KTCYx(1);

    PORTBbits.RB6 = 0; // DB7.
    PORTBbits.RB5 = 0; // DB6.
    PORTBbits.RB4 = 0; // DB5.
    PORTBbits.RB3 = 1; // DB4.

    Delay10KTCYx(1);
    PORTBbits.RB2 = 0;
    Delay10KTCYx(1);

    // Etape 6 : Cursor moves to right.
    PORTBbits.RB2 = 1; // E à 1 puis à 0, après un délai : validation de la configuration.
    Delay10KTCYx(1);

    PORTBbits.RB6 = 0; // DB7.
    PORTBbits.RB5 = 0; // DB6.
    PORTBbits.RB4 = 0; // DB5.
    PORTBbits.RB3 = 0; // DB4.

    Delay10KTCYx(1);
    PORTBbits.RB2 = 0;
    Delay10KTCYx(1);

    PORTBbits.RB2 = 1; // E à 1 puis à 0, après un délai : validation de la configuration.
    Delay10KTCYx(10);

    PORTBbits.RB6 = 0; // DB7.
    PORTBbits.RB5 = 1; // DB6.
    PORTBbits.RB4 = 1; // DB5.
    PORTBbits.RB3 = 0; // DB4.

    Delay10KTCYx(1);
    PORTBbits.RB2 = 0;
    Delay10KTCYx(1);

    // Etape 8 : Attente de données.
    PORTBbits.RB0 = 1; // RS en niveau haut : le LCD attend des données (et non des instructions).
    PORTBbits.RB1 = 0; // R/W en mode écriture.
    Delay10KTCYx(1);

    // Coeur du programme.
    while (1)
    {
    // Affichage d'un symbole quelconque (A) :

    PORTBbits.RB2 = 1; // E à 1 puis à 0, après un délai : validation de la configuration.
    Delay10KTCYx(1);

    PORTBbits.RB6 = 0; // DB7.
    PORTBbits.RB5 = 1; // DB6.
    PORTBbits.RB4 = 0; // DB5.
    PORTBbits.RB3 = 0; // DB4.

    Delay10KTCYx(1);
    PORTBbits.RB2 = 0;
    Delay10KTCYx(1);

    PORTBbits.RB2 = 1; // E à 1 puis à 0, après un délai : validation de la configuration.
    Delay10KTCYx(1);

    PORTBbits.RB6 = 0; // DB7.
    PORTBbits.RB5 = 0; // DB6.
    PORTBbits.RB4 = 0; // DB5.
    PORTBbits.RB3 = 1; // DB4.

    Delay10KTCYx(1);
    PORTBbits.RB2 = 0;
    Delay10KTCYx(1);
    }

  20. #50
    invite6ceed97c

    Re : Comment programmer un afficheur lcd en C ?

    Bonsoir,
    pourquoi ne pas utiliser la libraries XLCD?

    Quel Crystal? quelle valeur?

    Fusibles de configurations? (PORTB peut être analogue, se référer a la datasheet)

  21. #51
    RISC

    Re : Comment programmer un afficheur lcd en C ?

    Salut jponnoua,

    Plusieurs remarques :

    1/ PORTx / LATx
    Quand tu programmes les ports en SORTIE sur un PIC18, il faut IMPERATIVEMENT utiliser LATx au lieu de PORTx si tu veux être sur de ne jamais avoir de problèmes. Ce sujet a été abordé de multiples fois sur ce forum.
    C'est surtout vrai dans ton cas ou tu manipules les bits d'un même port une instruction après l'autre.
    Changes immédiatement toutes les instructions qui manipulent PORTx en SORTIE par des LATx. Exemple :
    PORTBbits.RB6 = 0; ===> LATBbits.LATB6 = 0;

    2/ A quelle fréquence travailles-tu ? (les délais dépendent de ta vitesse de fonctionnement)
    As-tu configuré au début de ton programme les bits de configuration ?
    Quel afficheur utilises-tu (quel controleur LCD?)

    Tu trouveras ci-après des liens qui montrent des exemples pur les PIC18 :
    http://www.aix-mrs.iufm.fr/formation...indexPIC_C.htm

    tu peux télécharger les samples files de cette carte : http://www.microchip.com/stellent/id...&part=DM163022

    a+

  22. #52
    invite1109a825

    Re : Comment programmer un afficheur lcd en C ?

    Oki donc j'ai remplacé les PORTB par des LATB et j'obtiens un résultat déjà différent : cette fois-ci, je vois bien apparaitre les 2 lignes (contrairement à avant) comme je le souhaitais, par contre je ne vois que ça, plus de curseur, et toujours pas de caractère. J'ai donc essayer de prolonger mes delais (Delay10KTCYx(10) mais cela ne change rien.

    Je travaille en 4 MHz, horloge interne :
    #pragma config WDT = OFF // WatchDog désactivé.
    #pragma config LVP = OFF // Mode basse consommation désactivé.
    #pragma config FOSC = INTOSC_HS // Oscillateur interne.
    ...
    void main (void)
    {
    // Initialisation de la fréquence d'horloge interne à 4MHz.
    OSCCONbits.IRCF2 = 1;
    OSCCONbits.IRCF1 = 1;
    OSCCONbits.IRCF0 = 0;

    Cette horloge fonctionne correctement car j'ai des LEDS sur d'autres pattes et elles ont un clignotement correct.
    Le LCD est le gdm 1602A (16*2 caracteres, matrice 5*8).

    Voila merci déjà pour ces informations, je sens que l'on est sur la bonne voie !

    PS : quelle est la différence entre LATB et PORTB ?

  23. #53
    invite1109a825

    Re : Comment programmer un afficheur lcd en C ?

    Caaaaaaaaa maaaaarrrrrcheeeeeeeeeeeeee !!!!!!!!!!
    Merci a tous !!!

    Donc l'erreur venait lors de l'initialisation : j'initialise à 8 bits 3 fois, puis après je passe à 4 bits en envoyant que 4 bits pensant qu'il effectue immédiatement le passage 8 bits -> 4 bits. Hors il faut pour la dernière fois envoyer encore 2 fois 4 bits. J'ai donc rajouté après
    // Etape 2 : Mode 4 bits.
    LATBbits.LATB6 = 0; // DB7.
    LATBbits.LATB5 = 0; // DB6.
    LATBbits.LATB4 = 1; // DB5.
    LATBbits.LATB3 = 0; // DB4.

    Delay10KTCYx(10);
    LATBbits.LATB2 = 0;
    Delay10KTCYx(10);
    l'étape suivante :
    LATBbits.LATB2 = 1; // E à 1 puis à 0, après un délai : validation de la configuration.
    Delay10KTCYx(10);

    LATBbits.LATB6 = 0; // DB7.
    LATBbits.LATB5 = 0; // DB6.
    LATBbits.LATB4 = 0; // DB5.
    LATBbits.LATB3 = 0; // DB4.

    Delay10KTCYx(10);
    LATBbits.LATB2 = 0;
    Delay10KTCYx(10);

    En fait il y avait un décalage avant !

    Voila je ne sais pas si j 'ai été clair mais je vous remercie !!!

  24. #54
    invite1109a825

    Re : Comment programmer un afficheur lcd en C ?

    Bon je vais quand même continuer à vous embêter ^^.

    Je souhaiterais maintenant simplifier le tout :
    J'aimerais pouvoir affecter DATA (4bits) par exemple directement sur les sorties du PIC. Hors, si j'avais câblé mes bits de poids fort (D7 D6 D5 D4) sur B7 B6 B5 B4, cela aurais bien sure simplifier le problème. Mais là par exemple, ils sont sur B6 B5 B4 B3 (au milieu du port B), connaissait vous un moyen rapide et efficace d'affecter DATA sur ces bits (décalage, masque ou je ne sais quoi).

    Merci d'avance ^^

Page 2 sur 2 PremièrePremière 2

Discussions similaires

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