2015年1月5日月曜日

妖怪ウオッチ零式 其の2 プログラム編 追加プログラム

1)まずは起動時にリモコンを使用するかを判定します。
if(!(PIND & (NEXT_SW)) ||
       !(PIND &(CHANGE_SW)) ){
 IR_initialize();//IR 初期化
//NEXT sw 又は CHANGE sw が押されていれば。(low
  set_sleep_mode(SLEEP_MODE_IDLE);// アイドルモードを設定 2.30mA
        sbi(PORTD,5); //IR +B on
       
        if (!(PIND &(CHANGE_SW))) {
            ir_mode = IR_ON_LED;//データ受信でLEDを点灯する

        }
        sbi(PORTD,4);//オレンジLED点灯
        _delay_ms(3000);
        cbi(PORTD,4);
       
        
 }else{
  set_sleep_mode(SLEEP_MODE_PWR_DOWN);// パワーダウンモードを設定 0.02mA
        cbi(PORTD,5); //IR +B off
        cbi(PORTD,4);

}
スリープモードをアイドルモードにしないと、IR制御用のカウンタが動きません。

2)アイドル処理
赤外線データの受信をチェックして、対応の処理を行います。
数字KEYの場合には、決定KEYが押されるまで、数値編集を行います。
 // IR receve check
 uint8_t frm_len;
 if (IrCtrl.state == IR_RECVED) {
           
   frm_len = IrCtrl.len;
   if (IrCtrl.fmt==NEC) {
    if (frm_len == 32) {// frame lengh 32 bit
               
         if (ir_mode==IR_ON_LED) { //データLED点滅
             sbi(PORTD,4);
             _delay_ms(100);
             cbi(PORTD,4);
         }
                              
     switch (IrCtrl.buff[2]) {
      case NEXT_CODE:
           sw_stat = NEXT_SW;//押下状態 SET
           break;
      case CHANGE_CODE:
           sw_stat = CHANGE_SW;//押下状態 SET
           break;
   //KEY数値の代入 東芝TVリモコンkey code 1~9固定値が前提 
     case TV_CH1:
     case TV_CH2:
     case TV_CH3:
     case TV_CH4:
     case TV_CH5:
     case TV_CH6:
     case TV_CH7:
     case TV_CH8:
     case TV_CH9:
          //KEY 数値の代入
          key_code[key_index++]= IrCtrl.buff[2];
          break;
     case TV_CH10://KEY の代用
           key_code[key_index++]= 0;
           break;
     case ENTER_CODE://決定キー
     case ENTER_CODE_2://音量Up
     case ENTER_CODE_3://音量Down
          //3桁入力Key値の変換
           for (j=0; j<key_index; j++) {//*10倍
             key_val=  (key_val << 3) + (key_val << 1);
             key_val += key_code[j];
           }
                            
           if (medal_soket==INSERT) {//メダル状態は装着。
               eject_medal_sw();
               _delay_ms(EJECT_VOICE_WAIT);
                                
               medal_soket = EJECT;//メダル状態をイジェクトに。
           }
           pat_attr = 0;
           pat_index = 0;
           output_medal_sw(key_val-1);//音声を発生
           key_val=0;//入力値 初期化
           key_index=0;//入力桁 初期化
           medal_soket = INSERT;//メダル状態を装着に。                            
           break;
     case EJECT_CODE:
           if (medal_soket==INSERT) {//メダル状態は装着。
              eject_medal_sw();
              _delay_ms(EJECT_VOICE_WAIT);
              medal_soket = EJECT;//メダル状態をイジェクトに
           }
           break;
                            
    default:
           break;
   }          
  }
 }
    if (key_index>3) {//key数値は3桁まで
       key_index=0;//3桁越えたら強制的にはじめから入力
    }
   IrCtrl.state = IR_IDLE;//recive next frame

}

3)追加宣言
#include "ir_ctrl.h"
#define IR_ON_LED 2
#define IR_ON  1

#define IR_OFF 0

#define NEXT_CODE 0x1b //東芝BF40 ch^
#define CHANGE_CODE 0x1f //東芝BF40 chv
#define ENTER_CODE 0x3d //東芝BF40 OK
#define ENTER_CODE_2 0x1a //東芝BF40 音量UP
#define ENTER_CODE_3 0x1e //東芝BF40 音量Down
#define EJECT_CODE 0x0c //東芝BF40 CH12
#define TV_CH1 0x01 //東芝BF40
#define TV_CH2 0x02 //東芝BF40
#define TV_CH3 0x03 //東芝BF40
#define TV_CH4 0x04 //東芝BF40
#define TV_CH5 0x05 //東芝BF40
#define TV_CH6 0x06 //東芝BF40
#define TV_CH7 0x07 //東芝BF40
#define TV_CH8 0x08 //東芝BF40
#define TV_CH9 0x09 //東芝BF40
#define TV_CH10 0x0a //東芝BF40
#define TV_CH11 0x0b //東芝BF40

#define TV_CH12 0x0c //東芝BF40
unsigned char ir_mode=0;//赤外線モード
戻る


0 件のコメント:

コメントを投稿