/****************************************************************
*创绿开发工作室,欢迎光临http://chuanglu2008.taobao.com,
*承接电子产品开发,软件开发,单片机开发,程序移植
*欢迎光临http://chuanglu2008.taobao.com
* 库版本 :V1.0.0
* 作者 :liaotingtai QQ:1390954239
*修改时间 :2010-12-20
*************************************************************/
/*
!!!按一下学习键指示灯亮一下灭,松开,再按一下遥控器,学习指示灯闪一下,表示学习成功
学习成功后,才能接收此遥控器的数据,否则没反应!!!
!!!按下学习按键6秒之内松开,超过6秒后无效并清除以前存储的遥控器数据
*/
#include "main.h"
uchar hle_w,lle_w;
uchar ma_n;
unsigned long bma;
unsigned long mma;
uint s_TO;
union flag myFlag;
void delay_1ms(uint x)
{
uint i;
for(i=0;i<x;i++)
__delay_ms(1);
}
void delay_us(unsigned int a)
{
uint i;
for(i=0;i<a;i++)
__delay_us(1);
}
#if 1
void rx_val()
{
uchar x1;
////////////////////////////////////////////////////////////////////////////////////////
if (!RF)
{ lle_w++;myFlag.oneBit.old_bit=0; } // 检测到低电平
////////////////////////////////////////////////////////////////////////////////////////
else // 检测到高电平
{
hle_w++;//记录高电平时间
if (!myFlag.oneBit.old_bit)// 检测到从低到高的跳变,已检测到一个完整(高-低)电平周期
{
if (((hle_w>=2)&&(hle_w<=7))&&((lle_w>=110)&&(lle_w<=170))) //判同步码
{
ma_n=0;myFlag.oneBit.tb_ok=1;bma=0; myFlag.oneBit.bt_auto=0;
}
//数据低电平
else if ((myFlag.oneBit.tb_ok)&&((lle_w>=10)&&(lle_w<=17)))
{
ma_n++;
bma=bma<<1;
if(ma_n>23)
{
if(!myFlag.oneBit.rf_ok1)//第一次接收
{
mma=bma;//将接收到的编码复制到解码寄存器中
myFlag.oneBit.rf_ok1=1;
ma_n=0;
myFlag.oneBit.tb_ok=0;
myFlag.oneBit.bt_auto=0;
s_TO=1500;
}
else//第二次接收数据
{
myFlag.oneBit.rf_ok2=1;
ma_n=0;
myFlag.oneBit.tb_ok=0;
myFlag.oneBit.bt_auto=0;
}
}
}
//数据高电平
else if ((myFlag.oneBit.tb_ok)&&((lle_w>=3)&&(lle_w<=7)))
{
bma=bma<<1;
if(ma_n<23)
{
bma+=1;
}
if(ma_n==23)
{
bma+=1;
if(!myFlag.oneBit.rf_ok1)
{
mma=bma;//将接收到的编码复制到解码寄存器中
myFlag.oneBit.rf_ok1=1;
myFlag.oneBit.tb_ok=0;
myFlag.oneBit.bt_auto=0;
ma_n=0;
s_TO=1500;
}
else //第二次接收数据
{
myFlag.oneBit.rf_ok2=1;
myFlag.oneBit.tb_ok=0;
myFlag.oneBit.bt_auto=0;
ma_n=0;
}
}
ma_n++;
}
//解码失败 接收到不符合的高-低电平序列
else
{ma_n=0; myFlag.oneBit.tb_ok=0; myFlag.oneBit.bt_auto=0;bma=0; hle_w=1;lle_w=0;}
lle_w=0;hle_w=1;
}
myFlag.oneBit.old_bit=1; // 记录本次电平状态
}
////////////////////////////////////////////////////////////////////////////////////////
if(myFlag.oneBit.rf_ok1) //规定时间内接受到2帧相同的编码数据才有效
{
s_TO--;
if(!s_TO) myFlag.oneBit.rf_ok1=0;
if(myFlag.oneBit.rf_ok2)
{
if(mma==bma)//比较两次接收到的编码是否一致 OK
{
myFlag.oneBit.rf_ok=1;//接收到数据成功
myFlag.oneBit.rf_ok1=0;
myFlag.oneBit.rf_ok2=0;
}
else//接收数据无效 NO
{
myFlag.oneBit.rf_ok=0;
myFlag.oneBit.rf_ok1=0;
myFlag.oneBit.rf_ok2=0;
}
}
}
///////////////////////////////接收成功后与存储数据比较一致才算成功/////////////////////////////////////////////////////////
if((myFlag.oneBit.rf_ok)&&(!myFlag.oneBit.study))
{
GIE=0;
myFlag.oneBit.rf_ok=0;
#if defined(STUDY_NOSET)//没有学习功能
if( ((mma&0x00ff)==0xc0) | ((mma&0x00ff)==0x0c) |((mma&0x00ff)==0x30)|((mma&0x00ff)==0x03) )//判断是2262编码
{
if((mma&0x00ff)==0xc0) D0H;else D0L;
if((mma&0x00ff)==0x30) D1H;else D1L;
if((mma&0x00ff)==0x0c) D2H;else D2L;
if((mma&0x00ff)==0x03) D3H;else D3L;
}
else{
if((mma&0x000f)==0x08) D0H;else D0L;//EV1527
if((mma&0x000f)==0x04) D1H;else D1L;
if((mma&0x000f)==0x02) D2H;else D2L;
if((mma&0x000f)==0x01) D3H;else D3L;
}
myFlag.oneBit.decode_ok=1;
decode_okH;//解码有效 VT
s_TO=1500;
#endif
#if defined(STUDY_SET) //有学习功能
if( ((mma&0x00ff)==0xc0) | ((mma&0x00ff)==0x0c) |((mma&0x00ff)==0x30)|((mma&0x00ff)==0x03) )//判断是2262编码
{
for(x1=0;x1<40;x1++)
{
if( ((mma>>16)==Eeprom_Read(x1*3+1)) && (((mma&0x00ff00)>>8)==Eeprom_Read(x1*3+2)) && ((mma&0x00ff)==Eeprom_Read(x1*3+3)) )
{
if((mma&0x00ff)==0xc0) D0H;else D0L;
if((mma&0x00ff)==0x30) D1H;else D1L;
if((mma&0x00ff)==0x0c) D2H;else D2L;
if((mma&0x00ff)==0x03) D3H;else D3L;
myFlag.oneBit.decode_ok=1;decode_okH;//解码有效
s_TO=1500;//解码有效输出时间
break;
}
}
}
else//判断是1527编码
{
for(x1=0;x1<40;x1++)
{
if( ((mma>>16)==Eeprom_Read(x1*3+1)) && (((mma&0x00ff00)>>8)==Eeprom_Read(x1*3+2)) && ((mma&0x00ff)==Eeprom_Read(x1*3+3)) )
{
if((mma&0x000f)==0x08) D0H;else D0L;
if((mma&0x000f)==0x04) D1H;else D1L;
if((mma&0x000f)==0x02) D2H;else D2L;
if((mma&0x000f)==0x01) D3H;else D3L;
myFlag.oneBit.decode_ok=1;decode_okH;//解码有效
s_TO=1500; //解码有效输出时间
break;
}
}
}
#endif
GIE=1;
}
////////////////////////////////////////////////////////////////////////////////////////
if(myFlag.oneBit.decode_ok)//解码有效输出
{
s_TO--;
if(!s_TO)
{
myFlag.oneBit.decode_ok=0;decode_okL;
//if(!LM_SEL) //锁存/暂态 选择
{
D0L;
D1L;
D2L;
D3L;
}
}
}
/////////////////////////////////////////////////////////////////////////////