//蛍光灯リモコン
//送信側プログラム
//製作者：KK
//2011/06/18
#include<12f675.h>
#fuses HS,NOCPD,NOWDT,NOBROWNOUT,NOMCLR,NOPROTECT
#use delay(clock=20MHZ)
//ポート定義
#byte RA=5

#bit LED=RA.0		//赤外LED
#bit	LED2=RA.4
#bit TSW=RA.2		//タクトスイッチ

//プロトタイプ関数宣言
void tsw_ch(void);
void led_sig(signed int);

//変数宣言
signed int a=0,b=0,i=0,sw=0;
unsigned long cnt=0,cnt2=0;

//メイン関数
void main(void){
	//ポート入出力設定
	set_tris_a(0x04);
	//割り込み設定
	setup_timer_0(RTCC_INTERNAL | RTCC_DIV_16);
//	enable_interrupts(INT_TIMER0);
//	enable_interrupts(GLOBAL);
	//初期化
	RA=0x00;
	
	while(TRUE){
		if(i){
			i=0;
			led_sig(1);		//スタートビット
			
			//データ(2bit)
			led_sig(a&0x01);
			led_sig(a&0x02);
			
				
			//ストップビット
			led_sig(1);
			led_sig(0);
			led_sig(1);
			led_sig(0);
			
		}	
		else{
			led_sig(0);
		}	
		
		if(!TSW && !b){
			delay_ms(10);
			i=1;
			a=~a;
/*			a++;
			if(a>3){
				a=0;
			}	
*/			b=1;
		}
		
		if(TSW && b){
			delay_ms(10);
			b=0;
		}	
		
	}
}

//割り込み処理
#INT_TIMER0
void timer0(void){
	set_timer0(218);	//600us割り込み
	
	
	cnt2++;
}			

/*=====赤外LED点灯ルーチン=====*/
/*
内容：赤外LEDを約32kHzで発振させる
*/
void led_sig(signed int sig){
	LED=0;
	for(cnt=0;cnt<23;cnt++){
		if(sig)LED=1;
		else LED=0;
		delay_us(12);
		LED=0;
		delay_us(12);	
	}
}

			
void tsw_ch(void){
	switch(sw){
		case 0:		//押していない状態
			if(!TSW)sw=1;
			cnt2=0;
			break;
		
		case 1:		//ﾁｬﾀﾘﾝｸﾞ対策
			if(cnt2<=15 && TSW)sw=0;
			else if(cnt2>15 && !TSW){
				sw=2;
				i=1;
			}	
			break;
			
		case 2:		//押している状態
			if(TSW)sw=3;
			cnt2=0;
			break;
			
		case 3:		//ﾁｬﾀﾘﾝｸﾞ対策
			if(cnt2<=15 && !TSW)sw=2;
			else if(cnt2>15 && TSW)sw=4;
			break;
			
		case 4:		//押した後の動作
			sw=0;
			a++;
			if(a>3){
				a=0;
			}
			break;
	}	
}
