#include d:\mc51\8051io.h
#include d:\mc51\8051reg.h
extern register 
unsigned char speedleft,speedright;
register unsigned char high,low,flag,time;
main(){
	P1=0x40;
	P3=0xff;
	high = 80;
	low  = 30;
	flag = 0;
	time = 50;
	
	/*perhitungan port microkontroller
	misal untuk port3 (p3)
	P3_0 = 0
	P3_1 = 0
	P3_2 = 1
	P3_3 = 1
	-------------- 
	P3_4 = 1
	P3_5 = 0
	P3_6 = 0
	P3_7 = 0
	
	Jumlah port ada 8 dibagi menjadi 2 kemudian masing2 didesimalkan. P3_0 s/d P3_3 menjadi desimal digit kedua, 
	P3_4 s/d P3_7 menjadi desimal digit pertama.
	0011 -> 3  ; 1000 ->8 ; contoh di atas menjadi 0x38
	*/
	tepattengah=   //00100
	serongkanan1=   //00110 dan 00010
	serongkanan2=   //00011
	serongkanan3=   //00001
	serongkiri1=   //01100 dan 01000
	serongkiri2=   //11000
	serongkiri3=   //10000

Start();
	while(1) {
        P3|= 0x0f;
	Run();
	}
	}

Start(){
	char exit,key;
	exit =1;
	while(exit){
		key = P1;
		if((key & 0x40)==0) 
		exit=0;      
		}
	}
          
Run(){   
	char sensors;   
	sensors = (P3 &=0x0f);
	if((sensors & 0x01)==0) {
        	TurnRight();
        	flag = 1;              
		}
	else  if((sensors & 0x08)==0) {         
		TurnLeft();         
		flag = 2;             
		}
	else  if(sensors == 0x09) {
		Forward(high);
		flag = 0;              
		}
	else  if(((sensors==0x0b)||(sensors==0x0d))&&(flag==0))
		Forward(low);
		}
		
		
	sensor=P3;
   switch(sensor) {   
   	 case 0:
   	     lpwm=0;rpwm=0;
   	     if(td==1){lpwm=100;rpwm=0;}
   	     if(td==2){lpwm=0;rpwm=100;}
   	     break;
     	 case 1://00000001
   	     lpwm=100;rpwm=0;td=1;break;
   	 case 3://00000011
   	     lpwm=100;rpwm=20;td=1;break;
   	 case 2://00000010
   	     lpwm=100;rpwm=40;td=1;break;
   	 case 6://00000110
   	     lpwm=100;rpwm=60;td=1;break;
   	 case 4://00000100
   	     lpwm=100;rpwm=80;td=1;break;
   	 case 12://00001100
   	     lpwm=100;rpwm=100;td=0;break;
   	 case 8: //00001000
   	     lpwm=80;rpwm=100;td=2;break;
   	 case 24://00011000
   	     lpwm=60;rpwm=100;td=2;break;
   	 case 16://00010000
   	     lpwm=40;rpwm=100;td=2;break;
   	 case 48://00110000
   	     lpwm=20;rpwm=100;td=2;break;
   	 case 32://00100000
   	     lpwm=0;rpwm=100;td=2;break;
   	 case 63://00111111
   	     lpwm=100;rpwm=100;
//
Forward(char speed){
	P1=0x64;  //01100100
	speedright = speed+10;
	speedleft  = speed;
	delay(time);
	}
TurnRight(){  
	P1=0x68;  //01101000
	speedright = low+5;  
	speedleft  = low;
	delay(time);
	}
TurnLeft(){  //01010100
	P1=0x54;
	speedright = low+5;
	speedleft  = low;
	delay(time);
	}
Reverse(char speed){ //01011000
	P1=0x58;
	speedright = speed;
	speedleft  = speed+5;
	delay(time);}