Explication d'un programme

Fermé
difool1705 - 4 juin 2007 à 00:02
 momok - 4 juin 2007 à 09:44
salut tout le monde je suis débutant en C, j'aimerais que quelqu'un m'aide à faire des commentaires sur mon programme car je ne comprends rien. Voici mon programme:

#include<REG51.h>
#include<stdio.h>

#define seuilB 0x70
#define seuilH 0x90

// variables LCD
unsigned char tmp,numOctet,valAff;
unsigned char bdata caract,valAna;
unsigned char Analogique;

//can control pins
sbit can_CS = P3^7;
sbit canSCLK = P3^5;
sbit canSdata = P3^6;

//lcd control pins
sbit lcd_E = P1^7;
sbit lcd_RS = P1^6;

sbit relais1 = P1^5;
sbit relais2 = P1^4;

sbit BPdroit = P3^4; //BP3
sbit BPcentre = P3^3; //BP2
sbit BPgauche = P3^2; //BP1

sbit lcd_D=P1^3;
sbit lcd_C=P1^2;
sbit lcd_B=P1^1;
sbit lcd_A=P1^0;

sbit caract_7=caract^7;
sbit caract_6=caract^6;
sbit caract_5=caract^5;
sbit caract_4=caract^4;
sbit caract_3=caract^3;
sbit caract_2=caract^2;
sbit caract_1=caract^1;
sbit caract_0=caract^0;

sbit valAna_7=valAna^7;
sbit valAna_6=valAna^6;
sbit valAna_5=valAna^5;
sbit valAna_4=valAna^4;
sbit valAna_3=valAna^3;
sbit valAna_2=valAna^2;
sbit valAna_1=valAna^1;
sbit valAna_0=valAna^0;

unsigned char code exo3[]="EX03";
unsigned char code AppuiBPdroit[]="STOP";
unsigned char code AppuiBPcentre[]="<-START STOP->";

//fonctions LCD
void afficheMessage(unsigned char code *message);
void afficheValeur(unsigned char valeur);
void afficheHexa(unsigned char valeur);
void afficheUI(unsigned int page);
void initLcd();
void effaceEcran();
void pulseE();
void t50us();
void t2ms();
void t20ms();
void cdeInit();

//Fonction CAN
unsigned char convAna();

void main()
{
TMOD = 0x01;

/*Init LCD*/
lcd_E=0;lcd_RS=1;
valAff=0;
initLcd();

/*can*/
can_CS = 1;

afficheMessage(exo3);
relais1=1; relais2=1;

do
{
if(BPdroit==0) /*appui sur BP Droit*/
{
afficheMessage(AppuiBPdroit);

}


if(BPcentre==0) /*appui sur BP Centre*/
{
afficheMessage(AppuiBPcentre);
}


if(BPgauche==0) /*appui sur BP Gauche*/
{
effaceEcran();
afficheHexa(convAna());
}
}
while(1);

}


// *******************************************
// *************FONCTION CAN *****************
// *******************************************
unsigned char convAna()
{
can_CS = 0;
canSCLK = 0;tmp++; canSCLK = 1;
canSCLK = 0;tmp++; canSCLK = 1;
canSCLK = 0;tmp++; canSCLK = 1;
canSCLK = 0;tmp++; canSCLK = 1; valAna_7=canSdata;
canSCLK = 0;tmp++; canSCLK = 1; valAna_6=canSdata;
canSCLK = 0;tmp++; canSCLK = 1; valAna_5=canSdata;
canSCLK = 0;tmp++; canSCLK = 1; valAna_4=canSdata;
canSCLK = 0;tmp++; canSCLK = 1; valAna_3=canSdata;
canSCLK = 0;tmp++; canSCLK = 1; valAna_2=canSdata;
canSCLK = 0;tmp++; canSCLK = 1; valAna_1=canSdata;
canSCLK = 0;tmp++; canSCLK = 1; valAna_0=canSdata;
canSCLK = 0;tmp++; canSCLK = 1;
canSCLK = 0;tmp++; canSCLK = 1;
canSCLK = 0;tmp++; canSCLK = 1;
canSCLK = 0;tmp++; canSCLK = 1;
can_CS = 1;
return(valAna);
}

