STM32 Project Consulting: STM32F4 Connecter à un afficheur LCD 2x16

Pages

STM32F4 Connecter à un afficheur LCD 2x16





   Afficheur LCD 2x16 :

            



Les 16×2 usage général ou 16×1 caractères LCD sont très faciles à s’interfacer avec n’importe quel microcontrôleur, et ceux-ci ne sont pas vraiment très cher et abondamment disponibles dans le monde entier. Une fois que vous apprendre à interfacer, il sera le périphérique de sortie la plus simple et très fiable utilisée que par vous!
De plus, pour le projet de micro-contrôleur basé, non pas à chaque fois une débogueur peut être utilisé. Tous les affichages LCD utilisent le même, ou l’une quelconque de la CI sur la base de l’architecture introduite par Hitachi.
Ce composant est spécialement fabriqué pour être utilisé avec les microcontrôleurs, ce qui signifie qu’il ne peut être activée par des circuits CI standard. Il est utilisé pour afficher des messages différents sur un écran à cristaux liquides miniature. Le modèle décrit ici est pour son faible prix et de grandes capacités les plus fréquemment utilisés dans la pratique. Il est basé sur le microcontrôleur HD44780 (Hitachi) et peut afficher des messages sur deux lignes de 16 caractères chacune. Il permet d’afficher toutes les lettres de l’alphabet, les lettres grecques, des signes de ponctuation, des symboles mathématiques, etc Il est également possible d’afficher des symboles constitués par l’utilisateur. Autres fonctions utiles comprennent déplacement automatique des messages (gauche et droite), l’apparence du curseur, rétro-éclairage LED, etc

Configuration des broches(pin)



LCD Memoire

Affichage à cristaux liquides contient trois blocs de mémoire:
DDRAM Display Data RAM;
CGRAM Générateur de caractères RAM.
CGROM générateur de caractères ROM.

DDRAM Memoire


Mémoire DDRAM est utilisé pour stocker des caractères à afficher. La taille de cette mémoire est capable de stocker 80 caractères. Des emplacements de mémoire sont directement reliés à des caractères sur l’affichage.
Tout fonctionne très simplement: il suffit de configurer l’affichage pour incrémenter automatiquement les adresses (décalage à droite) et définir l’adresse de départ pour le message qui sera affiché (par exemple 00 hex).
Par la suite, tous les caractères envoyés par les lignes D0-D7 sera affiché dans le format de message que nous sommes habitués à de gauche à droite. Dans ce cas, l’affichage commence à partir du premier champ de la première ligne parce que l’adresse initiale est 00 hex. Si plus de 16 caractères sont envoyés, puis chacun d’entre eux sera mémorisé, mais seuls les seize premiers caractères seront visibles. Pour afficher le reste d’entre eux, la commande shift doit être utilisé. Pratiquement, tout se passe comme si l’écran LCD est une fenêtre qui se déplace de gauche à droite sur des emplacements de mémoire contenant des caractères différents. En réalité, c’est la façon dont l’effet de décaler le message sur l’écran a été créé.
Si le curseur est active, il apparaît à l’emplacement alors adressé. En d’autres termes, quand un caractère apparaît à la position du curseur, il se déplace automatiquement vers le prochain emplacement adressé.
Il s’agit d’une sorte de mémoire RAM afin que les données peuvent être écrites et lues de lui, mais son contenu est irrémédiablement perdu lorsque l’alimentation est coupée.

CGROM Memoire

CGROM mémoire contient une carte de caractère standard avec tous les caractères qui peuvent être affichés sur l’écran. Chaque caractère est affecté à un emplacement mémoire:

