Bonjour à tous,
je viens faire appel à vous car j'ai quelques petits soucis:
j'utilise un pic 18f452 et je n'arrive pas à afficher un message sur mon lcd MDLS16265 (j'ai bien l'init).
j'utilise 2 ports du pic pour gérer le tout:
- DB4,DB5,DB6,DB7 sont sur le port B (je suis en mode 4bits)
- E,RS,R/W sont sur le port E
j'utilise un quartz 4MHz avec 2 condensateurs de 15pF et un condensateur d'alimentation de découplage de 100nF
pour programmer j'utilise un MPLAB IDE v8 avec un compilateur c18 que j'ai intégré à MPLAB
voici mes fichiers .C (désolé je n'ai pas réussi à les mettre en pièces jointes):
mon delay.c
/*
* Delay functions
* See delay.h for details
*
* Make sure this code is compiled with full optimization!!!
*/
#include "delay.h"
void
DelayMs(unsigned char cnt)
{
#if XTAL_FREQ <= 2MHZ
do {
DelayUs(996);
} while(--cnt);
#endif
#if XTAL_FREQ > 2MHZ
unsigned char i;
do {
i = 4;
do {
DelayUs(250);
} while(--i);
} while(--cnt);
#endif
}
mon lcd_4bits.c
#include <p18f452.h>
#include "delay.h"
#define LCD_EN PORTEbits.RE0 // lcd 'ENable'
#define LCD_RW PORTEbits.RE2 // lcd 'Read/Write'
#define LCD_RS PORTEbits.RE1 // lcd 'Register Select'
//#define FLAG_BUSY RB3 // lcd pret à recevoir des instructions?
#define LCD_STROBE LCD_EN=1;DelayUs(1);LCD_EN=0;D elayUs(1) // validation d'une commande
#define PORT_DATA PORTB
#define TRIS_DATA TRISB
#define PORTB_LCD_IN (TRISB | 0b00001111) // quartet de poids faible du port B en entrée
#define PORTB_LCD_OUT (TRISB & 0b11110000) // quartet de poids faible du port B en sortie
// ****************************** ******************************
// ***** Test le bit BF jusqu'a ce que le LCD soit prêt *****
// ****************************** ******************************
/*void test_lcd_busy(void)
{
static bit LCD_BF;
TRIS_DATA = PORTB_LCD_IN; // data en entrée
LCD_RS = 0; // selectionne registre
LCD_RW = 1; // en lecture
do
{
LCD_EN=1;
DelayUs(1);
LCD_BF=FLAG_BUSY;
LCD_EN=0;
DelayUs(1);
LCD_STROBE; // lecture deuxieme demi-octet
} while(LCD_BF); // tant que BF=1
LCD_RW=0;
TRIS_DATA=PORTB_LCD_OUT; // data en sortie
}*/
// ****************************** ******************************
// ***** Ecriture d'un octet dans le LCD en mode 4 bits *****
// ****************************** ******************************
void lcd_write(unsigned char c)
{
unsigned char d;
d= ( c >> 4) & 0x0F;
PORTB = ((PORTB & 0xF0) | d ); // on envoie le quartet fort
LCD_STROBE;
PORTB = ((PORTB & 0xF0) | (c & 0x0F )); // puis le quartet faible
LCD_STROBE;
DelayUs(50);
}
// ****************************** ******************************
// ******* Ecrit une instruction vers l'afficheur LCD *******
// ****************************** ******************************
void lcd_write_instr(unsigned char c)
{
//test_lcd_busy(); // vérif.q ue l'afficheur est prêt avant l'envoi d'une instruc.
LCD_RS = 0; // selectionne registre
lcd_write(c); // envoi de l'instruction désirée
}
// ****************************** ******************************
// ************** Ecriture d'un seul caractère **************
// ****************************** ******************************
void lcd_putch(unsigned char c)
{
// test_lcd_busy(); // vérif.q ue l'afficheur est prêt avant l'envoi d'un caractère
LCD_RS = 1;
lcd_write(c);
}
// ****************************** ******************************
// ********** Ecriture d'une chaine de caracteres ***********
// ****************************** ******************************
void lcd_puts(const rom char * s)
{
while(*s)
lcd_putch(*s++);
}
// ****************************** ******************************
// ******** Positionne le curseur ligne, position ***********
// ******** la premiere ligne est la ligne 0 ***********
// ****************************** ******************************
void lcd_goto_xy(unsigned char x,unsigned char y)
{
lcd_write_instr((0x40+(0x40*y) )+x);
}
// Efface l'ecran et curseur home
void lcd_clear(void)
{
lcd_write_instr(0x1);
DelayMs(2);
}
// ****************************** ******************************
// ******** Affichage d'un nb en décimal sur le LCD *********
// ****************************** ******************************
void lcd_affich_nomb(unsigned char nombre)
{
unsigned char affich;
affich=nombre/100;
nombre=nombre-affich*100;
affich=affich+48;
lcd_putch(affich);
affich=nombre/10;
nombre=nombre-affich*10;
affich=affich+48;
lcd_putch(affich);
affich=nombre+48;
lcd_putch(affich);
}
// ****************************** ******************************
// ******** initialise l'afficheur LCD en mode 4 bits *******
// ****************************** ******************************
void init_lcd(void)
{
TRISE=0b00000000; // portE en sortie
TRISB=0b00000000; // portB en sortie
TRIS_DATA = PORTB_LCD_OUT;
LCD_RS = 0; // registre de controle
LCD_EN = 0;
LCD_RW = 0; // écriture
DelayMs(30); // Attente power on
PORTB = ((PORTB & 0xF0) | (0b00000011));
LCD_STROBE;
DelayMs(5);
PORTB = ((PORTB & 0xF0) | (0b00000011));
LCD_STROBE;
DelayMs(2);
PORTB = ((PORTB & 0xF0) | (0b00000011));
LCD_STROBE;
DelayMs(2);
PORTB = ((PORTB & 0xF0) | (0b00000010)); // mode 4 bits
LCD_STROBE;
DelayMs(2);
lcd_write_instr(0x28); // affichage sur 2 lignes, mode 4 bits
lcd_write_instr(0x06); // décalage à droite après affichage d'un caractère
lcd_write_instr(0x0D); // pas de clignotement du curseur
lcd_write_instr(0x01); // effacement de l'afficheur
DelayMs(3);
}
//****************************** ***** fin routines LCD ****************************** *****
et mon fichier test_lcd.C
//****************************** ******************** ****************************** **************//
// Déclaration des bibliothèques utilisées //
//****************************** ******************** ****************************** **************//
#include <p18F452.h> //Déclaration du type de PIC
#include "LCD_4BIT.h" //Déclaration du la bibliothèque pour le LCD
#include "delay.h" //Déclaration du la bibliothèque pour la temporisation
//****************************** ******************** ****************************** **************//
// Programme Principale //
//****************************** ******************** ****************************** **************//
void tempo(void);
void main (void)
{
init_lcd(); // Initialisation du LCD
TRISB=0; // PortB en sortie: Afficheur lcd
TRISE=0; // PortE en sortie: Afficheur lcd
DelayMs(200); //Temporistaion
lcd_puts("abcdeghijklmnop"); //Affichage de "abcdeghijklmnop"
lcd_goto_xy(0,2); // Positionnement du curseur en 2ie ligne
lcd_puts("qrstuvwxyzABCDEF"); //Affichage de "qrstuvwxyzABCDEF"
tempo(); //Temporisation de 2s
lcd_clear(); //Effacer le LCD
while(1);
}
void tempo(void)
{
char i;
for(i=0;i<8;i++)
DelayMs(250);
}
merci par avance pour votre aide
-----