// ***********FONCTIONS LCD******************
// *******************************************
// affichage unsigned integer en fin de ligne
void afficheUI(unsigned int page)
{
unsigned char dizMil,mil,cent,diz,unit;
//positionne DDRAM
lcd_RS = 0;caract = 0xC3;pulseE();
dizMil = page/10000;
lcd_RS = 1;caract = dizMil+0x30;pulseE();
mil = (page - dizMil*10000) / 1000;
lcd_RS = 1;caract = mil+0x30;pulseE();
cent = (page - dizMil*10000 - mil*1000) / 100;
lcd_RS = 1;caract = cent+0x30;pulseE();
diz = (page - dizMil*10000 - mil*1000 - cent*100) / 10;
lcd_RS = 1;caract = diz+0x30;pulseE();
unit = page - dizMil*10000 - mil*1000 - cent*100 - diz*10;
lcd_RS = 1;caract = unit+0x30;pulseE();
}
// affichage du message
void afficheMessage(unsigned char code *message)
{
effaceEcran();

//positionne DDRAM
lcd_RS = 0;
caract = 0x80;
pulseE();
numOctet=1;

while (*message!=0) // detection de fin de message
ascii
{
lcd_RS = 1;
caract=*message;
pulseE();
t20ms();
message=message+1;
numOctet=numOctet+1;

if (numOctet==9)
{
//positionne DDRAM
lcd_RS = 0;
caract = 0xC0;
pulseE();
}
}
}

// affichage ASCII de la valeur decimale (maximum = 99 !)
void afficheValeur(unsigned char valeur)
{
if (numOctet==9)
{
//positionne DDRAM
lcd_RS = 0;caract = 0xC0;pulseE();
}
lcd_RS = 1;caract = (valeur / 10)+0x30;pulseE();
numOctet=numOctet+1;
if (numOctet==9)
{
//positionne DDRAM
lcd_RS = 0;caract = 0xC0;pulseE();
}
lcd_RS = 1;caract = (valeur % 10)+0x30;pulseE();
numOctet=numOctet+1;
}

// affichage ASCII de la valeur HEXA
void afficheHexa(unsigned char valeur)
{
if (numOctet==9)
{
//positionne DDRAM
lcd_RS = 0;caract = 0xC0;pulseE();
}
caract = (valeur / 16);
if (caract<=9) //conversion hexa ASCII ... un peu rustique !
{
caract= caract+0x30;
}
else
{
caract= caract+0x37;
}
lcd_RS = 1;pulseE();
numOctet=numOctet+1;
if (numOctet==9)
{
//positionne DDRAM
lcd_RS = 0;caract = 0xC0;pulseE();
}
caract = (valeur % 16);
if (caract<=9)
{
caract= caract+0x30;
}
else
{
caract= caract+0x37;
}
lcd_RS = 1;pulseE();
numOctet=numOctet+1;
}

// validation ecritureLcd tmp++ tempo > 220ns
void pulseE()
{
lcd_D=caract_7;lcd_C=caract_6;lcd_B=caract_5;lcd_A=caract_4;
tmp++; lcd_E = 1 ;tmp++; lcd_E = 0;t50us();
lcd_D=caract_3;lcd_C=caract_2;lcd_B=caract_1;lcd_A=caract_0;
tmp++; lcd_E = 1 ;tmp++; lcd_E = 0;t50us();
}

// initialisation LCD
void initLcd()
{
t20ms();
//afficheur mode 4 bits, 2 lignes ... de 8 caract, 5x7 dots
lcd_RS = 0;
t20ms();
//puis mode 8 bits
caract = 0x30; cdeInit(); caract = 0x30; cdeInit(); caract = 0x30;
cdeInit();
//on force en mode 4bits
caract = 0x20; cdeInit(); caract = 0x20; cdeInit();
//puis 4 bits 2 lignes (de 8 caract)
caract = 0x80; cdeInit(); caract = 0x00; cdeInit();
caract = 0xC0; cdeInit(); caract = 0x00; cdeInit();
caract = 0x60; cdeInit();
}
//ecriture des 4 bits de MSB
void cdeInit()
{
lcd_D=caract_7;lcd_C=caract_6;lcd_B=caract_5;lcd_A=caract_4;
tmp++; lcd_E = 1 ;tmp++; lcd_E = 0;tmp++;
t50us();
}
void effaceEcran()
{
lcd_RS = 0;caract = 0x01;pulseE();t2ms(); //efface ecran
}

// ************ tempos blocantes ***************
//tempo 2ms
void t2ms()
{
TH0=-2000/256;TL0=-2000%256;TF0=0;TR0=1;
while (!TF0);
TR0=0;
}
//tempo 20ms
void t20ms()
{
TH0=-20000/256;TL0=-20000%256;TF0=0;TR0=1;
while (!TF0);
TR0=0;
}
//tempo 50us
void t50us()
{
TH0=0xFF;TL0=-50;TF0=0;TR0=1;
while (!TF0);
TR0=0;
}

2 réponses

bjr,
tout un prg à expliquer !! Oups, j'ai des migraines...
0
si je me trompe pas c de l'architecture materiel, il suffi pas d'etre fort en C ou c++ pour commenter ça.... j te conseille de te referencer a tes cours pour avoir les meilleur commentaire.

(g essayer de faire comme toi l'année derniere^^)
0