Répondre à la discussion
Affichage des résultats 1 à 10 sur 10

Problème afficheur LCD



  1. #1
    sarahregina

    Exclamation Problème afficheur LCD


    ------

    Bonjour
    Je programme un 16F877 pour commander un afficheur LCD en mode 4 bits
    Toute mes routines sont bonnes et la simulation avec ISIS marche à merveille.
    Mais là je travaille sur un afficheur réel et ça ne marche pas
    j'ai vérifié la carte , l'afficheur n'est pas endommagé, le pic est bien programmé... donc je ne vois pas d'où peut venir le problème. Quelqu'un aurait-il une idée de la source d'un tel problème?
    Merci

    -----

  2. Publicité
  3. #2
    similaresol

    Re : Problème afficheur LCD

    Il existe une commande de polarisation sur le LCD. Cette commande permet de faire varier le contraste de l'affichage, à l'aide d'un potentiométre, de nul ( pas de char apparent ) à maxi ( tout les char deviennent des carrés noirs) . Ce niveau de poalrisation n'est pas pris en compte par Proteus. Proteus affiche toujours les char rçus par le LCD, même si cette pin est laissée en l'air.
    C'est peut-être là que réside le probléme.

  4. #3
    sarahregina

    Re : Problème afficheur LCD

    Pour le réglage du contraste, j'ai mis un potentiomètre, donc ça ne peut pas etre ça

  5. #4
    F1TVB

    Re : Problème afficheur LCD

    Bonjour
    Les tempo sont différentes avec ISIS et dans le fonctionnement réel.
    Mais sans le code difficile de faire un diagnostic...
    Attention au port A ou B, il sont analogiques au reset...

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

    Re : Problème afficheur LCD

    Les routines de l'affichage

    #define RS RB1
    #define E RB0
    #define LCD PORTB

    // Clear Display
    #define CLS 0x01

    // Display & Cursor Home
    #define HOME 0x02

    // EntryMode
    #define CURSOR_DEC 0x04
    #define CURSOR_INC 0x06

    #define DISP_SHIFT_ON 0x05
    #define DISP_SHIFT_OFF 0x04

    // LCD_Display
    #define DISPLAY_ON 0x0C
    #define DISPLAY_OFF 0x08

    #define CURSOR_ON 0x0A
    #define CURSOR_OFF 0x08

    #define BLINK_ON 0x09
    #define BLINK_OFF 0x08

    // LCD_FonctionSet
    #define MODE_8BIT 0x03
    #define MODE_4BIT 0x02

    #define MODE_2LINE 0x28
    #define MODE_1LINE 0x20

    #define FONT_5x7 0x20
    #define FONT_5x10 0x24

    // LCD_ModeSelection
    #define COMMAND_MODE 0
    #define DATA_MODE 1

    //============================== =============================
    void Set_Enable();
    void Lcd_SendCommand(unsigned char Command);
    void Lcd_SendData(unsigned char Data);

    //============================== =============================

    void Lcd_SendCommand(unsigned char Command)
    {
    char temp;
    RS = COMMAND_MODE ;
    temp = Command & 0xF0;
    LCD = LCD & 3;
    LCD = LCD | temp;
    Set_Enable();
    LCD = LCD&1;
    temp = (Command << 4);
    LCD = LCD | temp;
    Set_Enable();
    }
    //============================== =============================
    void Lcd_SendData(unsigned char Data)
    {
    char temp;
    RS = DATA_MODE ;
    temp = Data & 0xF0;
    LCD = LCD & 3;
    LCD = LCD | temp;
    Set_Enable();
    LCD = LCD&3;
    temp = (Data << 4);
    LCD = LCD | temp;
    Set_Enable();
    }
    //============================== =============================
    void Set_Enable()
    {
    unsigned char i;

    E = 1; for (i=0;i<200;i++);
    E = 0; for (i=0;i<200;i++);
    }
    //============================== =============================
    void Lcd_Init()
    {
    Lcd_SendCommand(CLS );
    Lcd_SendCommand(MODE_8BIT );
    Lcd_SendCommand(MODE_8BIT );
    Lcd_SendCommand(MODE_8BIT );
    Lcd_SendCommand(MODE_4BIT );
    Lcd_SendCommand(MODE_4BIT );
    Lcd_SendCommand (MODE_4BIT | MODE_2LINE | FONT_5x7);
    Lcd_SendCommand(DISPLAY_ON | CURSOR_OFF | BLINK_OFF);
    Lcd_SendCommand(CURSOR_INC | DISP_SHIFT_OFF) ;
    Lcd_SendCommand(CLS );
    }
    //============================== =============================
    void Lcd_LigneColonne(unsigned char Ligne, unsigned char Colonne)
    {
    Lcd_SendCommand(DISPLAY_ON | CURSOR_OFF | BLINK_OFF);
    if(Ligne==1) Lcd_SendCommand (0x80+Colonne);
    if(Ligne==2) Lcd_SendCommand (0xC0+Colonne);
    }
    Le programme principal
    #include<pic1687x.h>
    #include "lcd.h"

    oid Affichetest()
    {
    const unsigned char a[]="abc";


    Lcd_LigneColonne(1,0);
    Lcd_SendData(a[0]);
    Lcd_SendData(a[1] );
    Lcd_SendData(a[2]);

    void main()
    {
    int i;
    TRISB = 0x00;


    Lcd_Init();

    for(;
    {

    // temperature=readtemp();
    // initphadc();
    //x=acqph();
    //ph=calcul_abph(x);


    //AfficheHorloge();

    // aff(ph);

    Affichetest();

    }
    }
    }
    Pour le schéma (j'ai posté que l'essentiel)

    Voilà, c plus clair là
    Images attachées Images attachées  

  8. #6
    sarahregina

    Thumbs up Re : Problème afficheur LCD

    Citation Envoyé par F1TVB Voir le message
    Bonjour
    Les tempo sont différentes avec ISIS et dans le fonctionnement réel.
    Mais sans le code difficile de faire un diagnostic...
    Attention au port A ou B, il sont analogiques au reset...
    ah, pour le port B, je ne savais pas qu'il était analogique au RESET

    ça peut être ça

  9. Publicité
  10. #7
    sarahregina

    Re : Problème afficheur LCD

    Je viens de parcourir le datasheet du 16F877, et je n'ai trouvé nulle part que le portB est configuré en analogique au RESET, pouvez-vous me dire ou je peux trouver l'info dans le datasheet?
    merci

  11. #8
    similaresol

    Re : Problème afficheur LCD

    Je me demande si les instructions suivantes fonctionnent:
    LCD = LCD & 3;
    LCD = LCD | temp;

    Car dans le listing fourni, LCD a été défini comme étant le PORTB en OUT (trisb = 0 ). Lire le portB ne résulte pas forcément dans l'obtension de la données envoyée mais par le contenu du registre IN de ce port, qui est forcément vide.... me semble-t-il. Ce registre peut aussi centenir n'importe quoi...
    Par contre dans la simu de Isis, ce peut être différent.....

  12. #9
    sarahregina

    Re : Problème afficheur LCD

    ça j'y ai pas pensé, pourtant en simulation avec Mplab aussi ça marche bien. Je vois pas comment je pourrai arranger le code autrement, j'essaierai de le faire ce soir et je testerai sur le circuit demain, merci

  13. #10
    similaresol

    Smile Re : Problème afficheur LCD

    Citation Envoyé par sarahregina Voir le message
    ça j'y ai pas pensé, pourtant en simulation avec Mplab aussi ça marche bien. Je vois pas comment je pourrai arranger le code autrement, j'essaierai de le faire ce soir et je testerai sur le circuit demain, merci
    Pour modifier le code il serait envisageable d'effectuer les opérations logiques LCD = xxx et
    LCD = xx|temp
    dans un autre registre, un registre intermediaire

    w01 = xxx ;
    LCD = w01 ;
    w01 = w01 |temp ;
    LCD = temp ;

    Ceci n'est qu'une suggestion parmi d'autres possibles.

Discussions similaires

  1. Afficheur LCD
    Par amgab2003 dans le forum Électronique
    Réponses: 39
    Dernier message: 24/01/2013, 12h26
  2. afficheur LCD
    Par tchamfi dans le forum Électronique
    Réponses: 2
    Dernier message: 04/03/2010, 18h10
  3. probléme afficheur LCD
    Par souza dans le forum Électronique
    Réponses: 2
    Dernier message: 18/12/2009, 15h00
  4. Probleme afficheur lcd
    Par benjii66 dans le forum Électronique
    Réponses: 5
    Dernier message: 24/08/2008, 14h23
  5. afficheur lcd en afficheur 7 segment
    Par tictic01 dans le forum Électronique
    Réponses: 3
    Dernier message: 04/02/2008, 09h43
Découvrez nos comparatifs produits sur l'informatique et les technologies.