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 Réponses :
@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.
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.
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.
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.
LCD_Initialize()
une fonction de bibliothèque, ou celle que vous définissez dans votre code? (Même question pourSYSTEM_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 avecLCDPutStr("test2");
quand ils reçoivent tous les deux une chaîne?LCDPutChar
avait-il pas un avertissement du compilateur à propos deLCDPutChar
? 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 etSYSTEM_Initialize ()
est une fonction par défaut générée automatiquement par MPLABLCD_Initialize()
fait référence à la fonctionvoid 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.