Les adresses de mémoire CGROM correspondent aux caractères de l’ASCII. Si le programme en cours d’exécution se heurte à «P caractère d’envoi au port ‘une commande alors la valeur binaire 0101 0000 apparaît sur ​​le port. Cette valeur est l’équivalent ASCII à l’P. caractère Il est ensuite écrit à un écran LCD, ce qui se traduit par l’affichage du symbole de l’emplacement de 0101 0000 CGROM. En d’autres termes, ‘P’ le caractère est affiché. Cela s’applique à toutes les lettres de l’alphabet (majuscules et petites), mais pas à des chiffres. Comme on le voit sur ​​la carte précédente, les adresses de tous les chiffres sont poussés en avant par 48 par rapport à leurs valeurs (chiffres adresse 0 est de 48, chiffre 1 adresse est 49, chiffre 2 adresse est 50, etc.) Par conséquent, afin d’afficher les chiffres correctement, il est nécessaire d’ajouter le nombre décimal 48 à chacun d’entre eux avant d’être envoyé à un écran LCD.
Quel est l’ASCII? Depuis leur création jusqu’à aujourd’hui, les ordinateurs peuvent reconnaître des chiffres, mais pas des lettres. Cela signifie que toutes les données de swaps ordinateur avec un périphérique a un format binaire, même si celle-ci est reconnue par l’homme comme des lettres (le clavier est un excellent exemple). En d’autres termes, chaque caractère correspond à une combinaison unique de zéros et de uns. ASCII est codage de caractères basé sur l’alphabet anglais. Code ASCII spécifie une correspondance entre les symboles de caractères standard et leurs équivalents numériques.

CGRAM Memoire

En dehors de caractères standard, l’écran LCD peut également afficher des symboles définis par l’utilisateur lui-même. Il peut être n’importe quel symbole dans la taille des pixels 5×8. Mémoire RAM appelée CGRAM dans la taille de 64 octets, il permet.
Registres de mémoire sont 8 bits de large, mais seulement 5 bits de poids faible sont utilisés. Une logique (1) dans chaque registre représente un point grisé, alors que 8 emplacements regroupés représenter un caractère. Il est mieux illustré dans la figure ci-dessous:

Symboles sont généralement définis au debut du programme par des zéros écriture simple et ceux de registres de mémoire CGRAM afin qu’ils forment des formes souhaitées. Pour les afficher, il suffit de spécifier son adresse. Faites attention à la première colonne la carte CGROM de caractères. Il ne contient pas les adresses de mémoire RAM, mais les symboles dont nous discutons ici. Dans cet exemple, on entend par «écran 0 ‘- affichage’ C ‘, signifie’ affichage 1 ‘-’ affichage ‘ž’ etc

Contrôle et commandes d’affichage



Maintenant, l’instruction peut être divisée principalement dans quatre types
1) Les instructions function set
2) adresser des instructions set
3) Les instructions de transfert de données avec la mémoire RAM interne
4) Autres
Détails des instructions

1) Lire les données de la RAM

RS
R/W
DB7
DB6
DB5
DB4
DB3
DB2
DB1
DB0
1
1
D7
D6
D5
D4
D3
D2
D1
D0
Lire des données binaires 8 bits de DDRAM / CGRAM
La sélection de RAM est réglé par le jeu d’instructions adresse précédente. Si le jeu d’instruction d’adresse de RAM n’est pas exécutée avant l’instruction, les données qui sont lues premier est invalide, parce que la direction de l’AC n’est pas déterminée. Si la RAM de données est lu à plusieurs reprises sans instruction RAM set adresse avant opération de lecture, les données de la RAM correctes à partir de la seconde, mais les premières données serait inexact, car il n’y a pas de temps à transférer les données de la RAM. En cas de DDRAM opération de lecture, l’instruction déplace le curseur joue le même rôle que l’enseignement DDRAM ensemble d’adresses, il transfère également les données RAM à registres de données de sortie.
Après opération de lecture, le compteur d’adresses de données est automatiquement augmentée ou réduite par 1 selon le mode d’entrée. Après CGRAM opération de lecture, décalage d’affichage ne ​​peut pas être exécuté correctement.
* En cas d’opération d’écriture RAM, CA est augmenté ou diminué de 1 tel que celui de l’opération de lecture. En ce moment AC indique la position d’adresse suivant, mais les données antérieures peuvent seulement par l’instruction de lecture.

