Bonjour,
j'ai copié un programme que j'ai trouvé sur internet qui correspond a une partie du programme que je dois faire gérer un afficheur LCD mode 4 bits en I2C.
J'ai adapté le programme qui était fait pour un 16F et qui se compile bien sur un compilateur du type PIC C compiler et je l'ai adapté pour mplab mcc18 si quequ'un peut me corriger ou me dire si mon programme semble correcte ou pas.
Y a pas d'erreur a la compilation mais j'ai voulu le testé sur ISIS et sa plante l'erreur doit venir du programme mais je sais pas ou.
Je le test sur ISIS parce que ma carte est pas gravé donc faut bien s'occupé et avancé.
(je pense que le programme est lisible en tout cas y a des fonctions)
Merci
------------------------------------------------------------------------
//ce programme est modifié a partir d'un que j'ai trouvé donc si des truc sont pas clair
//je pourrais pas forcément vous dire pourquoi y a ça moi même j'ai pas tout compris
//d'ou votre aide me sera utile a savoir si y a des trucs valable la dedans
#include <p18f4550.h>// sa c'est de moi je pense que c'est bon
#include <stdlib.h>
#include <i2c.h>
void init();
void init_lcd();
void tempo(void);
void tempo2(unsigned int);
void I2c(unsigned char);
void lcd_putc(char);
void clear_lcd();
void ligne_up();
//#define MASTER 8 //c'était dans le code orignal mais sa veux pas a la compilation pas compatible pour un pic 18f
//#use I2C(master, sda=PIN_C4, scl=PIN_C3)b //pareil valable pour les 16f en pic compiler
#define addresse_LCD 0b01000000 //je sais pas a quoi correspond ce code
//-----declaration des variable globale--------------------------------------
//----------------Fonction Global------------------------------------------
void envoi(unsigned char data)
{ data=data|0b00000001;//E est a 1 //dans le code original y a écrit sa
I2c(data);
tempo();
data=data-1;//E=0
I2c(data);
tempo();}
void I2c(unsigned char data)//cette fonction est valable je pense
{StartI2C();
WriteI2C(addresse_LCD);//addresse du composant
WriteI2C(data);
StopI2C();}
void affich(char mess)
{//Le message passe lettre par lettre , donc set fonction , passe en boucle
char data;
data=mess&0xF0;//je ne sais pas qu'est ce code
data=data+4; //RS a 1
envoi(data);
data=mess&0x0F;
data=data<<4;
data=data+4;//RS a 1
envoi(data);}
void lcd_putc(char c)
{
switch(c)
{
case'\f':
clear_lcd();
break;
case'\n':
ligne_up();
break;
default:
affich(c);
break;
}
}
void clear_lcd()
{
envoi(0x00);
envoi(0x10);
}
void ligne_up()
{
//40h
envoi(0xC0);
envoi(0x00);
tempo();
}
void init() //je veux allumé mes leds a l'initialisation pour vérifier j'ai bien configurer mes ports C et D
{
TRISC = 1; //portc en entree
TRISD = 1; //portd en entree
TRISD= 0xEF;//portd4 entrée
TRISD= 0xDF;//portd5 entrée
TRISD= 0x7F;//portd7 entrée
LATDbits.LATD4 = 1; //led2 allumé
LATDbits.LATD5 = 1; //led3 allumé
LATDbits.LATD7 = 1; //led4 allumé
}
//------------------Fonction Principal----------------------------------
void main ()
{
init();
OpenI2C(MASTER, SLEW_OFF);//surement que c'est ça sa me dit pas d'erreur
init_lcd();//fonction qui marche
while(1)
{
lcd_putc("\fFonctionne");
tempo2(7);
lcd_putc("\f");
lcd_putc("Mon LCD\nI2C");
tempo2(7); //20000 3s -2000 370ms- 130 20ms 65 11ms 6=1ms4 4=1ms de boucle
}
}
void init_lcd() //fonction qui marche
{
tempo2(1);
//On travaille sur la commande donc RS=0 R/W=0 écriture
envoi(0x00);
envoi(0x10);
envoi(0x00);
envoi(0x00);
envoi(0x10);
//mode 8 bits
envoi(0x30);
envoi(0x30);
envoi(0x30);
//mode 4 bits
envoi(0x20);
//mode 4 bits, 2 lignes, caractères 5x7 (28h)
envoi(0x20);
envoi(0x80);
//affichage en fonction, pas de curseur (0Ch)
envoi(0x00);
envoi(0xc0);
//le curseur se déplace vers la gauche (06h)
envoi(0x00);
envoi(0x60);
//on efface l'afficheur
envoi(0x00);
envoi(0x10);
}
void tempo()//fonction qui marche
{
unsigned int j;
for(j=0; j<2000; j++);
}
void tempo2(unsigned int t)//fonction qui marche
{
unsigned int j;
for(j=0; j<t; j++);
}
------------
Si vous avez compris quelque chose et avez vu une erreur merci de me tenir au courant
Merci
-----