Page 1 sur 1

Afficheur LCD, LCD graphique GDM12864A

Publié : 20 févr. 2006 10:13
par dnkz
Salut !

Je me trouve confronté a un problème et je n'arrive pas a trouvé la solution.

Je pilote l'afficheur LCD avec un port parallèle:

8 bits de donnée (port parallèle) -> 8 bits de l'afficheur

/select in (17) = RS
Init (16) = CS2
/Autofeed (14) = CS1
/strobe (1) = E
R/W bloqué a l'etat bas

J'ai testé chaque broche du port parallèle avec un oscillo pour savoir si c'etait inversé.

J'ecris un programme en C++ grace a un driver. Resulat, j'ai bien un affichage parfois a l'endroit souhaité et parfois non, l'affichage est donc assez aléatoire.


DLPortIO1->Port [0x37A] = 0xD8;
DLPortIO1->Port [0x378] = 0x3E; // Extinction du LCD
DLPortIO1->Port [0x37A] = 0xD9; // front descendant pour valider avec toujours CS2=0 CS1=1

DLPortIO1->Port [0x37A] = 0xD8;
DLPortIO1->Port [0x378] = 0x40; // config de l'adresse
DLPortIO1->Port [0x37A] = 0xD9;

DLPortIO1->Port [0x37A] = 0xD8;
DLPortIO1->Port [0x378] = 0xB8; // config de la page
DLPortIO1->Port [0x37A] = 0xD9;

for (int i=0; i<5; i++)
{
DLPortIO1->Port [0x37A] = 0xD0;
DLPortIO1->Port [0x378] = 0xFF; // donnée
DLPortIO1->Port [0x37A] = 0xD1;
}

DLPortIO1->Port [0x37A] = 0xD8;
DLPortIO1->Port [0x378] = 0x3f; //affichage ecran
DLPortIO1->Port [0x37A] = 0xD9;
}

J'essaye donc d'affiché 4 ligne De 1 donc noir.

Quelqu'un voit une erreur ?

Merci d'avance

Publié : 20 févr. 2006 13:50
par JP
Salut dnkz et :welcome: ,

Je crois me souvenir (souvenir très lointain) qu'il faut attendre que le LCD ait traité une commande avant d'en envoyer une autre. Ca se fait soit avec une petite tempo ou alors en allant lire un bit d'interruption.

Essayes de comparer avec ce programme et voir dans quel cas la fonction WaitDisplayReady est utilisée.

a+
JP

Publié : 20 févr. 2006 14:19
par dnkz
Merci pour cette réponse, j'ai fait un nouveau morceau de programme :


DLPortIO1->Port [0x37A] = 0xD8; // E=1, RS=0, CS1=1, CS2=0
DLPortIO1->Port [0x378] = 0x3f; // Allumé LCD
DLPortIO1->Port [0x37A] = 0xD9; // E=0, RS=0, CS1=1, CS2=0

Sleep(3000); // 3sec

DLPortIO1->Port [0x37A] = 0xDA; // CS1=CS2=0, RS=0, E=1

DLPortIO1->Port [0x37A] = 0xD8;
DLPortIO1->Port [0x378] = 0x40; // config adresse
DLPortIO1->Port [0x37A] = 0xD9;

DLPortIO1->Port [0x37A] = 0xD8;
DLPortIO1->Port [0x378] = 0xB8; // config de la page
DLPortIO1->Port [0x37A] = 0xD9;

for (int i=0; i<5; i++)
{
DLPortIO1->Port [0x37A] = 0xD0; // E=1, RS=1, CS1=1, CS2=0
DLPortIO1->Port [0x378] = 0xFF; // données
Sleep(1);
DLPortIO1->Port [0x37A] = 0xD1; // E=0, RS=1, CS1=1, CS2=0
}

DLPortIO1->Port [0x37A] = 0xDA; // CS1=CS2=0, RS=1, E=1


Cependant j'ai une erreur qui reste, l'affichage de mes FF s'affiche soit en haut de l'écran soit en bas (avant c'etait pire) et toujours dans la bonne partie de l'écran.

Cela donne une sorte de décalage.

Programation de la GLCD 12864

Publié : 30 mars 2006 23:19
par VARIO-VMR
As tu toujours des difficultés, j'ai fait un driver c qui marche correctement. Tu trouvera en PJ l'enregistrement exel (Avec courbes) des sorties vers la LCD. Bus de commande et bus data.

CE fichier te permettra de voir dans quel ordre les commandes sont envoyée et le delai de prise en compte des données qui est bien inférieur a 3 secondes.