MICROCONTROLEUR PIC 16F877A

Fermé
asamaaa Messages postés 2 Date d'inscription dimanche 1 mai 2011 Statut Membre Dernière intervention 18 mai 2011 - 1 mai 2011 à 17:20
asamaaa Messages postés 2 Date d'inscription dimanche 1 mai 2011 Statut Membre Dernière intervention 18 mai 2011 - 18 mai 2011 à 22:35
Bonjour,



s'ils vous plait qui peux m'aider pour comprendre ce programme merci d'avance :)petite remarque j'ai pas étudié sur le microcontroleur et mon projet fin d'étude est basé sur le pic 16F877A


#include "16f877A.h"
#include <lcd.c>
#include <stdlib.h>
#use i2c (scl=PIN_C3, sda=PIN_C4)
#use rs232(baud=9600,xmit=PIN_C6,rcv=PIN_C7)
#use delay(clock=20M)
#byte PORTA=0x05
#byte TRISA=0x85
#byte PORTB=0x06
#byte TRISB=0x86
#byte PORTC=0x07
#byte TRISC=0x87
#byte PORTD=0x08
#byte TRISD=0x88
#bit RB0=PORTB.0
#bit RB1=PORTB.1
#bit RB2=PORTB.2
#bit RA0=PORTA.0
#bit RA1=PORTA.1
#bit RA2=PORTA.2
#bit RA3=PORTA.3
#bit RC0=PORTC.0
#bit RC1=PORTC.1
#bit RC2=PORTC.2
#bit RC5=PORTC.5
#bit scl=PORTC.3
#bit sda=PORTC.4
char touche=' ';
int nbc=0;
int tabclt[5]="1925";
int tabadm[5]="1425";
char tab='*';
int tabsaisie[4];
int tabsaisie1[4];
char tentative_restante='2';
int k=0,i=0,compteur=0;
int j=0,var;
int address;
int pos;
byte x0,min,jour,annee,x7,x9,heure,mois,x6,x8;
char y0,y1,y2,y3,y4;
byte date[7];
char modif_date[10];
int sec=0;

void clavier()
{
touche=' ';
PORTB=0x10;
if(RB0==1) {touche='1'; while(RB0==1);}
if(RB1==1) {touche='2'; while(RB1==1);}
if(RB2==1) {touche='3'; while(RB2==1);}
PORTB=0x20;
if(RB0==1) {touche='4'; while(RB0==1);}
if(RB1==1) {touche='5'; while(RB1==1);}
if(RB2==1) {touche='6'; while(RB2==1);}
PORTB=0x40;
if(RB0==1) {touche='7'; while(RB0==1);}
if(RB1==1) {touche='8'; while(RB1==1);}
if(RB2==1) {touche='9'; while(RB2==1);}
PORTB=0x80;
if(RB0==1) {touche='*'; while(RB0==1);}
if(RB1==1) {touche='0'; while(RB1==1);}
if(RB2==1) {touche='#'; while(RB2==1);}
}

