📄 remote.c
字号:
/*\\file: audio.c
Date. 2005.12.10 Ipman Robbin
Desp. ir decode.
Last update: 2006.08.10
Common: use icp decode ir
*/
//#include "system.h"
#include "remote.h"
void RemoteInit(void);
BYTE irDataBuff[4];
BYTE irKeyEvent=0; //按键状态
UIN16 icrCurrent=0; //当前icr值
UIN16 icrPrevious=0; //上次icr值
UIN16 icrSpace=0; //icr值间隔
BYTE irByteIndex=0; //当前处理遥控器的字节INDEX
BYTE irBitIndex=0; //遥控码位INDEX
BYTE irIsFinish=TRUE; //标志解码成功
BYTE irIndex;
BYTE irCode;
BYTE lastIrCode;
BYTE irState;
BYTE irKeyRpt_f;
BYTE irKeyRptTimes;
static void ir_get_bit(char bit)
{
irDataBuff[irByteIndex]<<=1;
if(bit)
irDataBuff[irByteIndex] |= 1;
else
irDataBuff[irByteIndex] &= 0xFE;
irBitIndex++;
if(irBitIndex%8==0)
irByteIndex++;
if(irBitIndex==32)//累计到32个,则发送遥控器接收完成标志
{
if(irDataBuff[0]==REMOTE_ADDR&&irDataBuff[2]==~irDataBuff[3])//厂家码校验
{
irCode=irDataBuff[2];
irKeyEvent = _IR_KEY_DOWN;
irKeyRptTimes=0;
irKeyRpt_f=0;
irState++;
SendIRCodeStop(); //接收到新的遥控码停止发送上一个遥控码
}
else
{
irState=0;
}
}
}
/*
ICP中断,电平宽度捕捉,遥控解码
*/
//irState
//0: 接收引导码 13.5ms
//1: 接收客户码和遥控码 45ms-63ms
//2: 接收截止码 32ms-50ms
//3: 接收重复发送引导码 11.25ms
//4: 接收重复发送截止码 96.75ms
SIGNAL(SIG_INPUT_CAPTURE1)//ICP1
{
// test();
if(!key_in_press_f)//注意:在键盘有按键未释放,遥控不允许工作
{
icrCurrent = ICR1; //读取本次宽度
icrSpace = icrCurrent - icrPrevious; //获得与上次下降沿的距离
icrPrevious = icrCurrent; //保存当前icr值,以备下次比较用
switch(irState)
{
case 0:
if (icrSpace>(ICR_SPACE_1ST-ICR_SHIFT)&&icrSpace<(ICR_SPACE_1ST+ICR_SHIFT) )
{
irBitIndex=0;
irByteIndex=0;
irState++;
}
break;
case 1:
if(icrSpace<(ICR_SPACE_BIT0+ICR_SHIFT) && icrSpace>(ICR_SPACE_BIT0-ICR_SHIFT))//收到0
{
ir_get_bit(0);DVDPowOff();
}
else if(icrSpace<(ICR_SPACE_BIT1+ICR_SHIFT) && icrSpace>(ICR_SPACE_BIT1-ICR_SHIFT))//收到1
{
ir_get_bit(1);DVDPowOn();
}
else
{
irState=0; //误码时重新置位
}
break;
case 2:
test();
if(icrSpace>(ICR_RUMP_MIN-ICR_SHIFT) && icrSpace<(ICR_RUMP_MAX+ICR_SHIFT))
irState++;
else
irState=0;
break;
case 3:
if (icrSpace<(ICR_SPACE_2ND+ICR_SHIFT) && icrSpace>(ICR_SPACE_2ND-ICR_SHIFT))
{
irState++;
icrPrevious = TCNT1_VAL;
TCNT1 = TCNT1_VAL;
}
else
{
irState=0; //误码时重新置位
irKeyEvent = _IR_KEY_UP;
}
break;
case 4:
if (icrSpace<(ICR_SPACE_1ST*8-ICR_SPACE_2ND+ICR_SHIFT*8) && icrSpace>(ICR_SPACE_1ST*8-ICR_SPACE_2ND-ICR_SHIFT*8))
{
irState--;
irKeyRptTimes++;
if(irKeyRptTimes==10)
{
irKeyRpt_f=1;
irKeyRptTimes=0;
}
}
else
{
irState=0; //误码时重新置位
irKeyEvent = _IR_KEY_UP;
}
break;
default:
irState=0;
break;
}
}
else// if(irState!=0) //有按键时遥控键接收状态初始化
{
irKeyEvent=0;
irState=0;
}
}
/*
定时器溢出,当无按键时产生此事件
*/
SIGNAL(SIG_OVERFLOW1)
{
TCNT1 = TCNT1_VAL;
icrPrevious = TCNT1_VAL;
// if(irState!=0)
// {
if(irState >=2)
irKeyEvent = _IR_KEY_UP; //按键释放
// irState=0;
// }
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -