PIC 18F – Exemple pour afficher sur LCD avec plib/xlcd.h

Sample code that displays on a LCD using the xlcd XC8 library

Note: The internal clock is used with the default clock rate of 1 MHz.

———————————————————————————————–

Voici un exemple de code qui permet d’afficher sur un LCD en utilisant la librairie xlcd sous xc8

Note: L’horloge interne est utilisée avec la cadence par défaut (1 Mhz).

Directives de connexions

LCD PIN PIC PIN
RW 5 RB6 39
RS 4 RB5 38
E 6 RB4 37
D4 11 RB0 33
D5 12 RB1 34
D6 13 RB2 35
D7 14 RB3 36

montage Référence LCD

/*
* Info sur le LCD: http://www.studentcompanion.co.za/post/2013/05/21/Interfacing-LCD-Display-With-PIC-Microcontroller-XC8
* -----------------------------------------------------------------------------
* Description: Afficher sur le LCD en utilisant plib/xlcd.h
* -----------------------------------------------------------------------------
* Directives de connexions du PIC avec le LCD:
*
* Ce projet utilise les valeurs par défaut de plib/xlcd.h sur BUS 4 bits
*
* LCD PIN PIC PIN
* RW  5   RB6 39
* RS  4   RB5 38
* E   6   RB4 37
*
* DATA sur 4 bits
* LCD PIN PIC PIN
* D4  11  RB0 33
* D5  12  RB1 34
* D6  13  RB2 35
* D7  14  RB3 36
*/

#include <xc.h>
#include <plib/xlcd.h>

#pragma config FOSC = INTOSC_EC  // Utilisation de l'OSC interne avec vitesse par defaut (1Mhz)
#pragma config LVP = 0;          // LCD ne fonctionne pas avec ce bit à ON! Quelqu'un peut expliquer pourquoi?
#define _XTAL_FREQ 1000000       // Constante requise pour __delay_ms()
#define END_OF_TIME 1
#define LINE_2 0x40

// ***************************************************
// Prototypes des fonctions locales au projet
// ***************************************************
void init_XLCD(void);
void cls(void);
void DelayFor18TCY(void);
void DelayPORXLCD(void);
void DelayXLCD(void);
void uneDemieSeconde(void);
void afficherMsgAvecDelai(char * msg[], int sec, int position);

// ***************************************************
void main(void) {
// ***************************************************
 TRISD = 0;

 init_XLCD();

 afficherMsgAvecDelai("Attention le", 1, 0);
 afficherMsgAvecDelai("spectacle ", 1, LINE_2);
 afficherMsgAvecDelai("debute NOW! ", 3, 0);
 cls();

 while (END_OF_TIME) {
   PORTD = 0xFF;
   afficherMsgAvecDelai("Je suis le ", 1, 0);
   afficherMsgAvecDelai("message du jour", 1, 0);
   afficherMsgAvecDelai("** Be happy! **", 2, LINE_2);
   PORTD = 0x00;
   uneDemieSeconde(); //delay();
   cls();
 } // while END_OF_TIME
} // main()

// ***************************************************
// Fonctions locales au projet

// ***************************************************
void init_XLCD(void)
// ***************************************************
{
 OpenXLCD(FOUR_BIT&LINES_5X7); // configure LCD: 4-bit, 5x7char, multi-lines
 while(BusyXLCD());            // Wait until LCD !busy
 WriteCmdXLCD(0x06);           // cursor right, don't shift display
 WriteCmdXLCD(0x0C);           // display on without cursor
 } // init_XLCD

// ***************************************************
void cls(void){
// ***************************************************
 while(BusyXLCD());  //Check if the LCD controller is not busy
 WriteCmdXLCD(0x01); // Clear LCD
} // cls

// ***************************************************
void uneDemieSeconde(void){
// ***************************************************
 for (int i=0;i<10;i++)
   __delay_ms(50);
} // uneDemieSeconde

// ***************************************************
void afficherMsgAvecDelai(char * msg[], int sec, int position) {
// ***************************************************
 while(BusyXLCD());
 SetDDRamAddr(position);
 while(BusyXLCD());
 putrsXLCD( msg );
 while(BusyXLCD());
 for (int i = 0 ; i<sec; i++) {
   uneDemieSeconde();
 }
} // afficherMsgAvecDelai

// ***************************************************
// Implémentation des routines de délais pour plib/xlcd.h
// Note: Il faut définir la constante suivante:
// #define _XTAL_FREQ 8000000 // Note: 8mg est un exemple

// ***************************************************
void DelayFor18TCY(void)
{ __delay_us(36); // Value of '18' did not work for me!
}

// ***************************************************
void DelayPORXLCD(void)
{ __delay_ms(15); }

// ***************************************************
void DelayXLCD(void)
{ __delay_ms(5); }

Advertisements

