红外NEC协议接收代码借助一个定时中断

/函数主体/
void RayReceive(void)
{
static UINT8 byRecBitCt = 0;
switch(RecStu)
{
case 0:
case 1:
if(RecPt == RecGuidanTbl[RecStu]) // 管脚引导码判断
{
// 开始计数
PulseCount++; //
}
else
{
if(PulseCount > RecSpareTbl[RecStu])
{
RecData[0] = 0;
RecData[1] = 0;
RecData[2] = 0;
RecData[3] = 0;
RecStu ++; // 状态变量自增
PulseCount = 0;
}
else if((PulseCount > 6)&&(AfterRecTimeCt < 500)&&(RecStu == 1)) // 长按信号判断 2.86ms 150ms
{
RecOK = 1;
RecData[2] = RecDataLongPress; // 从长按变量中取回按键值
AfterRecTimeCt = 0;
PulseCount = 0;
RecStu = 0;
RecData[4]++; // 长按次数统计,
}
else
{
// AfterRecTimeStart = 0;
PulseCount = 0;
RecStu = 0;
}
}
break;
case 2:
case 3:
case 4:
case 5:
if(RecPt == 1)
{
PulseCount++;
}
else if(PulseCount!=0) // 增加这个判断的原因是从第1状态进入2状态时电平可能还是低电平状态引起错误
{
if(PulseCount > D_logic_1_MIN)
{
RecData[RecStu-2] |= (1 << (byRecBitCt)); // 低位在前 // 因为接收数据是按位或的方式,所以进入接收数据时也就是接收状态要大于1一定要清接收buffer
}
PulseCount = 0;
byRecBitCt++;
}

if(byRecBitCt > RecBitTbl[RecStu - 2]) // 接收一个字节判断
{
byRecBitCt = 0;
PulseCount = 0;
RecStu++;
if(RecStu > 5) // 接收完毕
{
RecStu = 0;
byRecBitCt = 0;
PulseCount = 0;
if( (RecData[2] | RecData[3]) == 0xff) // 校验接收数据
{
RecOK = 1;
RecData[4] = 0;
RecDataLongPress = RecData[2]; // 保存长按按键值
AfterRecTimeStart = 1; // 开启长按超时计数
AfterRecTimeCt = 0;
}
}
}
break;
default:break;
}
}
可以通过以下链接查看全版
https://bbs.21ic.com/forum.php?mod=viewthread&tid=2641456&page=1#pid10139726

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值