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:
//0KEY の代用
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;//赤外線モード