1
votes

L'écran LCD affiche des caractères aléatoires (MPLAB)

J'essaie de connecter mon écran LCD (16x02 QAPASS) à mon PIC16F1937 sur MPLAB, mais il affiche des caractères aléatoires (dans ce cas, des caractères chinois, des points d'interrogation et une barre oblique) au lieu de caractères alphanumériques. Cependant, toutes les connexions PIN ont été déclarées dans la bibliothèque et correctement connectées au PIC. J'utilise un compilateur XC8.

Voici les connexions:

VSS -> GND
VDD -> 5 V
VO -> résistance 680Î ©
EN -> RD1
RW -> RD6
RS -> RD0
LCD_D4 -> RD2
LCD_D5 -> RD3
LCD_D6 -> RD4
LCD_D7 -> RD5
Anode -> 5V
Cathode -> GND

Le projet global est un capteur qui détecte la distance d'un objet et affiche cette même distance sur l'écran LCD. Le fait que l'écran LCD n'affiche pas le caractère compromet le reste du projet car je ne peux pas configurer les calculs mathématiques si l'écran LCD échoue.

1) Code de la bibliothèque: lcd.h (Fichiers d'en-tête) C'est le code fourni par Microchip pour la bibliothèque LCD et j'ai ajouté les connexions PIN-LCD:

#include "mcc_generated_files/mcc.h"
#include "lcd.h"
#define _XTAL_FREQ 4000000

 void main(void)
 {
 // initialize the device
 SYSTEM_Initialize();

 // initialize LCD
 LCD_Initialize();

LCDGoto(4, 1);           // go to column 4, row 1
LCDPutChar("test1");
LCDGoto(3, 2);           // go to column 3, row 2
LCDPutStr("test2");

while (1)
{

}
}

2) Library Code 2: lcd.c (Source Files) Contient les commandes liées à l'écran LCD

3) Code principal: main.c (fichiers source)

// single bit for selecting command register or data register 
#define instr 0 #define data 1

// These #defines create the pin connections to the LCD in case they 
are changed on a future demo board
#define LCD_PORT     PORTD
#define LCD_PWR      PORTDbits.RD7   // LCD power pin
#define LCD_EN       PORTDbits.RD1   // LCD enable
#define LCD_RW       PORTDbits.RD6   // LCD read/write line
#define LCD_RS       PORTDbits.RD0   
#define LCD_D4       PORTDbits.RD2
#define LCD_D5       PORTDbits.RD3
#define LCD_D6       PORTDbits.RD4
#define LCD_D7       PORTDbits.RD5

// LCD register select line

#define NB_LINES    2   // Number of display lines
#define NB_COL      16  // Number of 
characters per line


4 commentaires

LCD_Initialize() une fonction de bibliothèque, ou celle que vous définissez dans votre code? (Même question pour SYSTEM_Initialize() ) À quel moment de votre code voyez-vous les caractères aléatoires sur l'écran LCD? Y a-t-il des valeurs de retour que vous devriez vérifier sur les deux fonctions que j'ai posées? Dans l'affirmative, je commencerais par examiner ces valeurs.


Pourquoi utilisez-vous une fonction différente avec LCDPutChar("test1"); comme avec LCDPutStr("test2"); quand ils reçoivent tous les deux une chaîne? LCDPutChar avait-il pas un avertissement du compilateur à propos de LCDPutChar ? Il est possible que l' adresse transmise à LCDPutChar() soit considérée comme une sorte de configuration, au lieu du caractère imprimable attendu.


@ryyker LCD_Initialize() est une fonction de bibliothèque et SYSTEM_Initialize () est une fonction par défaut générée automatiquement par MPLAB LCD_Initialize() fait référence à la fonction void LCD_Initialize() située dans le fichier lcd.c. Je vois des caractères aléatoires une fois que j'ai écrit le code dans main.c, sinon rien ne s'affiche sur l'écran LCD.


@WeatherVane c'est une inattention de ma part d'avoir publié le code en utilisant les deux fonctions. Mais initialement, le code a été compilé avec uniquement la fonction LCDPutStr , pour un résultat similaire.


4 Réponses :


0
votes

@AfricaOMM,

Il semblerait que votre code soit basé sur le code de ce lien .

Comme vous n'avez publié que des fragments, il est impossible de déterminer à quel point le code à partir duquel vous essayez de travailler est mauvais.

Le code sur le lien que j'ai trouvé a un copyright Microchip mais il est de mauvaise qualité avec des bugs qui vous causeront plusieurs problèmes.

Vous en tireriez avantage à long terme en réglant vous-même ce gâchis.

Mon meilleur conseil est de mettre des LED sur les lignes de signal qui se connectent à votre module LCD et de vérifier que votre PIC16F1937 définit chaque ligne dans l'état correct lorsque le code d'initialisation s'exécute.

Je soupçonne que vous avez des erreurs de câblage ainsi que des erreurs dans votre code.


0 commentaires

0
votes

Problème résolu!

Le problème était lié à la bibliothèque. La bibliothèque fournie par Microchip est pleine de dysfonctionnements, donc lors de l'exécution de commandes, le PIC ne reçoit pas les informations supposées qu'il devrait recevoir, c'est pourquoi l'écran LCD affiche des caractères aléatoires.

Je vous propose d'utiliser la librairie développée par electrosome : je confirme qu'elle est 100% opérationnelle, grâce à eux!

Autre chose: pour résoudre le problème de contraste, il faudra idéalement connecter le port VO du LCD à un potentiomètre.


0 commentaires

0
votes

Lorsque nous envoyons un msg sur l'écran LCD, il affiche des caractères amusants ou des symboles étranges car le matériel nécessite un certain temps pour se rafraîchir. Vous pouvez essayer de donner un peu de temps de sommeil après cette ligne

LCDPutStr("test2").   Put above sleep time
LCD.sleep(5)

Cela a fonctionné dans mon cas. Cela a fonctionné dans mon cas.


0 commentaires

0
votes

Lorsque nous envoyons un msg sur l'écran LCD, il affiche des caractères amusants ou des symboles étranges car le matériel nécessite un certain temps pour se rafraîchir. Vous pouvez essayer de donner un peu de temps de sommeil après cette ligne

LCDPutStr("test2").   Put above sleep time
LCD.sleep(5)

Cela a fonctionné dans mon cas.


0 commentaires