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

Problème Busy flag LCD 4 bits



  1. #1
    Dimitryagain

    Problème Busy flag LCD 4 bits


    ------

    Bonjour a tous.

    Voila je dois mettre en oeuvre le LCD 2*16 qui est monté sur une carte application Axiom 0295 grace au PortQS (7bits) d'une Coldfire 5282.

    Vu le nombre de fils disponible le LCD est donc en 4 bits. J'ai creer un programme tout bête qui dit marque "Bienvenue a tous" et "Coldfire" et il marche sans probleme. Le probleme vien du Busy Flag en effet au bout du 8ieme test du Busy celui ci ce bloc a 1 et je n'arrive pas a m'expliquer pourquoi.

    Voici le programme que j'ai realisé.

    #include <stdio.h>
    #include "mcf5282.h"


    #define LCD_RW_0 (MCF5282_GPIO_PORTQS&0xef)/* met a 0 le bit relié a RW*/
    #define LCD_RW_1 (MCF5282_GPIO_PORTQS|0x10)/* met a 1 le bit relié a RW*/

    #define LCD_RS_0 (MCF5282_GPIO_PORTQS&0xdf)/* met a 0 le bit relié a RS*/
    #define LCD_RS_1 (MCF5282_GPIO_PORTQS|0x20)/* met a 1 le bit relié a RS*/

    #define LCD_EN_0 (MCF5282_GPIO_PORTQS&0xbf)/* met a 0 le bit relié a EN*/
    #define LCD_EN_1 (MCF5282_GPIO_PORTQS|0x40)/* met a 1 le bit relié a EN*/

    #define LCD_POIDS_FORT (MCF5282_GPIO_PORTQS&0x0f)/* permet de mettre a 0 les 4 bits de poids fort
    du port QS relié a EN RS ET RW*/


    #define LCD_Data MCF5282_GPIO_PORTQS/* 4 bits de poids faible du port Qs relié aufils de données du LCD*/


    /****************************** *
    * Explications fonction: Tempo():
    ****************************** **
    * Cette fonction permet d'attendre un certain temps entre 2 instructions.Ici elle va nous etre utile
    pour EN en effet pour qu'une donnée soit validé il faut que EN passe a l'etat Haut pendant au moins
    450 us c'est la fonction tempo qui nous permet d'attendre pendant cette durée.*/


    void tempo(void)
    {
    long int i;
    for(i=0;i<10000;i++);
    }

    /****************************** *
    * Explications fonction: validation():
    ****************************** **
    * Creer une impulsion d'au moins 450ns sur EN ce qui permet de valider les donnees envoyée */

    void validation()
    {
    LCD_Data=LCD_EN_1;
    tempo();
    LCD_Data=LCD_EN_0;


    }

    /****************************** *
    * Explications fonction: busy():
    ****************************** **
    * Verifie que le LCD est en mesure de traiter l'information suivante
    Pour cela, il faut demander une lecture en mode commande, et tester
    le flag Busy BF. Lorsque BF=0, l'afficheur est près à recevoir une nouvelle commande ou donnée.*/


    void busy()
    {
    unsigned char LCD_Data_Busy;


    LCD_Data_Busy=LCD_Data;/*Sauvegarde des données du port*/


    LCD_Data=LCD_RS_0;
    LCD_Data=LCD_RW_1;

    MCF5282_GPIO_DDRQS =0xf7;/*On met la pin relié au BF en entrée*/

    MCF5282_GPIO_PORTQSP=MCF5282_G PIO_PORTQSP|0x40;/*On met En a 1*/



    /*Boucle de test du Busy Flag*/

    do
    {
    }
    while((MCF5282_GPIO_PORTQSP&0x 08)!=0);



    MCF5282_GPIO_DDRQS =0xff;/*On remet le port Qs en sortie*/

    LCD_Data=LCD_Data_Busy;/*On remet le port comme il était*/

    }






    /****************************** *
    * Explications fonction: init():
    ****************************** **
    *Initialise le LCD
    Pour l'initialisation d'un LCD en mode quatre bits, on commence par forcer celui-ci
    dans le mode huit bits, puis quand on est sûr que celui-ci est valide, on bascule en mode
    quatre bits. Comme on ne sait pas au début de l'initialisation si le LCD est positionné
    en quatre ou huit bits, il est nécessaire d'envoyer la commande de passage en mode huit bits
    plusieurs fois de façon à ce que celle-ci soit comprise, que le mode de départ soit quatre
    ou huit bits. Les données sont écrites ou lues en envoyant séquentiellement les quatres bits
    de poids fort suivi des quatres bits de poids faible, séparés par une impulsion positive d'au
    moins 450 ns sur la ligne E. */

    void init()
    {


    LCD_Data=LCD_EN_0;
    LCD_Data=LCD_RS_0;
    LCD_Data=LCD_RW_0;



    /* On passe en mode 4 bits.0x20*/

    LCD_Data=0x02;/*4 premier bits de la commande envoyé (bit de poids fort)*/
    validation();

    LCD_Data=0x00;/*4 dernier bits de la commande envoyé (bit de poids faible)*/
    validation();


    /****************************** *******************/

    /* Met en fonction l'affichage,le curseur,le clignotement du curseur.0x0F */

    LCD_Data=0x00;/*4 premier bits de la commande envoyé (bit de poids fort)*/
    validation();

    LCD_Data=0x0f;/*4 dernier bits de la commande envoyée (bit de poids faible)*/
    validation();


    /****************************** *******************/

    /*Efface l'ensemble de la mémoire de donnée sans toucher
    au générateur de caractères. Ramène le curseur en position « home », à l'adresse 00.0x01*/

    LCD_Data=0x00;
    validation();

    LCD_Data=0x01;
    validation();



    /****************************** *******************/

    /* On active la deuxième ligne du LCD en mode 4 bits .0x28*/

    LCD_Data=0x02;
    validation();

    LCD_Data=0x08;
    validation();


    /****************************** *******************/

    /* Met en fonction l'affichage,le curseur,le clignotement du curseur.0x0F */

    LCD_Data=0x00;
    validation();

    LCD_Data=0x0f;
    validation();


    /****************************** *********************/


    /*Définit le sens de déplacement du curseur après l'apparition d'un caractère.0x04*/


    LCD_Data=0x00;
    validation();

    LCD_Data=0x01;
    validation();

    /****************************** *******************/
    }


    void ecrire(unsigned char var)
    {
    unsigned char variable;

    variable=var;

    variable=variable>>4; /*On decale de 4 bits pour ne recuperer que les bit de poids fort
    que nous devon envoyer en premier*/

    LCD_Data=variable;/*On écris sur le port*/

    LCD_Data=LCD_RS_1;/*On passe en mode donnée*/
    validation();/*On valide les données sur le port*/
    busy();

    variable=var;/*On recupère le caractère*/

    variable=variable&0x0f;/*On ne garde que les bits de poids faible*/

    LCD_Data=variable; /*On écris sur le port*/
    LCD_Data=LCD_RS_1; /*On passe en mode donnée*/
    validation();/*On valide les données sur le port*/
    busy();


    }



    void main(void)
    {

    unsigned char tab[16]="BIENVENUE A TOUS";
    unsigned char tab2[8]="Coldfire";
    unsigned char caractere;
    int k;

    /* Configuration du PORT QS de la coldfire en sortie */

    MCF5282_GPIO_PQSPAR =0x00;
    MCF5282_GPIO_DDRQS =0xff;
    MCF5282_GPIO_PORTQS =0;

    /* On execute l'initialisation du LCD*/
    init();


    /* Affichage du message sur la prmeière ligne */

    for(k=0;k<16;k++)
    {
    caractere=tab[k];
    ecrire(caractere);

    }


    /****************************** *************************/



    /*On decalle la ddram pour ecrire sur la deuxieme ligne*/
    LCD_Data=0x0C;/*4 premier bit de la commande envoyé*/
    validation();

    LCD_Data=0x04;/*4 dernier bit de la commande envoyé*/
    validation();



    /*Affichage du message de la seconde ligne.*/

    for(k=0;k<8;k++)
    {

    caractere=tab2[k];
    ecrire(caractere);

    }
    /****************************** *************************/

    }



    Au cas ou je n'aurais pas été assez claire vous voyer que la fonction busy est appellé par la fonction ecrire.
    J'ai verifié grace a un oscillo le busy flag passe bien de 1 a 0 sans probleme. Le LCD commence donc a ecrire "BIENVENU" et arrivé a ce moment la le flag reste positionné a 1 du coup je ne sors plus de ma boucle do while.

    Si quelqu'un avais une petite idée pour expliquer ce phenomène ce serai super parce que je bloque completement la;

    D'avance merci

    -----

  2. #2
    mperu

    Re : Problème Busy flag LCD 4 bits

    Bonjour,

    Pour la lecture du busy flag il me semble bien qu'il faudrait "pulser" le EN dans votre boucle "while".

    Si la lecture de l'anglais n'est pas un problème pour vous je vous suggère la page suivante: http://www.8051projects.net/lcd-inte...g/busyflag.php.

    Cordialement,

    Michel

Discussions similaires

  1. Afficheur LCD 2X16 caractères en mode 4 bits
    Par socomajor dans le forum Électronique
    Réponses: 8
    Dernier message: 11/02/2013, 11h28
  2. afficheur LCD 2*16/mode 4-bits
    Par omar.STE dans le forum Électronique
    Réponses: 12
    Dernier message: 03/09/2008, 18h01
  3. récupération du mot de 8 bits sur 4 bits
    Par grd666 dans le forum Électronique
    Réponses: 3
    Dernier message: 09/07/2008, 10h16
  4. Pb affichage LCD 4 bits
    Par edhedh dans le forum Électronique
    Réponses: 4
    Dernier message: 12/06/2008, 17h59
  5. Convertir 12 bits série en 7 bits paralléle avec un HC11 ?
    Par djsat dans le forum Électronique
    Réponses: 2
    Dernier message: 03/03/2005, 08h39
Découvrez nos comparatifs produits sur l'informatique et les technologies.