/***********************************************************/
/*  FILE        :itunes_controller.c
/*  iTunes Controller
/*  2006/4/11 by Yusuke Wada
/*  iTunesをボタンでコントロール
/*  再生/ポーズ(p),次の曲(f),前の曲(b),ボリュームアップ/ダウン(u,d)
/*  シリアル接続UARTで上記文字を送信
/***********************************************************/
#include	"sfr_r815.h"
#define		CLOCK	20000			//20MHz

void Uart_TX(unsigned int data);
void Uart_Vol(unsigned int data);
void delay_ms(unsigned long msec);
unsigned int vol_temp;

void main(void) {
  unsigned int i, cmnd;
  // クロックをメインクロックに切り替える
  prc0 = 1;				//プロテクト解除
  cm1 = 0x08;				//Xin Xout使用、非1/8分周選択
  cm0 = 0x08;				//メイン発振開始、分周なし
  asm("NOP");			
  asm("NOP");				//クロック発振待ち
  asm("NOP");
  asm("NOP");
  ocd2 = 0;				//メインクロック選択
  prc0 = 0;				//プロテクトオン
  
  //I/Oの設定
  pd1 = 0x00;   //pd1系統は全部入力
  pd3_5 = 1; //確認用LED
  pu02 = 1;//プルアップオン
  pu03 = 1;

  p3_5 = 0;//初期LED表示
  
  /// UARTの設定
  //調歩同期、８ビット、パリティなし、ストップ１ビット
  u0mr = 0x05;			//調歩、内部クロック、1Stop、Parityなし
  u0c0 = 0;				//f1で20MHz、CMOS出力、LSBから
  u0c1 = 0x02;			//送受信禁止
  ucon = 0;				//連続受信禁止
  u0brg = 129;     		//20MHzで9600bpsに設定
  
  //whileルーティン
  while(1) {
    
    Uart_Vol(p1_0*1 + p1_1*2 + p1_2*4 + p1_3*8);

    if(p1_6 == 0){//Play
      Uart_TX(0x70);//pをUARTで送信
      p3_5  = 1;
      delay_ms(500);
    }else if(p1_5 == 0){//Foward
      Uart_TX(0x66);//fをUARTで送信
      p3_5  = 1;
      delay_ms(500);
    }else if(p1_7 == 0){//Back
      Uart_TX(0x62);//bをUARTで送信
      p3_5  = 1;
      delay_ms(500);
    }else{
      p3_5  = 0;
      delay_ms(100);
    }
  }
}

void Uart_Vol(unsigned int data){
  if(vol_temp > data){
    Uart_TX(0x75);//uをUARTで送信
  }else if(vol_temp < data){
    Uart_TX(0x64);//dをUARTで送信
  }
  vol_temp = data;
  delay_ms(500);
}
/////// UART1文字送信関数
void Uart_TX(unsigned int data)
{
	u0tb = data;				//送信データセット
	te_u0c1 = 1;				//送信許可
	while(ir_s0tic == 0);		//送信完了待ち
	ir_s0tic = 0;				//送信完了フラグクリア
	te_u0c1 = 0;				//送信禁止	
}
//// ディレイ関数　msec単位
void delay_ms(unsigned long msec) {
	msec = (msec * CLOCK) / 40000;	//クロックで補正
	msec = msec * 1000;				//時間調整
	while(msec--){}
}
