#include <3694.h>


void wait(void){
	
	long t = 800000;						/* 約1.6秒ウエイト */
	while(t--);
}	

int routina(int d, int flg, long i){
	
	i = 0;
	flg = 0;
	
	for(;;){
		++i;
		d = IO.PDRB.BIT.B7;
		if(d == 1) break;
		if(i == 3000000){
			flg = 1;						/* 約12秒ウエイト */
			break;
		}	
	}
	return flg;
}

int routinb(int d, int flg, long i){
	
	i = 0;
	flg = 0;
	
	for(;;){
		d = IO.PDRB.BIT.B7;
		if(d == 0) break;
		if(i == 3000000){
			flg = 1;						/* 約12秒ウエイト */
			break;
		}	
	}
	return flg;
}

int inpdata(int m){
	
	m = 0;
	
	if(IO.PDRB.BIT.B6 == 1) m = m + 1;
	if(IO.PDRB.BIT.B1 == 1) m = m + 2;
	if(IO.PDRB.BIT.B2 == 1) m = m + 4;
	if(IO.PDRB.BIT.B3 == 1) m = m + 8;
	
	return m;
}


int main(){
	
	long i;
	int d, k, f, j, m;
	int flg, efg, sfg;
	
	IO.PCR8 = 0xff;								/* ポート８ を出力設定する */
	IO.PDR8.BYTE = 0x00;
	
	IO.PCR1 = 0xff;								/* ポート１を出力設定する */
	IO.PDR1.BIT.B1 = 0;
	
						/* 以下携帯電話の呼出音を受けるルーチンである、呼出音があると携帯電話を接続させる */
	while(1){
		
		efg = 0;
		
		for(;;){
			if(IO.PDRB.BIT.B5 == 1){
				wait();
				IO.PDR1.BIT.B1 = 1;
				wait();
				IO.PDR1.BIT.B1 = 0;
				efg = 1;
			}	
			if(efg == 1) break;
	    }
						/* 以下は携帯電話接続後の入出力メインルーチンである */
		while(1){
	
			flg = 0;
			efg = 0;
			sfg = 0;
			k = 0;
			f = 0;
			j = 0;
												/* 以下は入力データ４桁分を求めるルーチン */
			while(1){
				
				flg = routinb(d, flg, i);
				if(flg == 1) break; 
				flg = routina(d, flg, i);
				if(flg == 1) break;
				
				k = inpdata(m);
				
				switch (k){
					case 0x0b:
						flg = routinb(d, flg, i);
						if(flg == 1) break; 
	    				flg = routina(d, flg, i);
						if(flg == 1) break;
						
						f = inpdata(m);
						break;
					case 0x0c:
						flg = routinb(d, flg, i);
						if(flg ==1) break;
						flg = routina(d, flg, i);
						if(flg == 1) break;
						
						j = inpdata(m);
						
						efg = 1;
						break;
						
					default:
						flg = 1;
				}			
				if(efg == 1) break;
				if(flg == 1) break; 		
			}
												/* 以下は求めたデータに従って出力をする */
			switch(f){
				case 0x05:
					switch(j){
						case 0x0a:
							IO.PDR8.BYTE = 0xff;
							wait();
							IO.PDR8.BYTE = 0x00;
							break;
						case 0x01:
							IO.PDR8.BIT.B0 = 1;
							wait();
							IO.PDR8.BIT.B0 = 0;
							break;
						case 0x02:
							IO.PDR8.BIT.B1 = 1;
							wait();
							IO.PDR8.BIT.B1 = 0;
							break;
						case 0x03:
							IO.PDR8.BIT.B2 = 1;
							wait();
							IO.PDR8.BIT.B2 = 0;
							break;
						case 0x04:
							IO.PDR8.BIT.B3 = 1;
							wait();
							IO.PDR8.BIT.B3 = 0;
							break;
						case 0x05:
							IO.PDR8.BIT.B4 = 1;
							wait();
							IO.PDR8.BIT.B4 = 0;
							break;
						case 0x06:
							IO.PDR8.BIT.B5 = 1;
							wait();
							IO.PDR8.BIT.B5 = 0;
							break;
						case 0x07:
							IO.PDR8.BIT.B6 = 1;
							wait();
							IO.PDR8.BIT.B6 = 0;
						case 0x08:
							IO.PDR8.BIT.B7 = 1;
							wait();
							IO.PDR8.BIT.B7 = 0;
							break;
												/* 下記の出力は携帯電話を切り、再度携帯電話の呼出音を受けるルーチンに入る */
						case 0x09:
							IO.PDR1.BIT.B1 = 1;
							wait();
							IO.PDR1.BIT.B1 = 0;
							wait();
							sfg = 1;
					}
					if(sfg == 1) break;
					break; 

				case 0x01:
					switch(j){
						case 0x0a:
							IO.PDR8.BYTE = 0xff;
							break;
						case 0x01:
							IO.PDR8.BIT.B0 = 1;
							break;
						case 0x02:
							IO.PDR8.BIT.B1 = 1;
							break;
						case 0x03:
							IO.PDR8.BIT.B2 = 1;
							break;
						case 0x04:
							IO.PDR8.BIT.B3 = 1;
							break;
						case 0x05:
							IO.PDR8.BIT.B4 = 1;
							break;
						case 0x06:
							IO.PDR8.BIT.B5 = 1;
							break;
						case 0x07:
							IO.PDR8.BIT.B6 = 1;
							break;
						case 0x08:
							IO.PDR8.BIT.B7 = 1;
					}
					break;

				case 0x0a:
					switch(j){
						case 0x0a:
							IO.PDR8.BYTE = 0x00;
							break;
						case 0x01:
							IO.PDR8.BIT.B0 = 0;
							break;
						case 0x02:
							IO.PDR8.BIT.B1 = 0;
							break;
						case 0x03:
							IO.PDR8.BIT.B2 = 0;
							break;
						case 0x04:
							IO.PDR8.BIT.B3 = 0;
							break;
						case 0x05:
							IO.PDR8.BIT.B4 = 0;
							break;
						case 0x06:
							IO.PDR8.BIT.B5 = 0;
							break;
						case 0x07:
							IO.PDR8.BIT.B6 = 0;
							break;
						case 0x08:
							IO.PDR8.BIT.B7 = 0;
					}
			}
			if(sfg == 1) break;
		}
	}		
}
