Bonjour, j'essaye de faire marcher un ecran LCD 4x20 lignes avec un PIC 18F452... Mais bien sur ca marche pas...

Je programme en C avec C18, je me suis bien renseigné sur le fonctionnement des LCD avant d'ecrire mon programme mais rien a faire j'arrive pas a le faire marcher...

Je poste alors mon code si quelqu'un peut me trouver le ou les problemes je lui dirais un grand merci !

#include "p18f452.h"
#include "delays.h"

#define LCD_D0 PORTBbits.RB0
#define LCD_D1 PORTBbits.RB1
#define LCD_D2 PORTBbits.RB2
#define LCD_D3 PORTBbits.RB3
#define LCD_D4 PORTBbits.RB4
#define LCD_D5 PORTBbits.RB5
#define LCD_D6 PORTBbits.RB6

#define LCD_D7 PORTBbits.RB7
#define LCD_BF LCD_D7
#define TRIS_LCD_BF TRISBbits.TRISB7

#define TRIS_LCD_D TRISB

#define LCD_RS PORTDbits.RD7
#define TRIS_LCD_RS TRISDbits.TRISD7

#define LCD_RW PORTDbits.RD6
#define TRIS_LCD_RW TRISDbits.TRISD6

#define LCD_E PORTDbits.RD7
#define TRIS_LCD_E TRISDbits.TRISD7


#define DELAY_MS(x) Delay10KTCYx(x); // Avec un quartz 10 MHZ et PLL activé = 10*4 Mhz
#define DELAY_US(x) Delay10TCYx(x); // 1 Cycle = 0,1 us
#define DELAY_600NS Delay1TCY();Delay1TCY();Delay1 TCY();Delay1TCY();Delay1TCY(); Delay1TCY();

#define LIGNE1 0x00
#define LIGNE2 0x40
#define LIGNE3 0x14
#define LIGNE4 0x54

#define uchar unsigned char

// Fonction pour envoyer une commande au LCD

void LCD_Write(uchar Send)
{

if (Send & 1)
LCD_D0 = 1;
else
LCD_D0 = 0;

if (Send & 2)
LCD_D1 = 1;
else
LCD_D1 = 0;

if (Send & 4)
LCD_D2 = 1;
else
LCD_D2 = 0;

if (Send & 8)
LCD_D3 = 1;
else
LCD_D3 = 0;

if (Send & 16)
LCD_D4 = 1;
else
LCD_D4 = 0;

if (Send & 32)
LCD_D5 = 1;
else
LCD_D5 = 0;

if (Send & 64)
LCD_D6 = 1;
else
LCD_D6 = 0;

if (Send & 128)
LCD_D7 = 1;
else
LCD_D7 = 0;

Delay1TCY(); //équivalent à 1 nop
LCD_E = 1; // validation avec enable
DELAY_600NS; // durée necessaire pour qu'enable soit pris en compte
LCD_E = 0;

}

void LCD_Wait(void)
{
LCD_RW = 1; // Mode Lecture
TRIS_LCD_D = 1 ; // D7-D0 en reception

Delay1TCY();

LCD_E = 1; // On valide
DELAY_600NS;
LCD_E=0;

Delay1TCY();

while (LCD_BF) {} // Tant que BF=1, on attend

TRIS_LCD_D = 0;
LCD_RW = 0;
}

// Fonction pour initialiser le LCD ( indispensable )

void LCD_Init(void)
{

uchar Send;

LCD_D7 = 0; // On met tout à 0
LCD_D6 = 0;
LCD_D5 = 0;
LCD_D4 = 0;
LCD_D3 = 0;
LCD_D2 = 0;
LCD_D1 = 0;
LCD_D0 = 0;
LCD_E = 0;
LCD_RS = 0;
LCD_RW = 0;

DELAY_MS(20); // Nécessaire au démarrage de l'écran

Send = 0x03; // Init 8 bits
LCD_Write(Send);

DELAY_MS(5); // Temps necessaire au déroulement de l'instruction

LCD_E = 1; // on valide une deuxieme fois
DELAY_600NS;
LCD_E = 0;

DELAY_US(110); // Temps necessaire au déroulement de l'instruction

LCD_E = 1; // et une troisieme fois
DELAY_600NS;
LCD_E = 0;

LCD_Wait();

Send = 0x38; // 8 bit mode ON, 2 lines, 5*8 font
LCD_Write(Send); // envoi des données


LCD_Wait();

Send = 0x08; // display OFF, cursor OFF, blink OFF,
LCD_Write(Send);


LCD_Wait();

Send = 0x01; // Clear Display
LCD_Write(Send);

LCD_Wait();

Send = 0x06; // increase cursor position, scroll display OFF
LCD_Write(Send);

LCD_Wait();

Send = 0x0E; // display ON, cursor ON, blink OFF,
LCD_Write(Send);

}


// Fonction pour afficher un caractere a l'écran
// Exemple : LCD_Char('Z');

void LCD_Char(uchar Car)
{
LCD_Wait();

LCD_RS = 1;

LCD_Write(Car);

LCD_RS = 0;


}




void main (void)
{
CloseADC(); // On desactive la conversion A/D
TRIS_LCD_D=0;
TRIS_LCD_E=0;
TRIS_LCD_RS=0;
TRIS_LCD_RW=0;
LCD_Init();

LCD_Char('E');

while(1)
{
}
}

#pragma romdata CONFIG
_CONFIG_DECL (
_CONFIG1H_DEFAULT & _OSC_HSPLL_1H,
_CONFIG2L_DEFAULT & _PWRT_ON_2L,
_CONFIG2H_DEFAULT & _WDT_OFF_2H,
_CONFIG3H_DEFAULT,
_CONFIG4L_DEFAULT & _STVR_OFF_4L & _LVP_OFF_4L
& _DEBUG_OFF_4L,
_CONFIG5L_DEFAULT & _CP0_OFF_5L & _CP1_OFF_5L
& _CP2_OFF_5L & _CP3_OFF_5L,
_CONFIG5H_DEFAULT & _CPB_OFF_5H & _CPD_OFF_5H,
_CONFIG6L_DEFAULT & _WRT0_OFF_6L & _WRT1_OFF_6L
& _WRT2_OFF_6L & _WRT3_OFF_6L,
_CONFIG6H_DEFAULT & _WPC_OFF_6H & _WPB_OFF_6H
& _WPD_OFF_6H,
_CONFIG7L_DEFAULT & _EBTR0_OFF_7L & _EBTR1_OFF_7L
& _EBTR2_OFF_7L & _EBTR3_OFF_7L,
_CONFIG7H_DEFAULT & _EBTRB_OFF_7H
);
#pragma romdata
Voila je pense que le code est assez clair, si vous n'arrivez pas a comprendre quelques chose, dites le moi je posterais de plus amples details !

Merci d'avance