Affichage d'un message sur un écran LCD à l'aide d'une pic 18F4520
Répondre à la discussion
Affichage des résultats 1 à 11 sur 11

Affichage d'un message sur un écran LCD à l'aide d'une pic 18F4520



  1. #1
    Abdel009

    Affichage d'un message sur un écran LCD à l'aide d'une pic 18F4520


    ------

    Bonjour
    J'essaye d'écrire un programme en C pour pouvoir afficher un message sur un écran LCD
    pouvez vous vérifier si mon schéma et mon code sont bon
    à savoir : j'utilise MPLAB et CCS comme compilateur et puis PROTEUS pour la simulation

    Cordialement

    -----
    Images attachées Images attachées

  2. #2
    HAYAC

    Re : Affichage d'un message sur un écran LCD à l'aide d'une pic 18F4520

    Bonjour,

    Deux remarques :
    1° puisque tu utilise un simulateur pourquoi nous demander de vérifier ?
    2° Dans ton code tu déclare un afficheur sous 4 bits et dans ton plan tu câble 8bits !?

    Cordialement,

  3. #3
    Abdel009

    Re : Affichage d'un message sur un écran LCD à l'aide d'une pic 18F4520

    Bonjour, Merci pour votre réponse
    J'utilise un simulateur oui, mais je n'arrive pas à trouver mon/mes erreur, mon écran lcd n'affiche rien
    J'ai modifié mon schéma, j'ai câblé 4 bits, ya toujours rien qui s'affiche

    Cordialement

  4. #4
    alainav1

    Re : Affichage d'un message sur un écran LCD à l'aide d'une pic 18F4520

    Bonjour,
    j'ai cru lire (je ne sais plus ou ?) que le simulateur ne marchait pas avec 4 bits
    cordialement
    Alain
    Décider de faire, c'est bien . Décider quand, c'est mieux !

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

    Re : Affichage d'un message sur un écran LCD à l'aide d'une pic 18F4520

    Effectivement, information à vérifier,

    Avez-vous pensé a relier D0-D3 de votre afficheur à la masse ?

    N'utilisant pas PROTEUS, n'est-il pas nécessaire de schématiser le circuit d'horloge du microcontrôleur ?

    Avez-vous ajouter un oscilloscope virtuel sur vos sorties uC afin de contrôler dans un premier temps la transmission d'information ?

    Cordialement,

  7. #6
    paulfjujo

    Re : Affichage d'un message sur un écran LCD à l'aide d'une pic 18F4520

    bonjour,

    Poste aussi le code de
    LCD.C
    L'initialisation du PIC est -elle complete ?
    à verifier si il n'y a pas de conflit avec la declaration des voies analogiques ou comparateurs..
    usage de LAT au lieu de PORT avec les 18F..
    voir datasheet du PIC

  8. #7
    Abdel009

    Re : Affichage d'un message sur un écran LCD à l'aide d'une pic 18F4520

    Merci pour vos réponses
    Oui j'ai bien relié D0-D3 à la masse
    je ne pense pas que je doit schématiser l'horloge du microcontrôleur car il a déjà une horloge interne

    LCD.C

    ///////////////////////////////////////////////////////////////////////////
    //// LCDD.C ////
    //// Driver for common LCD modules ////
    //// ////
    //// lcd_init() Must be called before any other function. ////
    //// ////
    //// lcd_putc(c) Will display c on the next position of the LCD. ////
    //// The following have special meaning: ////
    //// \f Clear display ////
    //// \n Go to start of second line ////
    //// \b Move back one position ////
    //// ////
    //// lcd_gotoxy(x,y) Set write position on LCD (upper left is 1,1) ////
    //// ////
    //// lcd_getc(x,y) Returns character at position x,y on LCD ////
    //// ////
    ///////////////////////////////////////////////////////////////////////////
    //// (C) Copyright 1996,2007 Custom Computer Services ////
    //// This source code may only be used by licensed users of the CCS C ////
    //// compiler. This source code may only be distributed to other ////
    //// licensed users of the CCS C compiler. No other use, reproduction ////
    //// or distribution is permitted without written permission. ////
    //// Derivative programs created using this software in object code ////
    //// form are not restricted in any way. ////
    ///////////////////////////////////////////////////////////////////////////

    // As defined in the following structure the pin connection is as follows:
    // D0 enable
    // D1 rs
    // D2 rw
    // D4 D4
    // D5 D5
    // D6 D6
    // D7 D7
    //
    // LCD pins D0-D3 are not used and PIC D3 is not used.

    // Un-comment the following define to use port B
    // #define use_portb_lcd TRUE


    struct lcd_pin_map { // This structure is overlayed
    BOOLEAN enable; // on to an I/O port to gain
    BOOLEAN rs; // access to the LCD pins.
    BOOLEAN rw; // The bits are allocated from
    BOOLEAN unused; // low order up. ENABLE will
    int data : 4; // be pin B0.
    } lcd;


    #if defined use_portb_lcd
    //#locate lcd = getenv("sfr:PORTB") // This puts the entire structure over the port
    #ifdef __pch__
    #locate lcd = 0xf81
    #else
    #locate lcd = 6
    #endif
    #define set_tris_lcd(x) set_tris_b(x)
    #else
    //#locate lcd = getenv("sfr:PORTD") // This puts the entire structure over the port
    #ifdef __pch__
    #locate lcd = 0xf83
    #else
    #locate lcd = 8
    #endif
    #define set_tris_lcd(x) set_tris_d(x)
    #endif

    #ifndef lcd_type
    #define lcd_type 2 // 0=5x7, 1=5x10, 2=2 lines
    #endif

    #define lcd_line_two 0x40 // LCD RAM address for the second line


    BYTE const LCD_INIT_STRING[4] = {0x20 | (lcd_type << 2), 0xc, 1, 6};
    // These bytes need to be sent to the LCD
    // to start it up.


    // The following are used for setting
    // the I/O port direction register.

    struct lcd_pin_map const LCD_WRITE = {0,0,0,0,0}; // For write mode all pins are out
    struct lcd_pin_map const LCD_READ = {0,0,0,0,15}; // For read mode data pins are in



    BYTE lcd_read_byte() {
    BYTE low,high;
    set_tris_lcd(LCD_READ);
    lcd.rw = 1;
    delay_cycles(1);
    lcd.enable = 1;
    delay_cycles(1);
    high = lcd.data;
    lcd.enable = 0;
    delay_cycles(1);
    lcd.enable = 1;
    delay_us(1);
    low = lcd.data;
    lcd.enable = 0;
    set_tris_lcd(LCD_WRITE);
    return( (high<<4) | low);
    }


    void lcd_send_nibble( BYTE n ) {
    lcd.data = n;
    delay_cycles(1);
    lcd.enable = 1;
    delay_us(2);
    lcd.enable = 0;
    }


    void lcd_send_byte( BYTE address, BYTE n ) {

    lcd.rs = 0;
    while ( bit_test(lcd_read_byte(),7) ) ;
    lcd.rs = address;
    delay_cycles(1);
    lcd.rw = 0;
    delay_cycles(1);
    lcd.enable = 0;
    lcd_send_nibble(n >> 4);
    lcd_send_nibble(n & 0xf);
    }


    void lcd_init() {
    BYTE i;
    set_tris_lcd(LCD_WRITE);
    lcd.rs = 0;
    lcd.rw = 0;
    lcd.enable = 0;
    delay_ms(15);
    for(i=1;i<=3;++i) {
    lcd_send_nibble(3);
    delay_ms(5);
    }
    lcd_send_nibble(2);
    for(i=0;i<=3;++i)
    lcd_send_byte(0,LCD_INIT_STRIN G[i]);
    }


    void lcd_gotoxy( BYTE x, BYTE y) {
    BYTE address;

    if(y!=1)
    address=lcd_line_two;
    else
    address=0;
    address+=x-1;
    lcd_send_byte(0,0x80|address);
    }

    void lcd_putc( char c) {
    switch (c) {
    case '\f' : lcd_send_byte(0,1);
    delay_ms(2);
    break;
    case '\n' : lcd_gotoxy(1,2); break;
    case '\b' : lcd_send_byte(0,0x10); break;
    default : lcd_send_byte(1,c); break;
    }
    }

    char lcd_getc( BYTE x, BYTE y) {
    char value;

    lcd_gotoxy(x,y);
    while ( bit_test(lcd_read_byte(),7) ); // wait until busy flag is low
    lcd.rs=1;
    value = lcd_read_byte();
    lcd.rs=0;
    return(value);
    }

  9. #8
    paulfjujo

    Re : Affichage d'un message sur un écran LCD à l'aide d'une pic 18F4520

    bonsoir,

    je ne connais pas CCS, mais je trouve
    un peu fouillis ce code lcd.c..
    pas évident de savoir si les commandes sont bien sur le port C.
    Quelque fois il vaut mieux partir de scratch (zero) pluto que d'utiliser une bibliotheque calfa toute.

    tester déja individuellement les commandes du LCD , en rajoutant des leds
    ou en mode debug
    L'avantage de tester dans le monde reel ,c'est que des que ça coince ..on les mets les leds !


    Code:
    lcd.rw = 0;
    lcd.enable = 0;
    lcd.rs = 0;
    
    while(1)
    {
    delay_ms(1000);
    lcd.rs = 1;
    delay_ms(1000);
    lcd.rs = 0;
    lcd.rw = 1;
    delay_ms(1000);
    lcd.rw = 0;
    lcd.enable = 1;
    delay_ms(1000);
    lcd.enable = 0;
    }
    Dernière modification par paulfjujo ; 28/01/2015 à 18h50.

  10. #9
    Abdel009

    Re : Affichage d'un message sur un écran LCD à l'aide d'une pic 18F4520

    J'ai rajouté des LEDs et j'ai essayé votre code .. ça marche pas, les LEDs ne s'allume pas

  11. #10
    Abdel009

    Re : Affichage d'un message sur un écran LCD à l'aide d'une pic 18F4520

    C'est bon ça marche, mon message s'affiche bien sur l'ecran lcd
    en fait, mon erreur était d'utiliser le port C pour E, RS et R/W .. il fallait utiliser le port D, c'est bien mentionné dans le code lcd.c

    E --> D0
    RS --> D1
    RW --> D2

    Maintenant, ce code marche pour une pic 18f4550 .. est ce qu'il marchera aussi pour une pic 18f4520 ? ou je dois le modifier ?

  12. #11
    invite03481543

    Re : Affichage d'un message sur un écran LCD à l'aide d'une pic 18F4520

    Bonjour,

    CCS+Protéus vous voilà bien parti...

    Oui évidemment qu'il faut au moins modifier le include et probablement lire la doc du PIC pour savoir si ce sont les mêmes registres, même affectations de PORT, bits de config, etc...

Discussions similaires

  1. Ecran TV à la place d'un ecran PC: Risques et qualité d'affichage
    Par Saikou dans le forum Matériel - Hardware
    Réponses: 4
    Dernier message: 27/08/2013, 09h09
  2. Réponses: 29
    Dernier message: 12/06/2013, 20h29
  3. Affichage d'un message sur Ecran LCD
    Par inviteed7d9d0e dans le forum Électronique
    Réponses: 7
    Dernier message: 03/04/2012, 00h34
  4. Aide language C du pic 18F4520
    Par invite41ed1682 dans le forum Électronique
    Réponses: 3
    Dernier message: 10/02/2012, 23h44
  5. affichage du message F8
    Par invite93116ce3 dans le forum Dépannage
    Réponses: 2
    Dernier message: 10/10/2008, 07h34
Découvrez nos comparatifs produits sur l'informatique et les technologies.