#include <avr/io.h> //for all avr atmega microcontrollers
#include <util/delay.h> // busy-wait header file
#include <stdio.h> // for c code
#include <math.h>
#define F_CPU 12000000UL // 8MHz crystal freq
void move_forward(void)
{
int i;
PORTA=0x22;
PORTC=0x02;
for(i=0;i<10;i++)
_delay_ms(1000);
PORTA=0x84;
PORTC=0x08;
for(i=0;i<10;i++)
_delay_ms(1000);
PORTA=0x11;
PORTC=0x01;
for(i=0;i<10;i++)
_delay_ms(1000);
PORTA=0x48;
PORTC=0x04;
for(i=0;i<10;i++)
_delay_ms(1000);
PORTC=0x20;
PORTD=0x22;
for(i=0;i<10;i++)
_delay_ms(1000);
PORTC=0x40;
PORTD=0x84;
for(i=0;i<10;i++)
_delay_ms(1000);
PORTC=0x10;
PORTD=0x11;
for(i=0;i<10;i++)
_delay_ms(1000);
PORTC=0x80;
PORTD=0x48;
for(i=0;i<10;i++)
_delay_ms(1000);
}
void move_backward(void)
{int i;
PORTA=0x22;
PORTC=0x02;
for(i=0;i<10;i++)
_delay_ms(1000);
PORTA=0x48;
PORTC=0x04;
for(i=0;i<10;i++)
_delay_ms(1000);
PORTA=0x11;
PORTC=0x01;
for(i=0;i<10;i++)
_delay_ms(1000);
PORTA=0x84;
PORTC=0x08;
for(i=0;i<10;i++)
_delay_ms(1000);
PORTC=0x20;
PORTD=0x22;
for(i=0;i<10;i++)
_delay_ms(1000);
PORTC=0x80;
PORTD=0x48;
for(i=0;i<10;i++)
_delay_ms(1000);
PORTC=0x10;
PORTD=0x11;
for(i=0;i<10;i++)
_delay_ms(1000);
PORTC=0x40;
PORTD=0x84;
for(i=0;i<10;i++)
_delay_ms(1000);
}
void turn_right(void)
{int i;
PORTA=0x22;
PORTC=0x02;
for(i=0;i<10;i++)
_delay_ms(1000);
PORTA=0x48;
PORTC=0x04;
for(i=0;i<10;i++)
_delay_ms(1000);
PORTA=0x11;
PORTC=0x01;
for(i=0;i<10;i++)
_delay_ms(1000);
PORTC=0x20;
PORTD=0x22;
for(i=0;i<10;i++)
_delay_ms(1000);
PORTC=0x80;
PORTD=0x48;
for(i=0;i<10;i++)
_delay_ms(1000);
PORTC=0x10;
PORTD=0x11;
for(i=0;i<10;i++)
_delay_ms(1000);
}
void turn_left(void)
{int i;
PORTA=0x22;
PORTC=0x02;
for(i=0;i<10;i++)
_delay_ms(1000);
PORTA=0x84;
PORTC=0x08;
for(i=0;i<10;i++)
_delay_ms(1000);
PORTA=0x11;
PORTC=0x01;
for(i=0;i<10;i++)
_delay_ms(1000);
PORTC=0x20;
PORTD=0x22;
for(i=0;i<10;i++)
_delay_ms(1000);
PORTC=0x40;
PORTD=0x84;
for(i=0;i<10;i++)
_delay_ms(1000);
PORTC=0x10;
PORTD=0x11;
for(i=0;i<10;i++)
_delay_ms(1000);
}
int main(void)
{
unsigned int k,h;
DDRA=0xff; //all pins of portA made as output
DDRB=0x00; //all pins of portb made as input
DDRC=0xff;
DDRD=0xff;
while(1)
{
k=~PINA;
h=k & 0x0f;
PORTB=0x0f; // pin made to exhibit high initially (pull up reg)
switch (h)
{
case 0x02:
{
move_forward();
break;
}
case 0x08:
{
move_backward();
break;
}
case 0x06:
{
turn_right();
break;
}
case 0x04:
{
turn_left();
break;
}
}
}
return 0;
}