Problème pour un envoi de caractère sur LCD + PIC 16F876A
Répondre à la discussion
Affichage des résultats 1 à 15 sur 15

Problème pour un envoi de caractère sur LCD + PIC 16F876A



  1. #1
    invitea183d2c3

    Problème pour un envoi de caractère sur LCD + PIC 16F876A


    ------

    Bonjour,

    Pour mon projet de fin d'études, je dois réaliser un programme qui reçoit des données via un module Xbee et l'afficher sur un écran LCD 16*2. A côté de cela, pour apprendre à mieux gérer le LCD, j'essai d'afficher un caractère sur cette écran. Seulement, la fonction " lcd_putch(); " n'est pas reconnue, et je ne sais pas comment la déclarer et comment l'adapter à mon programme. De plus, je ne parvient pas à écrire sur la deuxième ligne de mon LCD, uniquement sur la première et c'est assez gênant. Je souhaiterais obtenir votre aide pour l'affichage d'un caractere sur l'écran. Je vous joint mon code. Je veux qu'un caractère aléatoire s'affiche à côté du message "Caractere : " , là où il y'a un H, mais le H fait partie d'une chaîne de caractère et non pas un caractère envoyé par lcd_putch; ... Comment envoyer un véritable caractère généré aléatoirement ? Merci d'avance

    Code:
    /******************************************
     * Fichier : ABK PROJECT FILE.c           *
     * Auteur  : Abkouu                       *
     *                                        *
     *          *** CARACTERE ***             *
     *                                        *
     ******************************************/
    
    
    /***************************************
     ****** Fichiers Header & Defines ******
     ***************************************/
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <htc.h>
    #include <pic.h>
    #include <pic16f876a.h>
    #include <lcd.h>
    #define _XTAL_FREQ 4000000      //Fréquence du quartz 4 MHz
    
    //---------- Définitions entrées sorties ----------------//
    
    #define LCD_DATA	PORTB
    #define LCD_EN          RB5
    #define	LCD_RS          RB4
    #define LCD_CLEAR       0x1
    
    int c ;
    
    /***************************************
     ******** Mots de configuration ********
     ***************************************/
    
    __CONFIG(FOSC_XT & WDTE_OFF & PWRTE_OFF & BOREN_OFF & LVP_OFF & CPD_OFF & WRT_OFF & DEBUG_OFF & CP_OFF);
    
    
    //-------------------------------Déclaration des fonctions -------------------------
    void init_PIC(void);
    void lcd_init();
    void lcd_enable(char c);
    void lcd_send(char RegSelect, char c);
    void lcd_puts(const char *buffer);
    void lcd_putch(unsigned char c);
    
    /***************************************
     **** Début du programme principale ****
     ***************************************/
    
    void main(void)
    {
    
    	init_PIC();
    	__delay_ms(500);
    
    	lcd_init();
            LCD_RS = 1 ;
            LCD_EN = 1 ;
    	lcd_puts("Abk's XBProject");
    	__delay_us(1);
            LCD_RS = 1 ;
            LCD_EN = 1 ;
    
            __delay_ms(2500);
            lcd_init();
            LCD_RS = 1 ;
            LCD_EN = 1 ;
    	lcd_puts("Test CARACTERE !");
    	__delay_us(1);
            LCD_RS = 1 ;
            LCD_EN = 1 ;
    
            __delay_ms(1500);
            lcd_init();
            LCD_RS = 1 ;
            LCD_EN = 1 ;
            lcd_puts("Waiting...");
            __delay_ms(1);
            LCD_RS = 1 ;
            LCD_EN = 1 ;
    
            while(1) {
            __delay_ms(500);
                        //CARACTERE :
    
            lcd_init();
            LCD_RS = 1 ;
            LCD_EN = 1 ;
            lcd_puts(" Caractere : H");
            __delay_ms(100);
            LCD_RS = 1 ;
            LCD_EN = 1 ;
            for(;;) {}
    
            }}
    
    void init_PIC(void)
    {
    
    	ADCON1 = 0x07;  // Définition des PINS
            INTCON = 0x80;  // Pas d'interruption
    	PORTB = 0x00;
    	TRISB = 0x00;
            TRISC = 0x80;
    
    }
    
    void lcd_enable(char c)          //Mise de la DATA dans la DDRAM LCD
    	{
          LCD_DATA = (LCD_DATA &0xFFF0) |(c);
          LCD_EN = 1;
          __delay_us(230); // delai de 230 us
          LCD_EN = 0;
          __delay_ms(1);
     	}
    
    void lcd_send(char RegSelect, char c){   // RS=1 Pour une donnée
    
          LCD_RS = RegSelect;                // RS=0 Pour une instruction
          lcd_enable((c & 0xF0) >> 4);       //Envoie des 4 bits MSB
          lcd_enable(c & 0x0F);              //Envoie des 4 bits LSB
    	}
    
    void lcd_puts(const char *buffer)
    	{
    	while(*buffer != '\0')
            lcd_send(1,*buffer++);
     	}
    
    void lcd_init()   // Fonction initialisation LCD
    	{
    
    
    	LCD_RS = 0;  //0
    	LCD_EN = 0;  //0
    
    	lcd_enable(2);              //Envoi des DATA
            LCD_DATA = 0x38;
            lcd_send(0,0x28);
    	__delay_ms(10);
    	lcd_send(0,0x0C);
    	__delay_ms(10);
    	lcd_send(0,0x01);
    	__delay_ms(10);
    	lcd_send(0,0x02);
    	__delay_ms(10);
    }

    -----

  2. #2
    bisou10

    Re : Problème pour un envoi de caractère sur LCD + PIC 16F876A

    Il y a sur le net des 10aines de code exemple pour la gestion d'un LCD 2x16 avec un PIC. Il faut vérifier etre en 4 bits ou 8 bits, la conf des lignes (OUTPUT, TRISx) - que je ne vois pas dans ton code.

  3. #3
    Jack
    Modérateur

    Re : Problème pour un envoi de caractère sur LCD + PIC 16F876A

    Puisque certains vont passer du temps pour vous aider, vous devriez au moins prendre le temps de lire les règles participatives du forum informatique/programmation:
    http://forums.futura-sciences.com/pr...ves-forum.html
    En conséquence, je déplace en électronique



  4. #4
    invitea183d2c3

    Re : Problème pour un envoi de caractère sur LCD + PIC 16F876A

    Bonjour et merci,

    Justement je n'ai fais que de regarder des exemples de partout sur le web et j'ai galérer à faire fonctionner le LCD (Que sur une ligne). J'ai bien vérifié pour le mode 4 bits ou 8 bits. Je n'ai pas trouvé le moyen de le définir. Sinon dans mon code j'ai envoyé les 4 bits de points fort, puis les 4 bits de points faible directement avec la commande lcd_enable(); Et cela fonctionne uniquement sur une ligne. Mais pour ce qui est du caractère, j'ai aussi cherché des fonctions tel que putch(); etc. Mais impossible de le mettre en oeuvre. J'ai veillé à configurer les PORT en entrée/sorties. Le Port B est en sortie, le Port C dispose d'une broche en entrée et le reste en sortie. J'ai pris le temps de les définir pourtant.

    J'ai essayé d'intégrer manuellement des fonctions tel que gotoxy(); et tout ce qui est en rapport avec le curseur et sa position sur le LCD. J'ai intégrer les fonctions dans le lcd.h pour voir comment ça se passe, j'ai aussi utiliser les sous-fonction pour y arriver (depuis des exemples du net), mais impossible d'afficher sur les deux lignes. J'aurais voudrait savoir je peux m'y prendre pour arriver à contrôler les deux lignes .. Pouvez vous m'aider ?

    Merci pour votre aide

  5. A voir en vidéo sur Futura
  6. #5
    paulfjujo

    Re : Problème pour un envoi de caractère sur LCD + PIC 16F876A

    bonjour,


    il ne faut pas initialiser le LCD à chaque instant, 1 seule fois suffit..
    essaye ceci

    Code:
    //choix de ligne
       lcd_send(0,0x80);// ligne 1
       lcd_send(0,0xC0);// ligne 2

  7. #6
    Jack
    Modérateur

    Re : Problème pour un envoi de caractère sur LCD + PIC 16F876A

    J'ai bien vérifié pour le mode 4 bits ou 8 bits. Je n'ai pas trouvé le moyen de le définir
    C'est fait ici:

    Code:
    lcd_send(0,0x28);
    Ce qui est bizarre, c'est que ça met le LCD en mode 1 seule ligne.

    Mais à ma connaissance, la fonction init ne respecte pas la séquence d'initialisation de la plupart des afficheurs que j'ai rencontrés: il fallait envoyer 0x38 3 fois.
    mais tout ça est détaillé dans la doc de l'afficheur.

    A+

  8. #7
    invitea183d2c3

    Re : Problème pour un envoi de caractère sur LCD + PIC 16F876A

    Merci pour ton aide paulfjujo, j'ai inclus ces deux lignes mais plus rien ne s'affiche .. J'ai lu que :
    - de 0x00 à 0x0F Pour la partie visible de la PREMIERE ligne (sur un 16*2)
    - de 0x40 à 0x4F Pour la partie visible de la DEUXIEME ligne

    J'ai essayé ça aussi mais sa ne fonctionne pas non plus .. J'ai initialisé qu'une fois comme tu m'a dis.

  9. #8
    invitea183d2c3

    Re : Problème pour un envoi de caractère sur LCD + PIC 16F876A

    Je comprends pas non plus Jack, et où est ce qu'il faut placer 0x38 trois fois ?

  10. #9
    Jack
    Modérateur

    Re : Problème pour un envoi de caractère sur LCD + PIC 16F876A

    C'est écrit dans la doc comme je l'ai déjà dit. En fait en mode 4 bits, seul les 4 bits de poids forts sont utiles pour l'initialisation, donc 0x38 ou 0x30 c'est pareil.
    Une fois cette valeu envoyée 3 fois, il faut envoyer 0x20 (ou 0x28) pour positionner en mode 4 bits.
    Cette séquence doit figurer dans la doc de ton afficheur (qu'on ne connait pas). A défaut, le contrôleur est la plupart du temps un HD44780 dont la doc est facile à trouver. Tout y est expliqué.

    PS j'ai raconté une bêtise dans mon post précédent, 0x28 ne sélectionne pas une seule ligne.

  11. #10
    spown

    Re : Problème pour un envoi de caractère sur LCD + PIC 16F876A

    Bonjour/bonsoir est bienvenue sur FUTURA, (2012)

    Si tu as pris le code que j'ai mis ici au poste #22 (fort probable) http://forums.futura-sciences.com/el...fsw-ftw-2.html , ca va pas fonctionner parce que je l'ai adapté pour le contrôleur NT7605 , et comme disait Jack :.. le contrôleur est la plupart du temps un HD44780 .

    Pour résoudre ton problème ( pas complexe ), il faut que tu nous donne les bonnes informations concernant ton LCD ( lien direct du datasheet ), et le bronchement entre le LCD et le pic16, IDE + compiler ?

  12. #11
    paulfjujo

    Re : Problème pour un envoi de caractère sur LCD + PIC 16F876A

    Citation Envoyé par abklhayy Voir le message
    - de 0x00 à 0x0F Pour la partie visible de la PREMIERE ligne (sur un 16*2)
    - de 0x40 à 0x4F Pour la partie visible de la DEUXIEME ligne
    Exact, sauf que, il faut rajouter D7=1 soit respectivement 0x80 et 0xC0

    Code:
    Instruction		      RS  R/W   DB7	DB6	DB5	DB4	DB3	DB2	DB1	DB0	Description	Durée (KS0070B à 270 kHz)
    set DDRAM address	  0	 0	 1	a6	a5	a4	a3	a2	a1	a0	Positionne le compteur d'adresse de la DDRAM
    à condition que ton LCD soit Compatible HD44780

    nota: il vaudrait mieux travailler en unsigned char
    pour ne pas perdre le bit D7 dans la bagarre... qui pourrait etre interpreté comme bit de signe..
    Dernière modification par paulfjujo ; 21/04/2014 à 18h49.

  13. #12
    invitea183d2c3

    Re : Problème pour un envoi de caractère sur LCD + PIC 16F876A

    Bonsoir,

    Alors Jack moi j'ai un XIAMEN Ocular, je joint la doc entière. Vu qu'il envoi correctement les data c'es déjà configuré en 4 bits .. Franchement c'est la première fosi que j'utilise un LCD je suis un peu perdu mais j'avance petit à petit ..

    C'est pas un HD44780 ..

    Spown oui j'ai copié le code avant de le modifier pour mon usage personnel, j'ai modifié presque tout dans le code . Il est branché en 4 bits (D7 à D4), sur les ports RB0 à RB4 respectivement. J'utilise MPLABX avec HI-TECC PIC 9.83 .. J'ai joint la datasheet du LCD

    Paulfjujo oui exact mais vu que c'est pas un HD44780 donc c'est peut-etre pas compatible et c'est pour cela que j'ai du mal, mais au vu des infos de la Datasheet c'est la meme chose..

    Désolé pour le retard sincèrement j'ai été très pris ces derniers jours. Merci beaucoup
    Images attachées Images attachées

  14. #13
    Jack
    Modérateur

    Re : Problème pour un envoi de caractère sur LCD + PIC 16F876A

    En effet, ce n'est pas un contrôleur HD11780.
    Par contre ta doc est un peu riquiqui. Tu ne vas pas aller loin avec çà.

    Une vraie doc:
    http://www.xmocular.com/Upload/Chara...9063720136.pdf

    La doc du contrôleur avec page 27 la séquence correcte d'initialisation (différente de celle du HD44780):
    http://www.lcd-module.de/eng/pdf/zubehoer/ks0066.pdf

  15. #14
    invitea183d2c3

    Re : Problème pour un envoi de caractère sur LCD + PIC 16F876A

    Merci et oui la doc est super petite j'ai pas beaucoup de précisions dessus, je vais analyser les documents que tu m'a envoyé.

    Le contrôleur en fait c'est le "processeur" du LCD en gros ?

  16. #15
    spown

    Re : Problème pour un envoi de caractère sur LCD + PIC 16F876A

    Oui, c'est le noyau du LCD qui permets de faire bouger/effacer/modifier et afficher les caractères.

Discussions similaires

  1. Configuration registre pour utiliser TMR0 pour PIC 16F876A
    Par inviteba457a30 dans le forum Électronique
    Réponses: 1
    Dernier message: 03/04/2012, 15h49
  2. Chronograme Envoi caractère LCD 4 bits
    Par inviteb61e4847 dans le forum Électronique
    Réponses: 7
    Dernier message: 24/02/2011, 09h41
  3. problème CAN pic 16F876A
    Par invitecd1c8761 dans le forum Électronique
    Réponses: 2
    Dernier message: 06/04/2010, 14h17
  4. problème programmation d'un pic 16F876A
    Par invite7304b6e0 dans le forum Électronique
    Réponses: 14
    Dernier message: 29/08/2007, 16h18
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...