Répondre à la discussion
Affichage des résultats 1 à 29 sur 29

Routine LCD 2X16



  1. #1
    Paulochon

    Routine LCD 2X16


    ------

    Bonsoir à tous,

    Je viens à vous encore une fois, il y a quelque jour j'ai mis au point une routine de gestion pour un LCD 2 lignes 16 caractères en mode 4 bit.
    Mias voila que j'aimerai passé en Mode 8bit est faire l'envoi de donné sur le PORTC de mn Atmaga8535 et la gestion du Enable et RS apart a savoir que je ne fais que écrir dessus, Donc voici ci-contre ma routine de gestion est que quelqu'un pourrai m'aidé a passé en mode 4bit ( je connais un peu le C mais je débute que depuis quelque temps alors queleque tuyeau serai les bienvenue) Merci déclairé Ma l'aide

    /* +gestion de l'afficheur LCD */
    /* juin 2007 */

    #include <io8535.h>
    #include <avr/io.h>
    #include <avr/interrupt.h> // nécessaire pour les interruptions
    #include <avr/signal.h>
    #include <stdlib.h> // nécessaire pour l'instruction itoa
    #include <avr/delay.h>

    /* Définition des ports utilisés */
    /* Port gérant l'affichage sur écran LCD (bits tous en sortie) */
    #define PORT_AFFICHEUR PORTC
    #define DIRECTION_PORT_AFFICHEUR DDRC


    #define val_bit(bit) (1<<bit)
    #define set_bit(port,bit) port|=(1<<bit)
    #define clear_bit(port,bit) port&=(~(val_bit(bit)))

    /* Définitions utilisées pour gérer l'afficheur LCD (PORT_AFFICHEUR) */
    #define BIT_ENABLE 1
    #define BIT_RS 0

    /* Données gérant l'affichage */
    unsigned char lcd_x = 0, lcd_y = 0;

    /********** Routines de gestion de l'afficheur ****************************** ******/
    void lcd_delay (unsigned int t)
    {
    unsigned int i;

    for (i = 0; i < t; i++);
    }

    void lcd_ready (void)
    {
    clear_bit (PORT_AFFICHEUR, BIT_RS); /* Mode commande */
    lcd_delay (1000);
    }

    /* Routine d'écriture d'un quartet (mode 4 bits) */
    void lcd_write_nibble (unsigned char data)
    {
    PORT_AFFICHEUR = data;
    set_bit (PORT_AFFICHEUR, BIT_ENABLE); /* Impulsion sur le bit EN */
    lcd_delay (5);
    clear_bit (PORT_AFFICHEUR, BIT_ENABLE);
    lcd_delay (5);
    }

    /* Routine d'écriture d'une donnée ou
    * d'une commande. (Dépend du bit RS) */
    void lcd_write_data (unsigned char data)
    {
    unsigned char d;

    d=PORT_AFFICHEUR & 3;

    /* Ecriture du quartet de poids fort */
    lcd_write_nibble ((data & 0xF0) | d);

    /* Ecriture du quartet de poids faible */
    data &= 0x0F;
    data = data << 4;
    lcd_write_nibble ((data & 0xF0) | d);
    }

    /* Positionnement du curseur à un emplacement donné */
    void lcd_gotoXY (unsigned char x, unsigned char y)
    {
    unsigned char base_y[2] = { 0x80, 0xC0 };

    lcd_ready ();
    lcd_write_data (x + base_y[y]);
    lcd_x = x;
    lcd_y = y;
    }

    /* Effacement de l'afficheur */
    void lcd_clear (void)
    {
    lcd_ready ();
    lcd_write_data (0x0C);
    lcd_ready ();
    lcd_write_data (1);
    lcd_ready ();
    lcd_x = lcd_y = 0;
    }

    /* Ecriture d'un caractère */
    void lcd_putchar (unsigned char c)
    {
    if (c == 10)
    goto newline;
    ++lcd_x;
    if (lcd_x > 16)
    {
    newline:
    ++lcd_y;
    lcd_gotoXY (0, lcd_y);
    if (c == 10)
    return;
    }
    lcd_ready ();
    set_bit (PORT_AFFICHEUR, BIT_RS); /* Mode donnée */
    lcd_write_data (c);
    }

    /* Ecriture d'une chaîne de caractères */
    void lcd_puts (unsigned char * str)
    {
    while (* str)
    {
    lcd_putchar (* str);
    str++;
    }
    }

    /* Initialisation de l'afficheur */
    void lcd_init (void)
    {
    lcd_ready ();
    lcd_write_data (0x28); /* Bus de données 4 bits, 2 lignes valides */
    lcd_ready ();
    lcd_write_data (0x28); /* Envoi de la commande une seconde fois (ne fonctionne pas toujours sinon ?) */
    lcd_ready ();
    lcd_write_data (6); /* Déplacement du curseur vers la droite */
    lcd_clear ();
    lcd_ready ();
    }

    void delay_ms (unsigned int ms)
    {
    unsigned int i, j, k;

    for (i = 0; i < ms; i++)
    {
    for (j = 0; j < 28; j++)
    {
    for (k = 0; k < 2500; k++)
    ; // Boucle de 36 us
    }
    }
    }

    void aff_ligne0 (char * m)
    {
    lcd_gotoXY (0, 0);
    lcd_puts (m);
    }

    void aff_ligne1 (char * m)
    {
    lcd_gotoXY (0, 1);
    lcd_puts (m);
    }


    /*********** Programme principal ****************************** ************/
    int main (void)
    {
    DIRECTION_PORT_AFFICHEUR=0xFF; // Port C en sortie (Gestion de l'afficheur LCD)

    lcd_init ();
    lcd_clear ();

    do
    {
    aff_ligne0(" **bonjour** ");
    }

    while (1);
    }
    Merci d'avance!!!!!

    -----

  2. Publicité
  3. #2
    Paulochon

    Re : Routine LCD 2X16

    OUpsssss j'avai oublié la gestion du Enable et RS sur le PORTB je ne m'occupe pas du reste car je force en écriture Merci d'avance

  4. #3
    m'enfin

    Re : Routine LCD 2X16

    Salut,

    J'ai regardé ton programme, pour passer de 4bits à 8bits il faut modifier l'initialisation, l'écriture de la donnée sur 8 bits et comme tu l'as signalé, il faut compléter la gestion des ligne de E et RS sur leur nouveau port:

    /* Initialisation de l'afficheur */
    void lcd_init (void)
    {
    lcd_ready ();
    lcd_write_data (0x38); /* Bus de données 8bits, 2 lignes valides */
    lcd_ready ();
    lcd_write_data (0x38); /* Envoi de la commande une seconde fois (ne fonctionne pas toujours sinon ?) */
    lcd_ready ();
    lcd_write_data (6); /* Déplacement du curseur vers la droite */
    lcd_clear ();
    lcd_ready ();
    }

    /* Routine d'écriture d'une donnée ou
    /* d'une commande. (Dépend du bit RS) */
    void lcd_write_data (unsigned char data)
    {

    /* Ecriture d'un octet*/
    lcd_write_nibble (data);

    }


    /* Routine d'écriture d'un quartet (mode 4 bits) */
    void lcd_write_nibble (unsigned char data)
    {
    PORT_AFFICHEUR = data;
    set_bit (PORT_AFFICHEUR, BIT_ENABLE); /* définir le nouveau port */
    lcd_delay (5);
    clear_bit (PORT_AFFICHEUR, BIT_ENABLE); /* définir le nouveau port

    lcd_delay (5);
    }
    Dernière modification par m'enfin ; 06/06/2007 à 19h32.

  5. #4
    Paulochon

    Re : Routine LCD 2X16

    Merci m'enfin,

    Mais une question me chifoone encore
    Dans ce cas la et dans mon programmen c'est plus la peine que j'envoie deuix fois la commande ci-dessous

    lcd_write_data (0x38); /* Bus de données 8bits, 2 lignes valides */
    lcd_ready ();
    lcd_write_data (0x28); /* Envoi de la commande une seconde fois (ne fonctionne pas toujours sinon ?) */
    lcd_ready ();

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

    Re : Routine LCD 2X16

    Et encore une question quand je définie mes PORT,
    Donc je prend le PORTC pour les bit d0 à d7
    Et le PORTB la gestion du ENable et RS
    Mais est ce que je dois le déclaré comme l'afficheur

    #define PORT_AFFICHEUR PORTC
    #define DIRECTION_PORT_AFFICHEUR DDRC
    #define PORT_COMMANDE PORTB
    #define DIRECTION_PORT_COMMANDE DDRB

    je me demande si je peut faire sa qu"est ce que tu en pense
    Merci d'avance

  8. #6
    m'enfin

    Re : Routine LCD 2X16

    Citation Envoyé par Paulochon Voir le message
    Merci m'enfin,

    Mais une question me chifoone encore
    Dans ce cas la et dans mon programmen c'est plus la peine que j'envoie deuix fois la commande ci-dessous

    lcd_write_data (0x38); /* Bus de données 8bits, 2 lignes valides */
    lcd_ready ();
    lcd_write_data (0x28); /* Envoi de la commande une seconde fois (ne fonctionne pas toujours sinon ?) */
    lcd_ready ();
    Tu es allé trop vite pour moi: tu as copié avant que je corrige: la 2° ligne envoie aussi 0x38. La doc dont je dispose indique bien d'envoyer 2 fois cette commande avec 4.1ms entre les deux, je pense qu'il faut donc la conserver.
    A+

  9. Publicité
  10. #7
    Paulochon

    Re : Routine LCD 2X16

    Et donc pour le reste du programme je n'ai plus trop grand chose à changer je pense, la seul chose qui mepose problême c'est que en mode 4bit je commandé tout sur un PORT maintenant j'ai 2 PORT alors sa me fait fais posé bien des questions

    Merci d'avance

  11. #8
    m'enfin

    Re : Routine LCD 2X16

    En utilisant ta déclaration ça devient


    /* Routine d'écriture d'un quartet (mode 4 bits) */
    void lcd_write_nibble (unsigned char data)
    {
    PORT_AFFICHEUR = data;
    set_bit (PORT_COMMANDE , BIT_ENABLE);
    lcd_delay (5);
    clear_bit (PORT_COMMANDE , BIT_ENABLE);

    lcd_delay (5);
    }

    N'oublie pas d'initialiser ton port B (le DDRB)

    L'intérêt du 4 bits est d'économiser des lignes d'E/S du µcontroleur.

  12. #9
    Paulochon

    Re : Routine LCD 2X16

    Mais alors ma routine d'écriture doit integré les 2 PORT désormé

    /* Routine d'écriture d'une donnée ou
    * d'une commande. (Dépend du bit RS) */
    void lcd_write_data (unsigned char data)
    {
    unsigned char d;

    d=PORT_AFFICHEUR & 3;

    /* Ecriture du quartet de poids fort */
    lcd_write_nibble ((data & 0xF0) | d);

    /* Ecriture du quartet de poids faible */
    data &= 0x0F;
    data = data << 4;
    lcd_write_nibble ((data & 0xF0) | d);
    }

    Ici dans la routine d'écriture je ne vois pas comment faire intervenir le port de Commande, donc moi je veux que RS correponde à PB0 et Enable a PB1.
    Pourrai tu encores m'aider Merci

  13. #10
    m'enfin

    Re : Routine LCD 2X16

    J'ai indiqué comment modifier cette procédure, par contre aux endroits où tu positionnes le bit RS il faut remplacer (PORT_AFFICHEUR,RS) par (PORT_COMMANDE,RS)

  14. #11
    Paulochon

    Re : Routine LCD 2X16

    Excuse moi encore d'usé une dernière fois de ton aide, Mais j'aimerai savoir si il ne serai pa plus judicieux d'utiliser un timers au lieux de la boucle d'attente que j'ai faite, Je travaile avec un quartz de 8Mhz et donc l'Atmega8535 et donc je n'ai jamais encore fait de programmation de timers. Pour finir tu en penses quoi et si tu aurai un peu de doc sa serai gentil.
    La je pense que j'assai de précision pour finir cette gestion de routine.En te remerciant de toute l'aide que tu m'a apporté
    Bonne soiré
    Cordialement
    Paulochon

  15. #12
    m'enfin

    Re : Routine LCD 2X16

    Si tu utilises AVR, la bibliothèque delay.h contient les routines delay_ms(x), delay_us(x) où le paramètre x est le nombre entier de ms ou de µs de tempo (exemple: delay_ms(100) provoque une attente de 100ms).
    L'utilisation du timer est plus puissante, surtout en employant les interruptions mais elle est aussi plus délicate à mettre en oeuvre (plusieurs registres à gérer) et c'est trop long pour expliquer ici à partir du début.
    La seule doc que j'utilise est le datasheet du 8535 que tu trouveras sans peine sur le site atmel.
    Bon courage
    A+

  16. Publicité
  17. #13
    Paulochon

    Re : Routine LCD 2X16

    Merci pour toutes ces précisions
    Bonne soirée
    Cordialement
    Paulochon
    Rien n'est plus proche du vrai que le faux ( Albert Einstein )

  18. #14
    Paulochon

    Re : Routine LCD 2X16

    Bonjour à tous,
    je viens de refaire mon programme mais je rencontre encore quelque problême,
    Donc voila ce qu'on peut appeller la routine de gestion d'un LCD en mode 8 bit,
    Avec je le rapelle PORTC ( gére les bit D0 à D7)
    Et puis le PORTA ( gére les bit Enable et RS )
    Mais lorsque que je veux compiler mon fichiers Hex il me trouve des erreur que moi je ne trouve pas,
    Aussi je voudrai maintenant votre avie sur le programme,
    j'ai un doute sur la fonction d'écriture, en faite j'ai un doute sur le fais que le PORTC va bien envoié les donné D0 et D7 et que le PORTB va bien commandé RS et Enable, Voila ma nouvelle version du programme fait hier soir.
    Si quelqu'un pouvais m'aidé sa serai gentil

    #include <avr/io.h>
    #include <avr/interupt.h>
    #include <signal.h>
    #include <stdlib.h>
    #include <avr/delay.h>

    #include PORT_AFFICHEUR PORTC
    #include DIRECTION_PORT_AFFICHEUR DDRC
    #include PORT_COMMANDE PORTA
    #include DIRECTION_PORT_COMMANDE DDRA

    #include val_bit(bit) (1<<bit)
    #include set_bit(port, bit) port |=(1<<bit)
    #include clear_bit(port, bit) port &=(~(val_bit(bit)))

    #include BIT_ENABLE 1
    #include BIT_RS 0

    unsigned char lcd_x=0, lcd_y=0;

    void lcd_delay (unsigned int t)
    {
    unsigned int i;
    for (i=0; i<t; i++);
    }

    void lcd_ready (void)
    {
    clear_bit (PORT_COMMANDE, BIT_RS);
    lcd_delay(1000);
    }

    void lcd_write_nibble (unsigned char data)
    {
    PORT_COMMANDE=data;

    set_bit (PORT_COMMANDE, BIT_ENABLE);
    lcd_delay(5);
    clear_bit ( PORT_COMMANDE, BIT_ENABLE);
    lcd_delay(5);
    }

    void lcd_write_data (unsigned char data)
    {
    unsigned char d;
    d= PORT_AFFICHEUR & 3;
    lcd_write_nibble((data & 0xFF) | d);
    }

    void lcd_gotoXY (unsigned char x, unsigned char y)
    {
    unsigned char base_y[2] = { 0x80, 0xc0 };

    lcd_ready ();
    lcd_write_data (x + base_y[y]);
    lcd_x = x;
    lcd_y = y;
    }

    void_lcd (void)
    {
    if (c == 10)
    goto newline;
    ++lcd_x;

    if (lcd_x > 16)

    {
    newline:
    ++lcd_y;
    lcd_gotoXY (0; lcd_y);
    if (c == 10)
    return;
    }

    lcd_ready ();
    set_bit (PORT_COMMANDE, BIT_RS);
    lcd_write_data(c);
    }

    void lcd_puts (unsigned char * str)
    {
    while(* str)
    {
    lcd_putchar (* str);
    str++;
    }
    }

    void lcd_init (void)
    {
    lcd_ready();
    lcd_write data (0x38);
    lcd_ready();
    lcd_write data (0x38);
    lcd_write_data (6);
    lcd_clear();
    lcd_ready();
    }

    void delay_ms (unsigned int ms)
    {
    unsigned int i, j, k;

    for (i=0; i < ms; i++)
    {
    for (j=0; j < 28; j++)
    {
    for (k=0; k < 2500; k++)
    ;
    }
    }
    }

    void aff_ligne0 (char * m)
    {
    lcd_gotoXY (0, 0);
    lcd_puts (m);
    }

    void aff_ligne1 (char * m)
    {
    lcd_gotoXY (0, 1);
    lcd_puts (m);
    }

    int main (void)
    {
    DIRECTION_PORT_AFFICHEUR=0xFF;
    DIRECTION_PORT_COMMANDE=0xFF;

    lcd_init ();
    lcd_clear();

    do
    {
    aff_ligne0("Bonjour");
    aff_ligne1("Aurevoir");
    }
    while(1);
    }
    Merci d'avance
    Cordialment Paulochon
    Rien n'est plus proche du vrai que le faux ( Albert Einstein )

  19. #15
    Paulochon

    Re : Routine LCD 2X16

    ReBonjour a tous,
    Personne peut me dire se qui pense de cette routine de gestion en mode 8 bit???
    En vous remerciant de l'aide que vous allez me porter,
    Cordialment Paulochon
    Rien n'est plus proche du vrai que le faux ( Albert Einstein )

  20. #16
    m'enfin

    Re : Routine LCD 2X16

    Salut,
    c'est le port A ou le B qui gère RS et E?
    Sinon, donne les erreurs envoyées par ton compilateur, ce sera plus simple pour nous, parceque ce n'est pas évident de tout voir sur un listing qu'on a pas écrit, on passe souvent à côté du problème.
    A+

  21. #17
    m'enfin

    Re : Routine LCD 2X16

    #include <avr/io.h>
    #include <avr/interupt.h>
    #include <signal.h>
    #include <stdlib.h>
    #include <avr/delay.h>

    #include PORT_AFFICHEUR PORTC
    #include DIRECTION_PORT_AFFICHEUR DDRC
    #include PORT_COMMANDE PORTA
    #include DIRECTION_PORT_COMMANDE DDRA

    #include val_bit(bit) (1<<bit)
    #include set_bit(port, bit) port |=(1<<bit)
    #include clear_bit(port, bit) port &=(~(val_bit(bit)))

    #include BIT_ENABLE 1
    #include BIT_RS 0

    unsigned char lcd_x=0, lcd_y=0;

    void lcd_delay (unsigned int t)
    {
    unsigned int i;
    for (i=0; i<t; i++);
    }

    void lcd_ready (void)
    {
    clear_bit (PORT_COMMANDE, BIT_RS);
    lcd_delay(1000);
    }

    void lcd_write_nibble (unsigned char data)
    {
    PORT_COMMANDE=data; faux, c'est PORT_AFFICHEUR

    set_bit (PORT_COMMANDE, BIT_ENABLE);
    lcd_delay(5);
    clear_bit ( PORT_COMMANDE, BIT_ENABLE);
    lcd_delay(5);
    }

    void lcd_write_data (unsigned char data)
    {
    unsigned char d;
    d= PORT_AFFICHEUR & 3;
    lcd_write_nibble((data & 0xFF) | d); faux


    lcd_write_nibble(data); c'est suffisant
    }

    void lcd_gotoXY (unsigned char x, unsigned char y)
    {
    unsigned char base_y[2] = { 0x80, 0xc0 };

    lcd_ready ();
    lcd_write_data (x + base_y[y]);
    lcd_x = x;
    lcd_y = y;
    }

    void_lcd (void)
    {
    if (c == 10)
    goto newline;
    ++lcd_x;

    if (lcd_x > 16)

    {
    newline:
    ++lcd_y;
    lcd_gotoXY (0; lcd_y);
    if (c == 10)
    return;
    }

    lcd_ready ();
    set_bit (PORT_COMMANDE, BIT_RS);
    lcd_write_data(c);
    }

    void lcd_puts (unsigned char * str)
    {
    while(* str)
    {
    lcd_putchar (* str);
    str++;
    }
    }

    void lcd_init (void)
    {
    lcd_ready();
    lcd_write data (0x38);
    lcd_ready();
    lcd_write data (0x38);
    lcd_write_data (6);
    lcd_clear();
    lcd_ready();
    }

    void delay_ms (unsigned int ms)
    {
    unsigned int i, j, k;

    for (i=0; i < ms; i++)
    {
    for (j=0; j < 28; j++)
    {
    for (k=0; k < 2500; k++)
    ;
    }
    }
    }

    void aff_ligne0 (char * m)
    {
    lcd_gotoXY (0, 0);
    lcd_puts (m);
    }

    void aff_ligne1 (char * m)
    {
    lcd_gotoXY (0, 1);
    lcd_puts (m);
    }

    int main (void)
    {
    DIRECTION_PORT_AFFICHEUR=0xFF;
    DIRECTION_PORT_COMMANDE=0xFF;

    lcd_init ();
    lcd_clear();

    do
    {
    aff_ligne0("Bonjour");
    aff_ligne1("Aurevoir");
    }
    while(1);
    }


    Essaie déjà ça

  22. #18
    Paulochon

    Re : Routine LCD 2X16

    Merci encore une fois m'enfin,
    je vais mit mettre cet aprem et puis je tien la discuiton à jour sur mes avancement
    Cordialment Paulochon
    Rien n'est plus proche du vrai que le faux ( Albert Einstein )

  23. Publicité
  24. #19
    m'enfin

    Re : Routine LCD 2X16

    Pense à mettre les erreurs rencontrées en ligne si tu veux avoir une réponse les concernant.
    A+

  25. #20
    Paulochon

    Re : Routine LCD 2X16

    ReBonjour,
    Voila comme m'enfin ma demandé je vous envoie donc le rapelle de mon programme avec les modification apporté et les erreurs de compilation lorsque je veux compilé le programme avc NotPad

    #include <avr/io.h>
    #include <avr/interupt.h>
    #include <signal.h>
    #include <stdlib.h>
    #include <avr/delay.h>

    #include PORT_AFFICHEUR PORTC
    #include DIRECTION_PORT_AFFICHEUR DDRC
    #include PORT_COMMANDE PORTA
    #include DIRECTION_PORT_COMMANDE DDRA

    #include val_bit(bit) (1<<bit)
    #include set_bit(port, bit) port |=(1<<bit)
    #include clear_bit(port, bit) port &=(~(val_bit(bit)))

    #include BIT_ENABLE 1
    #include BIT_RS 0

    unsigned char lcd_x=0, lcd_y=0;

    void lcd_delay (unsigned int t)
    {
    unsigned int i;
    for (i=0; i<t; i++);
    }

    void lcd_ready (void)
    {
    clear_bit (PORT_COMMANDE, BIT_RS);
    lcd_delay(1000);
    }

    void lcd_write_nibble (unsigned char data)
    {
    PORT_AFFICHEUR=data;

    set_bit (PORT_COMMANDE, BIT_ENABLE);
    lcd_delay(5);
    clear_bit ( PORT_COMMANDE, BIT_ENABLE);
    lcd_delay(5);
    }

    void lcd_write_data (unsigned char data)
    {
    unsigned char d;
    lcd_write_nibble(data);
    }

    void lcd_gotoXY (unsigned char x, unsigned char y)
    {
    unsigned char base_y[2] = { 0x80, 0xc0 };

    lcd_ready ();
    lcd_write_data (x + base_y[y]);
    lcd_x = x;
    lcd_y = y;
    }

    void_lcd (void)
    {
    if (c == 10)
    goto newline;
    ++lcd_x;

    if (lcd_x > 16)

    {
    newline:
    ++lcd_y;
    lcd_gotoXY (0; lcd_y);
    if (c == 10)
    return;
    }

    lcd_ready ();
    set_bit (PORT_COMMANDE, BIT_RS);
    lcd_write_data(c);
    }

    void lcd_puts (unsigned char * str)
    {
    while(* str)
    {
    lcd_putchar (* str);
    str++;
    }
    }

    void lcd_init (void)
    {
    lcd_ready();
    lcd_write data (0x38);
    lcd_ready();
    lcd_write data (0x38);
    lcd_write_data (6);
    lcd_clear();
    lcd_ready();
    }

    void delay_ms (unsigned int ms)
    {
    unsigned int i, j, k;

    for (i=0; i < ms; i++)
    {
    for (j=0; j < 28; j++)
    {
    for (k=0; k < 2500; k++)
    ;
    }
    }
    }

    void aff_ligne0 (char * m)
    {
    lcd_gotoXY (0, 0);
    lcd_puts (m);
    }

    void aff_ligne1 (char * m)
    {
    lcd_gotoXY (0, 1);
    lcd_puts (m);
    }

    int main (void)
    {
    DIRECTION_PORT_AFFICHEUR=0xFF;
    DIRECTION_PORT_COMMANDE=0xFF;

    lcd_init ();
    lcd_clear();

    do
    {
    aff_ligne0("Bonjour");
    aff_ligne1("Aurevoir");
    }
    while(1);
    }
    Et ci-dessous le Output de NotePad

    avr-gcc (GCC) 4.1.2 (WinAVR 20070525)
    Copyright (C) 2006 Free Software Foundation, Inc.
    This is free software; see the source for copying conditions. There is NO
    warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.


    Compiling C: main.c
    avr-gcc -c -mmcu=at90s8535 -I. -gdwarf-2 -DF_CPU=8000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=./main.lst -std=gnu99 -Wundef -MMD -MP -MF .dep/main.o.d main.c -o main.o
    main.c:2:26: warning: avr/interupt.h: No such file or directory
    main.c:3:20: warning: signal.h: No such file or directory
    In file included from main.c:5:
    c:/winavr-20070525/bin/../avr/include/avr/delay.h:36:2: warning: #warning "This file has been moved to <util/delay.h>."
    main.c:7:10: error: #include expects "FILENAME" or <FILENAME>
    main.c:8:10: error: #include expects "FILENAME" or <FILENAME>
    main.c:9:10: error: #include expects "FILENAME" or <FILENAME>
    main.c:10:10: error: #include expects "FILENAME" or <FILENAME>
    main.c:12:10: error: #include expects "FILENAME" or <FILENAME>
    main.c:13:10: error: #include expects "FILENAME" or <FILENAME>
    main.c:14:10: error: #include expects "FILENAME" or <FILENAME>
    main.c:16:10: error: #include expects "FILENAME" or <FILENAME>
    main.c:17:10: error: #include expects "FILENAME" or <FILENAME>
    main.c: In function 'lcd_ready':
    main.c:29: warning: implicit declaration of function 'clear_bit'
    main.c:29: error: 'PORT_COMMANDE' undeclared (first use in this function)
    main.c:29: error: (Each undeclared identifier is reported only once
    main.c:29: error: for each function it appears in.)
    main.c:29: error: 'BIT_RS' undeclared (first use in this function)
    main.c: In function 'lcd_write_nibble':
    main.c:35: error: 'PORT_AFFICHEUR' undeclared (first use in this function)
    main.c:37: warning: implicit declaration of function 'set_bit'
    main.c:37: error: 'PORT_COMMANDE' undeclared (first use in this function)
    main.c:37: error: 'BIT_ENABLE' undeclared (first use in this function)
    main.c: In function 'lcd_write_data':
    main.c:45: warning: unused variable 'd'
    main.c: At top level:
    main.c:60: warning: return type defaults to 'int'
    main.c: In function 'void_lcd':
    main.c:61: error: 'c' undeclared (first use in this function)
    main.c:70: error: expected ')' before ';' token
    main.c:70: error: too few arguments to function 'lcd_gotoXY'
    main.c:72: warning: 'return' with no value, in function returning non-void
    main.c:76: error: 'PORT_COMMANDE' undeclared (first use in this function)
    main.c:76: error: 'BIT_RS' undeclared (first use in this function)
    main.c: In function 'lcd_puts':
    main.c:84: warning: implicit declaration of function 'lcd_putchar'
    main.c: In function 'lcd_init':
    main.c:92: error: 'lcd_write' undeclared (first use in this function)
    main.c:92: error: expected ';' before 'data'
    main.c:94: error: expected ';' before 'data'
    main.c:96: warning: implicit declaration of function 'lcd_clear'
    main.c: In function 'aff_ligne0':
    main.c:117: warning: pointer targets in passing argument 1 of 'lcd_puts' differ in signedness
    main.c: In function 'aff_ligne1':
    main.c:123: warning: pointer targets in passing argument 1 of 'lcd_puts' differ in signedness
    main.c: In function 'main':
    main.c:128: error: 'DIRECTION_PORT_AFFICHEUR' undeclared (first use in this function)
    main.c:129: error: 'DIRECTION_PORT_COMMANDE' undeclared (first use in this function)
    main.c:140:3: warning: no newline at end of file
    make.exe: *** [main.o] Error 1

    > Process Exit Code: 2
    > Time Taken: 00:02
    Voila si quelqu'un aurrai une idée d'ou l'erreurs vient, je serai heureux qu'il m'en fasse part car je ne connaiterai pas de répit jusqu'a temps que ce programme fonctionne correctement.Merci d'avance pour vos réponse et votre aide.
    Rien n'est plus proche du vrai que le faux ( Albert Einstein )

  26. #21
    Paulochon

    Re : Routine LCD 2X16

    Ouppssss je travaille que le programme en même temps là,
    et je vien de m'appercevoir que j'avais oublié une fonction et fais quelque petite faute j'essai de compilé tout sa et je vous met le prog plus le rapport d'erreurs si toute foi sa ne fonctionne pas encore.
    Rien n'est plus proche du vrai que le faux ( Albert Einstein )

  27. #22
    Paulochon

    Re : Routine LCD 2X16

    Rebonjour,
    Et donc revoila la nouvelle version de mon programme complété,
    mais j'ai toujours des erreurs quand je veux le compilé,
    #include val_bit(bit) (1<<bit)
    #include set_bit(port,bit) port|=(1<<bit)
    #include clear_bit(port,bit) port&=(~(val_bit(bit)))

    #include BIT_ENABLE 1
    #include BIT_RS 0

    unsigned char lcd_x=0, lcd_y=0;

    void lcd_delay (unsigned int t)
    {
    unsigned int i;

    for (i=0; i<t; i++);
    }

    void lcd_ready (void)
    {
    clear_bit (PORT_COMMANDE, BIT_RS);

    lcd_delay(1000);
    }

    void lcd_write_nibble (unsigned char data)
    {
    PORT_AFFICHEUR=data;

    set_bit (PORT_COMMANDE, BIT_ENABLE);
    lcd_delay(5);
    clear_bit ( PORT_COMMANDE, BIT_ENABLE);
    lcd_delay(5);
    }

    void lcd_write_data (unsigned char data)
    {
    unsigned char d;

    lcd_write_nibble(data);
    }

    void lcd_gotoXY (unsigned char x, unsigned char y)
    {
    unsigned char base_y[2] = { 0x80, 0xc0 };

    lcd_ready ();
    lcd_write_data (x + base_y[y]);
    lcd_x = x;
    lcd_y = y;
    }

    void lcd_clear (void)
    {
    lcd_ready ();
    lcd_write_data (x + base_y[y]);
    lcd_write_data (1);
    lcd_ready ();
    lcd_x = lcd_y = 0;
    }

    void lcd_putchar (unsigned char c)
    {
    if (c == 10)
    goto newline;
    ++lcd_x;

    if (lcd_x > 16)

    {
    newline:
    ++lcd_y;
    lcd_gotoXY (0; lcd_y);
    if (c == 10)
    return;
    }

    lcd_ready ();
    set_bit (PORT_COMMANDE, BIT_RS);
    lcd_write_data(c);
    }

    void lcd_puts (unsigned char * str)
    {
    while(* str)
    {
    lcd_putchar (* str);
    str++;
    }
    }

    void lcd_init (void)
    {
    lcd_ready();
    lcd_write data (0x38);
    lcd_ready();
    lcd_write data (0x38);
    lcd_write_data (6);
    lcd_clear();
    lcd_ready();
    }

    void delay_ms (unsigned int ms)
    {
    unsigned int i, j, k;

    for (i=0; i < ms; i++)
    {
    for (j=0; j < 28; j++)
    {
    for (k=0; k < 2500; k++)
    ;
    }
    }
    }

    void aff_ligne0 (char * m)
    {
    lcd_gotoXY (0, 0);
    lcd_puts (m);
    }

    void aff_ligne1 (char * m)
    {
    lcd_gotoXY (0, 1);
    lcd_puts (m);
    }

    int main (void)
    {
    DIRECTION_PORT_AFFICHEUR=0xFF;
    DIRECTION_PORT_COMMANDE=0xFF;

    lcd_init ();
    lcd_clear();

    do
    {
    aff_ligne0("Bonjour");
    aff_ligne1("Aurevoir");
    }
    while(1);
    }
    Et voici le rapport d'erreurs de NotePAd

    -------- begin --------
    avr-gcc (GCC) 4.1.2 (WinAVR 20070525)
    Copyright (C) 2006 Free Software Foundation, Inc.
    This is free software; see the source for copying conditions. There is NO
    warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.


    Compiling C: main.c
    avr-gcc -c -mmcu=at90s8535 -I. -gdwarf-2 -DF_CPU=8000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=./main.lst -std=gnu99 -Wundef -MMD -MP -MF .dep/main.o.d main.c -o main.o
    main.c:2:26: warning: avr/interupt.h: No such file or directory
    main.c:3:20: warning: signal.h: No such file or directory
    In file included from main.c:5:
    c:/winavr-20070525/bin/../avr/include/avr/delay.h:36:2: warning: #warning "This file has been moved to <util/delay.h>."
    main.c:7:10: error: #include expects "FILENAME" or <FILENAME>
    main.c:8:10: error: #include expects "FILENAME" or <FILENAME>
    main.c:9:10: error: #include expects "FILENAME" or <FILENAME>
    main.c:10:10: error: #include expects "FILENAME" or <FILENAME>
    main.c:12:10: error: #include expects "FILENAME" or <FILENAME>
    main.c:13:10: error: #include expects "FILENAME" or <FILENAME>
    main.c:14:10: error: #include expects "FILENAME" or <FILENAME>
    main.c:16:10: error: #include expects "FILENAME" or <FILENAME>
    main.c:17:10: error: #include expects "FILENAME" or <FILENAME>
    main.c: In function 'lcd_ready':
    main.c:30: warning: implicit declaration of function 'clear_bit'
    main.c:30: error: 'PORT_COMMANDE' undeclared (first use in this function)
    main.c:30: error: (Each undeclared identifier is reported only once
    main.c:30: error: for each function it appears in.)
    main.c:30: error: 'BIT_RS' undeclared (first use in this function)
    main.c: In function 'lcd_write_nibble':
    main.c:37: error: 'PORT_AFFICHEUR' undeclared (first use in this function)
    main.c:39: warning: implicit declaration of function 'set_bit'
    main.c:39: error: 'PORT_COMMANDE' undeclared (first use in this function)
    main.c:39: error: 'BIT_ENABLE' undeclared (first use in this function)
    main.c: In function 'lcd_write_data':
    main.c:47: warning: unused variable 'd'
    main.c: In function 'lcd_clear':
    main.c:65: error: 'x' undeclared (first use in this function)
    main.c:65: error: 'base_y' undeclared (first use in this function)
    main.c:65: error: 'y' undeclared (first use in this function)
    main.c: In function 'lcd_putchar':
    main.c:82: error: expected ')' before ';' token
    main.c:82: error: too few arguments to function 'lcd_gotoXY'
    main.c:88: error: 'PORT_COMMANDE' undeclared (first use in this function)
    main.c:88: error: 'BIT_RS' undeclared (first use in this function)
    main.c: In function 'lcd_init':
    main.c:104: error: 'lcd_write' undeclared (first use in this function)
    main.c:104: error: expected ';' before 'data'
    main.c:106: error: expected ';' before 'data'
    main.c: In function 'aff_ligne0':
    main.c:129: warning: pointer targets in passing argument 1 of 'lcd_puts' differ in signedness
    main.c: In function 'aff_ligne1':
    main.c:135: warning: pointer targets in passing argument 1 of 'lcd_puts' differ in signedness
    main.c: In function 'main':
    main.c:140: error: 'DIRECTION_PORT_AFFICHEUR' undeclared (first use in this function)
    main.c:141: error: 'DIRECTION_PORT_COMMANDE' undeclared (first use in this function)
    main.c:152:3: warning: no newline at end of file
    make.exe: *** [main.o] Error 1

    > Process Exit Code: 2
    > Time Taken: 00:00
    Merci d'avance pour votre aide
    Cordialement Paulochon
    Rien n'est plus proche du vrai que le faux ( Albert Einstein )

  28. #23
    Paulochon

    Re : Routine LCD 2X16

    Personne n'a de petite idée la dessus!!
    Rien n'est plus proche du vrai que le faux ( Albert Einstein )

  29. #24
    m'enfin

    Re : Routine LCD 2X16

    Pour commencer, corrige les lignes suivantes:

    #include <avr/io.h>
    #include <avr/interupt.h>
    #include <signal.h>
    #include <stdlib.h>
    #include <avr/delay.h>

    #include PORT_AFFICHEUR PORTC
    #include DIRECTION_PORT_AFFICHEUR DDRC
    #include PORT_COMMANDE PORTA
    #include DIRECTION_PORT_COMMANDE DDRA

    #include val_bit(bit) (1<<bit)
    #include set_bit(port, bit) port |=(1<<bit)
    #include clear_bit(port, bit) port &=(~(val_bit(bit)))

    #include BIT_ENABLE 1
    #include BIT_RS 0

    Remplace tous les #include rouges par #define
    Je regarde la suite...

  30. Publicité
  31. #25
    m'enfin

    Re : Routine LCD 2X16

    Modifie la routine lcd_clear comme suit (version d'origine!):
    void lcd_clear (void)
    {
    lcd_ready ();
    lcd_write_data (0x0C);
    lcd_ready ();
    lcd_write_data (1);
    lcd_ready ();
    lcd_x =0;
    lcd_y = 0;
    }

  32. #26
    m'enfin

    Re : Routine LCD 2X16

    void lcd_putchar (unsigned char c)
    {
    if (c == 10)
    goto newline;
    ++lcd_x;

    if (lcd_x > 16)

    {
    newline:
    ++lcd_y;
    lcd_gotoXY (0; lcd_y);
    if (c == 10)
    return;
    }

    lcd_ready ();
    set_bit (PORT_COMMANDE, BIT_RS);
    lcd_write_data(c);
    }

    Remplace le ; par une virgule: lcd_gotoXY (0, lcd_y);

  33. #27
    m'enfin

    Re : Routine LCD 2X16

    Erreur dans le nom de la fonction appelée:
    void lcd_init (void)
    {
    lcd_ready();
    lcd_write data (0x38);
    lcd_ready();
    lcd_write data (0x38);
    lcd_write_data (6);
    lcd_clear();
    lcd_ready();
    }

    Ecrire lcd_write_data

  34. #28
    Paulochon

    Re : Routine LCD 2X16

    Merci pour toute c'est précision m'enfin,
    Tes explications mon été d'un aide précieuse,
    Et je m'occupe de sa dans la soirée et je poste sur le convers,
    pour que tu vois le programme final,
    Et j'espère que cette fois il fonctionnera

    Cordialment Paulochon
    Merci encore une fois
    Rien n'est plus proche du vrai que le faux ( Albert Einstein )

  35. #29
    Paulochon

    Re : Routine LCD 2X16

    Bonjour je suis trop heureux,
    C'est bon mon prog tourne
    Merci Merci beaucoup

    Voila pour ce qui veulent
    Une routine de gestion LCD 8bit

    #include <avr/io.h>
    #include <avr/interupt.h>
    #include <avr/signal.h>
    #include <stdlib.h>
    #include <avr/delay.h>

    #define PORT_AFFICHEUR PORTC
    #define DIRECTION_PORT_AFFICHEUR DDRC
    #define PORT_COMMANDE PORTA
    #define DIRECTION_PORT_COMMANDE DDRA

    #define val_bit(bit) (1<<bit)
    #define set_bit(port,bit) port|=(1<<bit)
    #define clear_bit(port,bit) port&=(~(val_bit(bit)))

    #define BIT_ENABLE 1
    #define BIT_RS 0

    unsigned char lcd_x=0, lcd_y=0;

    void lcd_delay (unsigned int t)
    {
    unsigned int i;

    for (i=0; i<t; i++);
    }

    void lcd_ready (void)
    {
    clear_bit (PORT_COMMANDE, BIT_RS);

    lcd_delay(1000);
    }

    void lcd_write_nibble (unsigned char data)
    {
    PORT_AFFICHEUR=data;

    set_bit (PORT_COMMANDE, BIT_ENABLE);
    lcd_delay(5);
    clear_bit ( PORT_COMMANDE, BIT_ENABLE);
    lcd_delay(5);
    }

    void lcd_write_data (unsigned char data)
    {
    unsigned char d;

    lcd_write_nibble(data);
    }

    void lcd_gotoXY (unsigned char x, unsigned char y)
    {
    unsigned char base_y[2] = { 0x80, 0xc0 };

    lcd_ready ();
    lcd_write_data (x + base_y[y]);
    lcd_x = x;
    lcd_y = y;
    }

    void lcd_clear (void)
    {

    lcd_ready ();
    lcd_write_data (0x0C);
    lcd_ready ();
    lcd_write_data (1);
    lcd_ready ();
    lcd_x =0;
    lcd_y = 0;

    }

    void lcd_putchar (unsigned char c)
    {
    if (c == 10)
    goto newline;
    ++lcd_x;

    if (lcd_x > 16)

    {
    newline:
    ++lcd_y;
    lcd_gotoXY (0, lcd_y);
    if (c == 10)
    return;
    }

    lcd_ready ();
    set_bit (PORT_COMMANDE, BIT_RS);
    lcd_write_data(c);
    }

    void lcd_puts (unsigned char * str)
    {
    while(* str)
    {
    lcd_putchar (* str);
    str++;
    }
    }

    void lcd_init (void)
    {
    lcd_ready();
    lcd_write_data (0x38);
    lcd_ready();
    lcd_write_data (0x38);
    lcd_write_data (6);
    lcd_clear();
    lcd_ready();
    }

    void delay_ms (unsigned int ms)
    {
    unsigned int i, j, k;

    for (i=0; i < ms; i++)
    {
    for (j=0; j < 28; j++)
    {
    for (k=0; k < 2500; k++)
    ;
    }
    }
    }

    void aff_ligne0 (char * m)
    {
    lcd_gotoXY (0, 0);
    lcd_puts (m);
    }

    void aff_ligne1 (char * m)
    {
    lcd_gotoXY (0, 1);
    lcd_puts (m);
    }

    int main (void)
    {
    DIRECTION_PORT_AFFICHEUR=0xFF;
    DIRECTION_PORT_COMMANDE=0xFF;

    lcd_init ();
    lcd_clear();

    do
    {
    aff_ligne0("Bonjour");
    aff_ligne1("Aurevoir");
    }
    while(1);
    }
    Cordialment Paulochon
    Rien n'est plus proche du vrai que le faux ( Albert Einstein )

Discussions similaires

  1. Afficheur LCD 2x16 caractères
    Par LouR56 dans le forum Électronique
    Réponses: 9
    Dernier message: 22/02/2012, 12h00
  2. Programmation LCD 2x16 en C
    Par jorg1n dans le forum Électronique
    Réponses: 6
    Dernier message: 10/10/2007, 08h09
  3. Problème affichage LCD 2x16
    Par gaga2410 dans le forum Électronique
    Réponses: 113
    Dernier message: 06/10/2007, 19h56
  4. Afficheur LCD 2x16
    Par Roukben dans le forum Électronique
    Réponses: 4
    Dernier message: 01/02/2006, 15h11
  5. LCD 2x16 caractères
    Par Patrick dans le forum Électronique
    Réponses: 1
    Dernier message: 22/05/2004, 15h33
Découvrez nos comparatifs produits sur l'informatique et les technologies.