You are on page 1of 6

#define F_CPU 1000000UL

#include<avr/io.h>
#include<util/delay.h>
#define USART_BAUDRATE 9600
#define BAUD_PRESCALE (((F_CPU / (USART_BAUDRATE * 16UL))) - 1)
int i;
unsigned char card[12];
int tags[10][3]={{2,3,1},
{2,2,1},
{3,3,0},
{6,2,1},
{1,7,6},
{4,5,4},
{9,6,0},
{5,2,0},
{8,4,8},
{2,4,3}};
unsigned int usart_getch()
{
while ((UCSRA & (1 << RXC)) == 0);
return(UDR);
}
void getcard_id(void)
{
for(i=0;i<12;i++)
{
card[i]= usart_getch();
card[i]=card[i] & 15;
}
return;
}
void usart_init()
{
UCSRB |= (1 << RXEN) | (1 << TXEN);
UCSRC |= (1 << URSEL) | (1<<USBS) | (1 << UCSZ0) | (1 << UCSZ1);
UBRRL = BAUD_PRESCALE;
UBRRH =0;
}
int keypad()
{
int z=999;
while(z==999)
{
PORTB = 0Xfe;
_delay_ms(5); /////must for response at porta when key press
if((PINB&0b10000000)==0)
z=0;
if((PINB&0b01000000)==0)
z=1;
if((PINB&0b00100000)==0)
z=2;

if((PINB&0b00010000)==0)
z=3;
PORTB = 0Xfd;
_delay_ms(5);
if((PINB&0b10000000)==0)
z=4;
if((PINB&0b01000000)==0)
z=5;
if((PINB&0b00100000)==0)
z=6;
if((PINB&0b00010000)==0)
z=7;
PORTB = 0b11111011;
_delay_ms(5);
if((PINB&0b10000000)==0)
z=8;
}
return(z);
}
void enq(int size,int map[][size],int curr,int a[],int *i,int f[])
{
int z=0;
for(z;z<size;z++)
{
if(map[curr][z]==1 && f[z]==9999)
{
f[z]=curr;
a[*i]=z;
(*i)++;
}
}
}
int deq(int a[],int *i)
{
int x;
int y=a[0];
for(x=1;x<10;x++)
a[x-1]=a[x];
(*i)--;
return(y);
}
void f_arr(int size,int map[][size],int dest,int curr,int f[])
{
int a[10];
int i=0;
for(i;i<size;i++)
f[i]=9999;
f[dest]=dest;
i=0;
a[i]=dest;
i++;
while(dest!=curr)
{
dest=deq(a,&i);
enq(size,map,dest,a,&i,f);

}
}
int rf()
{
usart_init();
//PORTB = 3;
//_delay_ms(50);
getcard_id();
//PORTB=card[12];
//_delay_ms(2000);
for(i=0;i<10;i++)
{
if( (tags[i][0]==card[9]) && (tags[i][1]==card[10]) && (tags[i][
2]==card[11]) )
{
break;
}
}
return i;
}
int main()
{
//DDRD = 0x0f;
//DDRC = 0xf0;
//PORTC = 0xff;
DDRA = 0xff;
PORTA = 0x00;
_delay_ms(5);
DDRB=0x0f;
//PORTA=0xff;
PORTB=0xff;
_delay_ms(5);
//DDRC = 0xff;
int size=9;
int map[9][9] = {
{0,1,0,1,0,0,0,0,0},
{1,0,1,0,1,0,0,0,0},
{0,1,0,0,0,1,0,0,0},
{1,0,0,0,1,0,1,0,0},
{0,1,0,1,0,1,0,1,0},
{0,0,1,0,1,0,0,0,1},
{0,0,0,1,0,0,0,1,0},
{0,0,0,0,1,0,1,0,1},
{0,0,0,0,0,1,0,1,0}
};
int curr = 1;
int prev = -2;
int next;
int dest;
int f[size];
//PORTB=0b11111111;
//_delay_ms(1000);

while(1)
{
dest=keypad();
PORTB=dest;
_delay_ms(1000);
f_arr(size,map,dest,curr,f);
int ndiff,cdiff;
next=curr;
while(next!=dest)
{
next=f[curr];
cdiff=curr-prev;
ndiff=next-curr;
if(cdiff==ndiff)
{
//PORTA=0b01111111;
PORTA=0xff;
_delay_ms(1000);
PORTA=0b00000000;
}
else if(cdiff+ndiff==0)
{
//PORTA=0b10111111;
PORTA=0xff;
_delay_ms(1000);
PORTA=0b00000000;
_delay_ms(1000);
PORTA=0xff;
_delay_ms(1000);
PORTA=0b00000000;
}
else if (cdiff==3 || cdiff==-1)
{
if(ndiff>0)
{
//PORTA=0b11011111;
PORTA=0xff;
_delay_ms(1000);
PORTA=0b00000000;
_delay_ms(1000);
PORTA=0xff;
_delay_ms(1000);
PORTA=0b00000000;
_delay_ms(1000);
PORTA=0xff;
_delay_ms(1000);
PORTA=0b00000000;
}
else
{
//PORTA=0b11101111;
PORTA=0xff;
_delay_ms(1000);
PORTA=0b00000000;
_delay_ms(1000);
PORTA=0xff;
_delay_ms(1000);
PORTA=0b00000000;
_delay_ms(1000);

PORTA=0xff;
_delay_ms(1000);
PORTA=0b00000000;
_delay_ms(1000);
PORTA=0xff;
_delay_ms(1000);
PORTA=0b00000000;
}
}
else if(cdiff==-3 || cdiff==1)
{
if(ndiff>0)
{
//PORTA=0b11101111;
PORTA=0xff;
_delay_ms(1000);
PORTA=0b00000000;
_delay_ms(1000);
PORTA=0xff;
_delay_ms(1000);
PORTA=0b00000000;
_delay_ms(1000);
PORTA=0xff;
_delay_ms(1000);
PORTA=0b00000000;
_delay_ms(1000);
PORTA=0xff;
_delay_ms(1000);
PORTA=0b00000000;
}
else
{
//PORTA=0b11011111;
PORTA=0xff;
_delay_ms(1000);
PORTA=0b00000000;
_delay_ms(1000);
PORTA=0xff;
_delay_ms(1000);
PORTA=0b00000000;
_delay_ms(1000);
PORTA=0xff;
_delay_ms(1000);
PORTA=0b00000000;
}
}
prev=curr;
curr=next;
int x;
x=rf();
while(x!=curr)
{
if(x!=prev)
{
curr=x;
next=x;
f_arr(size,map,dest,curr,f);
break;
}

x=rf();
}
if(curr==dest)
{
//PORTA=0b11110111;
PORTA = 0b11111111;
_delay_ms(5000);
PORTA = 0b00000000;
}
}
}
}

You might also like