2) Écrire des données dans la RAM

RS
R/W
DB7
DB6
DB5
DB4
DB3
DB2
DB1
DB0
1
0
D7
D6
D5
D4
D3
D2
D1
D0
Ecrire des données binaires à 8 bits DDRAM / CGRAM. La sélection des CGRAM ou DRAM est fixé par le jeu d’instructions adresse précédente; jeu d’adresses DDRAM, jeu d’adresse CGRAM. Jeu d’instructions RAM peut aussi déterminer la direction AC à la RAM.
Après opération d’écriture, l’adresse est automatiquement augmenté ou diminué de 1 selon le mode d’entrée.

3) Lire drapeau d’occupation et adresse

RS
R/W
DB7
DB6
DB5
DB4
DB3
DB2
DB1
DB0
0
1
BF
AC6
AC5
AC4
AC3
AC2
AC1
AC0
En faisant cette lecture de fonctionnement, il est possible de déterminer si l’écran LCD effectue une opération interne ou non. Si l’indicateur d’occupation (BF) est élevée, une opération interne qui se passe à l’intérieur de l’écran LCD à ce moment particulier. Pour effectuer une opération supplémentaire de la source de données (par exemple micro-contrôleur) doit attendre que le BF à l’état bas. Ici, la valeur du compteur d’adresse peut également être lu.

4) Adresse DDRAM Set

RS
R/W
DB7
DB6
DB5
DB4
DB3
DB2
DB1
DB0
0
0
1
AC6
AC5
AC4
AC3
AC2
AC1
AC0
Définissez l’adresse DDRAM à la CA, cette instruction rend les données disponibles auprès de DDRAM MPU. En mode d’affichage 1-ligne, les gardes d’adresses DDRAM de “00H” à “4FH”. En mode d’affichage sur 2 lignes, l’adresse DDRAM dans les gammes de première ligne de “00H” à “27H”, et l’adresse DDRAM dans la 2ème ligne est de «40H» à «67H».

5) Régler l’adresse CGRAM

RS
R/W
DB7
DB6
DB5
DB4
DB3
DB2
DB1
DB0
0
0
0
1
AC5
AC4
AC3
AC2
AC1
AC0
Définissez l’adresse CGRAM à la CA. Cette instruction rend les données disponibles à partir de CGRAM MPU.
6)      Function Set
RS
R/W
DB7
DB6
DB5
DB4
DB3
DB2
DB1
DB0
0
0
0
0
1
DL
N
F
X
X
DL: Interface bit de données de contrôle de longueur
DL = ’1 ‘signifie que le mode 8 bits de transfert de données.
DL = ’0 ‘signifie que le mode 4 bits de transfert de données
Lorsque le mode 4 bits est activé, les données doivent être transférées en deux parties, 4bits premier supérieures, puis inférieures 4 bits.
N: nombre de bits ligne de l’écran de contrôle
N = ’1 ‘permet aux caractères à afficher dans 2-lignes
N = ’0 ‘permet de caractères à afficher dans la première ligne seulement
F: bit de commande d’affichage des polices
F = ’0 ‘utiliser le mode 5 x 8 points le format d’affichage
F = ’1 ‘utiliser le mode 5 × 11 points le format d’affichage

7) Maj Curseur ou écran

RS
R/W
DB7
DB6
DB5
DB4
DB3
DB2
DB1
DB0
0
0
0
0
0
1
S/C
R/L
X
X
Sans l’écriture ou la lecture des données d’affichage, changer de position curseur gauche / droite ou l’affichage.
Cette instruction est faite pour corriger ou rechercher ou afficher des données. Pendant le mode d’affichage sur 2 lignes, curseur se déplace vers la 2ème ligne après le chiffre des 40 ans de la 1ère ligne.
Lorsque les données affichées est passée à plusieurs reprises, chaque ligne se déplace individuellement.
Lorsque le poste d’affichage est effectuée, le contenu du compteur d’adresse ne sont pas modifiés.

8)  On / Off Controle

RS
R/W
DB7
DB6
DB5
DB4
DB3
DB2
DB1
DB0
0
0
0
0
0
0
1
D
C
B
Cette instruction commande d’affichage, le curseur et clignotement du curseur.
D: Affichage activé / désactivé bit de commande
D = ’1 ‘signifie l’affichage complet est activé
D = ’0 ‘signifie l’affichage est complètement fermé. Mais les données d’affichage reste en DDRAM.
C: le curseur Marche / Arrêt bit de commande
C = ’1 ‘spires sur le curseur
C = ’0 ‘désactive le curseur. Mais I / D registre conserve les données
B: clignotement du curseur Marche / Arrêt bit de commande
B = ’1 ‘permet de clignotement du curseur périodiquement.
B = ’0 ‘arrête le curseur clignote et le curseur semble stable si le curseur est activé.

9) Réglage du mode d’entrée(Entry set)

RS
R/W
DB7
DB6
DB5
DB4
DB3
DB2
DB1
DB0
0
0
0
0
0
0
0
1
I/D
SH
Cette instruction définit la direction de déplacement du curseur et l’affichage.
Lorsque les E / D = ’1 ‘curseur se déplace vers la droite et adresse DDRAM est augmenté de 1.
Lorsque E / D = ’0 ‘curseur se déplace vers la gauche et adresse DDRAM est diminué de 1.
CGRAM fonctionne de la même manière dans ce contexte.

10) Retour Accueil

RS
R/W
DB7
DB6
DB5
DB4
DB3
DB2
DB1
DB0
0
0
0
0
0
0
0
0
1
X
Cette instruction définit l’adresse à l’encontre de ’00h ‘, et renvoie le curseur sur la première colonne de la première ligne. Et si l’affichage est décalé précédemment, cette instruction se déplace aussi. Le contenu DDRAM ne changent pas dans cette instruction.

11) Effacer Tous

RS
R/W
DB7
DB6
DB5
DB4
DB3
DB2
DB1
DB0
0
0
0
0
0
0
0
0
0
1
Effacer toutes les données d’affichage en écrivant “20H” (code ASCII du caractère «espace») à toutes les adresses DDRAM, ET consigne adresse DDRAM compteur (AC) pour “00H”. Il renvoie le curseur à la première colonne de la première ligne et établit le mode d’entrée pour incrémenter le mode (I / D = ’1 ‘).
Interface 8-bits et 4 bits de LCD
Maintenant, la question est de savoir comment afficher des données dans l’écran LCD ou donner l’ordre à celui-ci. Il ya deux modes de transfert de données sont pris en charge par les écrans LCD. Le premier est le mode 4 bits, un autre est en mode 8 bits. Pour transférer des données en mode 8 bits, commencez par mettre vos données dans le bus 8 bits, puis mettre la commande dans le bus de commande, puis les impulsions du signal de validation.
Pour envoyer des données en mode 4 bits, d’abord mis 4bit supérieures dans le bit de données 4 bus connecté à 4MSB broches écran LCD, puis mettez signaux de commande dans le bus de commande, puis pulser la broche E une fois. Prochaine mise bas le bit 4 dans le bus de données et d’impulsion de l’axe E de nouveau. Voici un organigramme décrivant simplement.

LCD Connection

Selon le nombre de lignes sont utilisées pour la connexion d’un écran LCD pour le microcontrôleur, il ya des modes LCD 8-bits et 4 bits. Le mode approprié est sélectionné au début de l’opération dans le processus appelé «initialisation». Le mode 8-bit LCD utilise sorties D0-D7 pour transférer des données comme il est expliqué à la page précédente.
L’objectif principal du mode 4-bit LCD est de sauver précieux broches E / S du microcontrôleur. Seuls les 4 bits supérieurs (D4-D7) sont utilisés pour la communication, tandis que d’autres peuvent être laissées libres. Chaque élément de données est envoyé à l’écran en deux étapes-quatre bits supérieurs sont transmis en premier (normalement à travers les lignes D4-D7), puis quatre bits de poids faible. Initialisation de l’écran LCD permet de relier et interpréter les bits reçus correctement.


