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é.
Au cas ou je n'aurais pas été assez claire vous voyer que la fonction busy est appellé par la fonction ecrire.#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);
}
/****************************** *************************/
}
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
-----