Écrans LCD
From Eric
Contents |
Ecrans texte à base de HD44780
(A completer)
Ecrans graphiques à base de XXX
(A completer)
Ecran couleur ILI95
Il s'agit de l'écran utilisé par le lecteur MP3 radio.
Ecran Nokia 3510
Présentation
L'écran du Nokia 3510 se trouve aux alentours de 5€ chez nos amis chinois. C'est un écran couleur de résolution 104x84 pixels en 16*16*16 (4096) couleurs.
L'écran est en vendu soit en tant que pièce détachée "brute" pour Nokia 3510, soit découpé et monté sur une break-out board.
Utilisation
On trouvera sur Internet de nombreux exemples de drivers pour cet écran. On y trouvera surtout la valeurs des quelques constantes un peu magiques à utiliser lors de l'initialisation ; il faut savoir que certaines de ces constantes dépendent de la façon dont le chip est connecté à la matrice LCD, ce qui est parfaitement impossible à observer (sans rien démolir...).
L'écran se pilote en mode série à l'aide de 4 lignes :
- SDA : donnée
- SCLK : horloge
- CS : chip select (actif à l'état bas)
- RESET (actif à l'état bas)
Les données (SDA) sont échantillonnées le front montant de SCLK. Sur l'écran du 3510, le composant est configuré pour une transmission en 9 bits (c'est celle qui nécessite le moins de fils).
Deux types de données peuvent être transmises :
- les commandes, caractérisées par un premier bit (D/C) à 0
- les paramètres, caractérisisés par un premier bit (D/C) à 1
Les bits sont transmis par poids décroissant.
Ainsi, le code pour émettre une commande est le suivant (sur un ARM7) :
void nokia_send_cmd(U8 cmd) { int i; // Send 9th bit for command GPIO1->FIOCLR = ( 1 << SCLK_BIT ); GPIO1->FIOCLR = ( 1 << SDA_BIT ); GPIO1->FIOSET = ( 1 << SCLK_BIT ); // Serialize the word for ( i=0; i<8 ; i++) { GPIO1->FIOCLR = ( 1 << SCLK_BIT ); if ( cmd & 0b10000000 ) GPIO1->FIOSET = ( 1 << SDA_BIT ); else GPIO1->FIOCLR = ( 1 << SDA_BIT ); // Generate a rising edge on SCLK GPIO1->FIOSET = ( 1 << SCLK_BIT ); // Next bit cmd <<= 1; } }
Rien de très sorcier.
La difficulté réside dans l'initialisation du composant, qui requiert le respect d'un protocole précis.
Initialisation
La séquence d'initialisation est décrite dans la notice du S1S15G14 :
- Hard reset the chip
- Wait for 5ms for the chip to stabilize
- SW reset
- Wait for 5ms for the chip to stabilize
- Initialize the settings inside the IC
- Set refresh set
- Set display control
- Set gray scale
- Set RGB color lookup table
- Set gamma curve set
- Set power control
- Sleep out
- Set contrast
- Set temperature gradient
- Set booster voltage on
- Set inversion control
- Set pixel format (8 bits or 12 bits)
- Set memory access control
- Set display on
(Certaines de ces commandes peuvent être exécutées dans un ordre différent. Se référer à la notice.)
Certaines de ces commandes comportent des paramètres ; se référer au link code pour plus de détails.
Gestion de la couleur
L'écran offre deux modes de gestion de la couleur :
- un mode RRRGGGBB (8 bits) où la couleur d'un pixel est donnée par un mot de 8 bits :
- les trois bits de poids fort constituent un index sur une table de 8 niveaux de rouge,
- les trois bits suivants contituent un index sur une table de 8 niveaux de vert
- les 2 bits de poids fable contituent un index sur une table de 4 niveaux de bleu
- un mode RRRRGGGG BBBBRRRR GGGGBBBB (12 bits) où les couleurs de deux pixels successifs sont données par trois mots de 8 bits (soit 24=2x12 bits).
Le choix du mode de couleurs, 8 bits ou 12 bits est donnée par le commande COLMOD (3 => mode 12 bits, 2 => mode 8 bits).
Principe d'écriture sur l'écran
L'écriture sur l'écran se fait en deux phases :
- Sélection de la zone active au moyen de la commande de sélection de page (PASET) et de sélection de colonne (CASET). Ces deux commandes comportent deux paramètres, Start et End qui déterminent un intervalle de pages ou de colonnes.
- Ecriture d'un pixel (mode 8 bits) ou d'un 1/3 de pixel (mode 12 bits) au moyen de la commande d'écriture en RAM (RAMWR).
Considérons que l'axe des x est l'axe vertical (valeur entre 0 et 83) et l'axe y est l'axe horizontal (valeur entre 0 et 104).
Si la commande CASET prend pour paramètres (x,x+dx) et la commande PASET prend pour paramètres (y,y+dy), alors les opérations d'écriture en RAM successives affecteront les pixels situés en (x,y), puis chaque nouvelle opération d'écriture affectera le pixel situé en (x+1, y), ... , (x+dx, y),(x, y+1),(x+1, y+1),...,(x+dx, y+ dy).
Le sens du balayage peut être modifié au moyen de la commande de control d'ccès mémoire (MADCTL). La description qui précède correspond au mode 0b00100000 (qui n'est pas le mode par défaut).
Ce mode d'écriture permet d'écrire des caractères codés sur 8 bits très facilement. Considérons par exemple, le caractère c à afficher en (x,y). Chaque caractère est codé sur une matrice de 8x5 pixels.
- on définit la zone active en CASET (x,x+7) et PASSET (y,y+5)
- on récupère la première colonne de 8 pixels dans une table,
- on parcours les 8 pixels en choissisant la valeur de la couleur en fonction de l'état du pixel (allumé ou non) et on écrit en mémoire (RAMWR) cette valeur (mode 8 bits).
- puis on passe à la prochaine colonne de 8 bits (dans mon driver, chaque caractère comporte 5 colonnes de 8 pixels).
Grace à ce mécanisme de zone active, on écrit les 40 pixels grâce à une seule et même opération d'écriture (RAMWR) comportant 40 paramètres (les 40 pixels), sans avoir besoin de replacer le curseur en cours d'affichage.
La figure suivante illustre le processus d'écriture :
- la surface de l'écran est rerpésentée en vert
- les pixel sont représentés par des carrés gris
- la zone active est représentée par le rectangle jaune
- l'ordre d'écriture des pixels successifs est indiqué en rouge