2 Responses to PIC 18F – Exemple pour afficher sur LCD avec plib/xlcd.h

  1. Shadi says:

    Merci pour avoir participé le code!
    je l’ai essayé mais le LCD m’a rien afficher, quelqu’un pourrais me dire le problem SVP.

    #include
    #include
    #include
    #include
    #include
    #include

    //LCD Control pins
    #define RS LATDbits.LATD4
    #define RW LATDbits.LATD5
    #define EN LATDbits.LATD6
    #define LCD_D4 RD0
    #define LCD_D5 RD1
    #define LCD_D6 RD2
    #define LCD_D7 RD3
    #define LCD_RS_Direction TRISD4
    #define LCD_EN_Direction TRISD5
    #define LCD_D4_Direction TRISD0
    #define LCD_D5_Direction TRISD1
    #define LCD_D6_Direction TRISD2
    #define LCD_D7_Direction TRISD3

    //LCD Data pins
    #define lcdport LATD

    #pragma config PLLDIV = 5
    #pragma config CPUDIV = OSC1_PLL2
    #pragma config USBDIV = 2

    #pragma config FCMEN = OFF
    #pragma config IESO = OFF

    #pragma config PWRT = OFF
    #pragma config BOR = OFF
    #pragma config BORV = 3
    #pragma config VREGEN = OFF

    #pragma config WDT = OFF
    #pragma config WDTPS = 32768

    #pragma config CCP2MX = ON
    #pragma config LPT1OSC = OFF

    #pragma config FOSC = INTOSC_EC // Utilisation de l’OSC interne avec vitesse par defaut (1Mhz)
    #pragma config STVREN = ON
    /#pragma config LVP = OFF // LCD ne fonctionne pas avec ce bit à ON! Quelqu’un peut expliquer pourquoi?
    #define _XTAL_FREQ 1000000 // Constante requise pour __delay_ms()
    #define END_OF_TIME 1
    #define LINE_2 0x40

    // ***************************************************
    // Prototypes des fonctions locales au projet
    // ***************************************************
    void init_XLCD(void);
    void cls(void);
    void DelayFor18TCY(void);
    void DelayPORXLCD(void);
    void DelayXLCD(void);
    void uneDemieSeconde(void);
    void afficherMsgAvecDelai(char * msg[], int sec, int position);

    // ***************************************************
    void main(void) {
    // ***************************************************
    TRISD = 0;

    init_XLCD();

    afficherMsgAvecDelai(“Attention le”, 1, 0);
    afficherMsgAvecDelai(“spectacle “, 1, LINE_2);
    afficherMsgAvecDelai(“debute NOW! “, 3, 0);
    cls();

    while (END_OF_TIME) {
    PORTD = 0xF0;
    afficherMsgAvecDelai(“Je suis le “, 1, 0);
    afficherMsgAvecDelai(“message du jour”, 1, 0);
    afficherMsgAvecDelai(“** Be happy! **”, 2, LINE_2);
    PORTD = 0x00;
    uneDemieSeconde(); //delay();
    cls();
    } // while END_OF_TIME
    } // main()

    // ***************************************************
    // Fonctions locales au projet

    // ***************************************************
    void init_XLCD(void)
    // ***************************************************
    {
    OpenXLCD(FOUR_BIT&LINES_5X7); // configure LCD: 4-bit, 5x7char, multi-lines
    while(BusyXLCD()); // Wait until LCD !busy
    WriteCmdXLCD(0x06); // cursor right, don’t shift display
    WriteCmdXLCD(0x0C); // display on without cursor
    } // init_XLCD

    // ***************************************************
    void cls(void){
    // ***************************************************
    while(BusyXLCD()); //Check if the LCD controller is not busy
    WriteCmdXLCD(0x01); // Clear LCD
    } // cls

    // ***************************************************
    void uneDemieSeconde(void){
    // ***************************************************
    for (int i=0;i<10;i++)
    __delay_ms(50);
    } // uneDemieSeconde

    // ***************************************************
    void afficherMsgAvecDelai(char * msg[], int sec, int position) {
    // ***************************************************
    while(BusyXLCD());
    SetDDRamAddr(position);
    while(BusyXLCD());
    putrsXLCD( msg );
    while(BusyXLCD());
    for (int i = 0 ; i<sec; i++) {
    uneDemieSeconde();
    }
    } // afficherMsgAvecDelai

    // ***************************************************
    void DelayFor18TCY(void)
    { __delay_us(36);
    }

    // ***************************************************
    void DelayPORXLCD(void)
    { __delay_ms(15); }

    // ***************************************************
    void DelayXLCD(void)
    { __delay_ms(5); }

    • ve2cuy says:

      Bonjour Shadi,

      Votre projet compile sans erreur?

      J’ai refait un test sous MPLAB X IDE v2.20 et les messages apparaissent sur le LCD.

      Vous avez vérifié le cablage entre le 18LF4553 et le LCD?

      Et la résistance de contraste entre VEE et GND?

      Alain

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: