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 !
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 !#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
Merci d'avance
-----