Les données sont rarement lues à partir de l’écran LCD (il est principalement transférée du microcontrôleur à l’écran) et il est souvent possible d’économiser un supplément de broche E / S par simple reliant la broche R / W à la terre. Une telle économie a son prix. Les messages seront normalement affiché, mais il ne sera pas possible de lire le drapeau occupé car il n’est pas possible de lire l’affichage soit. Heureusement, il existe une solution simple. Après l’envoi d’un caractère ou d’une commande, il est important de donner à l’écran LCD assez de temps pour faire son travail. Compte tenu du fait que l’exécution d’une commande peut durer environ 1.64mS, il suffira d’attendre environ 2 ms pour les LCD.

 STM32_LCD Code Example


7 commentaires:

  1. je travaille sur une carte stm32f100 et un afficheur lcd jhd162a 16*2.
    Mon problème c'est que l afficheur affiche juste la 1er ligne tout noir et rien dans la 2eme ligne meme si la carte vide (ne contient aucun code).
    Et merci

    RépondreSupprimer
  2. Diminuer au contraste du LCD ou reinitialise la DDRAM memoire ...
    Verifié les donnée envoyer vers les pins du GPIO

    RépondreSupprimer
  3. Diminuer au contraste du LCD ou reinitialise la DDRAM memoire.comment ca?
    voila mon initialisation je crois qu'içl y a une chose qui cloche
    void lcd_init(void)
    {
    volatile unsigned char i = 0;
    volatile unsigned int delayCnt = 0;
    RCC_APB2PeriphClockCmd(LCD_CLK_LINE, ENABLE);
    GPIO_InitStructure.GPIO_Pin = LCD_D4|LCD_D5|LCD_D6|LCD_D7|LCD_RS|LCD_RW|LCD_EN;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

    GPIO_Init(LCD_GPIO, &GPIO_InitStructure);

    GPIO_ResetBits(LCD_GPIO, LCD_RS | LCD_EN | LCD_RW);

    for(delayCnt = 0; delayCnt < 300000; delayCnt++);

    for(i = 0; i < 3; i++) {
    lcd_writenibble(0x03);
    for(delayCnt = 0; delayCnt < 30000; delayCnt++);
    }

    lcd_writenibble(0x02);

    for(delayCnt = 0; delayCnt < 6000; delayCnt++);

    lcd_writecommand(HD44780_FUNCTION_SET |
    HD44780_FONT5x7 |
    HD44780_TWO_LINE |
    HD44780_4_BIT);

    lcd_writecommand(HD44780_DISPLAY_ONOFF |
    HD44780_DISPLAY_OFF);

    lcd_writecommand(HD44780_CLEAR);

    lcd_writecommand(HD44780_ENTRY_MODE |
    HD44780_EM_SHIFT_CURSOR |
    HD44780_EM_INCREMENT);

    lcd_writecommand(HD44780_DISPLAY_ONOFF |
    HD44780_DISPLAY_ON |
    HD44780_CURSOR_OFF |
    HD44780_CURSOR_NOBLINK);
    }

    Et merci

    RépondreSupprimer
  4. Take a look I have been updatet the article . I have met an example of project that he work perfectly . Take a look and define your error !
    :D

    RépondreSupprimer
  5. STM32_LCD Code Example file not found, please, can you re-upload the code?

    RépondreSupprimer
  6. Bonjour,
    J'ai lu l'article en entier et je le trouve vraiment bon. Le seul bémol est que l'exemple de code est HS sur le site de téléchargement.

    Pourriez-vous s'il vous plait le mettre à jour.
    Merci par avance.

    RépondreSupprimer