void modification_date(byte min,byte heure,byte jour,byte mois,byte annee)
{
i2c_start();
i2c_write(0xD0);
i2c_write(0x00);
i2c_write(0x00);
i2c_write(min);
i2c_write(heure);
i2c_write(0x01);
i2c_write(jour);
i2c_write(mois);
i2c_write(annee);
i2c_write(0x80);
i2c_stop();
}
void lecture_date()
{

i2c_start();
i2c_write(0xD0);
i2c_write(0x00);
i2c_start();
i2c_write(0xD1);
for(i=0;i<7;i++)
{
date[i]=i2c_read();

}
i2c_write(0x80);
i2c_stop();


}
void main(void)
{
PORTA=0;
PORTD=0;
PORTC=0;
TRISA=0;
TRISB=0x0F;
TRISC=0x97;
TRISD=0;
debut:
sec=0;
tentative_restante='2';
PORTA=0;
pos=0;
j=0;
RC0=0;
k=0;
compteur=0;
lecture_date();
lcd_init();
lcd_putc("TAPEZ '#'ou'*'");
lcd_putc("\n");

printf(LCD_PUTC,"%x",date[2]);
lcd_putc(":");
printf(LCD_PUTC, "%x",date[1]);
lcd_putc(" ");
printf(LCD_PUTC, "%x",date[4]);
lcd_putc("/");
printf(LCD_PUTC, "%x",date[5]);
lcd_putc("/");
printf(LCD_PUTC, "%x",date[6]);


if(read_eeprom(0)==0xff)
{
for(i=0;i<4;i++) write_eeprom(i,tabclt[i]);
}


while(true)
{

PORTC=0;
delay_ms(100);
clavier();

if(touche=='*')
{
lcd_init();
lcd_putc("CHANGEMENT MP:1\n");
lcd_putc("REGLAGE DATE:2\n");

do
{
clavier();

if((touche=='1')&(touche!=' ')&(touche!='*')&(touche!='#'))
{
lcd_init();
lcd_putc("CHANGEMENT MP:\n");
delay_ms(1000);
change_rmp: lcd_init();
lcd_putc("SVP ANCIEN MP:\n");

do
{
clavier();

if((touche!='#')&(touche!=' ')&(touche!='*'))
{
tabsaisie[k]=touche;
lcd_putc(tab);
k++;
}



}
while(k<4);

k=0;
for(i=0;i<4;i++)
{ var = read_EEPROM (i);
if(tabsaisie[i]!=var)
{
compteur++;
if(compteur==3)
{
goto blo;
}
else
{

lcd_init();
lcd_putc("MP INCORRECT");
delay_ms(1000);
lcd_init();
lcd_putc("RESTE: ");
lcd_putc(tentative_restante);
tentative_restante--;
delay_ms(1000);
goto change_rmp;
}
}

}
compteur=0;
if(i==4)
{
nouveau: lcd_init();
lcd_putc("NOUVEAU MP\n");
do
{
clavier();
if((touche!='#')&(touche!=' ')&(touche!='*'))
{
tabsaisie[k]=touche;
lcd_putc(tab);
k++;
}


}
while(k<4);
k=0;
lcd_init();
lcd_putc("SVP REPETER\n");
do
{
clavier();
if((touche!='#')&(touche!=' ')&(touche!='*'))
{
tabsaisie1[k]=touche;
lcd_putc(tab);
k++;
}


}
while(k<4);
k=0;
for(i=0;i<4;i++)
{ // tester nouveau de passe
if(tabsaisie[i]!=tabsaisie1[i])
{
lcd_init();
lcd_putc("REESSAYER");
delay_ms(1000);
goto nouveau;
}
}
if(i==4)
{
for(i=0;i<4;i++)
{
write_eeprom(i,tabsaisie[i]);

}
address=0;
lcd_init();
lcd_putc("MP MODIFIE");
delay_ms(2000);
goto debut;
}
}
}


if((touche=='2')&(touche!=' ')&(touche!='*')&(touche!='#'))
{

lcd_init();
lcd_putc("SET HEURE:xx:xx\n");
lcd_putc("SET DATE:xx/xx/xx");

j=11;
i=0;
k=0;
do
{

clavier();
if((touche!=' ')&(touche!='*')&(touche!='#'))
{

if(j==13) j=14;

lcd_gotoxy(j,1);
lcd_putc(touche);
modif_date[pos]=touche;
j++;
pos++;
k++;
}

}
while(k<4);
k=0;
j=10;
do
{

clavier();
if((touche!=' ')&(touche!='*')&(touche!='#'))
{

if(j==12) j=13;
if(j==15) j=16;

lcd_gotoxy(j,0);
lcd_putc(touche);
modif_date[pos]=touche;
pos++;
j++;
k++;
}
}
while(k<6);
x0=(toupper(modif_date[0]));
min=(toupper(modif_date[1]));
heure=(toupper(modif_date[2]));
jour=(toupper(modif_date[3]));
mois=(toupper(modif_date[4]));
annee=(toupper(modif_date[5]));
x6=(toupper(modif_date[6]));
x7=(toupper(modif_date[7]));
x8=(toupper(modif_date[8]));
x9=(toupper(modif_date[9]));
x0=x0-'0';
min=min-'0';
heure=heure-'0';
jour=jour-'0';
mois=mois-'0';
annee=annee-'0';
x6=x6-'0';
x7=x7-'0';
x8=x8-'0';
x9=x9-'0';
y0=x0*16+min;

y1=heure*16+jour;
y2=mois*16+annee;
y3=x6*16+x7;
y4=x8*16+x9;
modification_date(y1,y0,y2,y3,y4);// modification date
i=0;
j=13;
goto debut;
}

}
while(true);


}
if(touche=='#')
{
i=0;compteur=0;
saisie: sec=0;
lcd_init();
lcd_putc("ENTRER MP:\n");

do
{
clavier();

if((touche!=' ')&(touche!='#')&(touche!='*'))
{
tabsaisie[k]=touche;

lcd_putc(tab);
k++;

}
if (sec==5000){goto debut;}
sec++;
delay_ms(50);
}
while(k<4);

k=0;

for(i=0;i<4;i++)
{
var = read_EEPROM (i);

if(tabsaisie[i]!=var)
{ compteur++;
goto ttabadm;

}
}
ttabadm: for(j=0;j<4;j++)
{
if(tabsaisie[j]!=tabadm[j])
{
goto LED;
}
}
LED:
if((i==4))
{

lcd_init();
lcd_putc("ACCES AUTORISE");
delay_ms(200);

lecture_date();
printf("client %d Acces a: ",nbc);
nbc++;
printf("%x:%x ",date[2],date[1]);
printf("%x/%x/%x\n\r",date[4],date[5],date[6]);
RA0=1;
RA1=1;
delay_ms(2000);
goto debut;
}
if((j==4))
{

lcd_init();
lcd_putc("ACCES AUTORISE");
delay_ms(200);
lecture_date();
printf("adminitrateur a: ");
printf("%x:%x ",date[2],date[1]);
printf("%x/%x/%x\n\r",date[4],date[5],date[6]);
PORTC=0;
RA0=1;
RA1=1;
RA0=1;
RA1=1;

delay_ms(2000);
goto debut;
}
else if(compteur==3)
{


blo: lcd_init();
lcd_putc("DSL BLOQUAGE");
RA2=1;
RA3=1;
delay_ms(5000);
goto debut;
}
else
{
RC0=0;

lcd_init();
lcd_putc("MP INCORRECT");
delay_ms(2000);
lcd_init();
lcd_putc("RESTE: ");
lcd_putc(tentative_restante);
tentative_restante--;
RA2=1;
delay_ms(2000);
sec=0;
goto saisie;

}
}

}
}
A voir également:

1 réponse

emit-fr Messages postés 19 Date d'inscription vendredi 29 mai 2009 Statut Membre Dernière intervention 8 décembre 2021 8
18 mai 2011 à 13:45
Bonjour,

Vite fait, je dirais que le programme gère une horloge temps réelle I2C, des boutons, 1 LCD.

Le principe semble être un contrôle d'accès...

https://www.emit-fr.com/
0
asamaaa Messages postés 2 Date d'inscription dimanche 1 mai 2011 Statut Membre Dernière intervention 18 mai 2011
18 mai 2011 à 22:35
oui c ca bonne réponse en tt cas j'ai changé un peu le programme alors j'ai enlevé le ds1307 pour date et heure j'ai ajouté le 7 segment et aussi il faut bien comprendre la liaison rs232 et db9 ...bref mon projet Kit microcontroleur 16f877a
0