📄 ir.c
字号:
#include <reg52.h>
#include <intrins.h>
#include "common.h"
#include "define.h"
#include "IR.h"
#include "delay.h"
void RemoteINT0 (void) interrupt 0 using 1
{
static CodeKeep=IR_NONE;
uchar i;
static unsigned count;
uint remote_timer;
uint TimeHigh,TimeLow;
TimeHigh=TH0;
TimeLow=TL0;
remote_timer=(TimeHigh<<8)|TimeLow; //get interval
TH0 = TIMER0TH; // reload counter
TL0 = TIMER0TL;
switch(RmtRevStatus)
{
case Receive_head:
#if(OSC11M==1)
if((remote_timer>12150)&&( remote_timer<14850)) ///2F76 39FD
#endif
#if(OSC12M==1)
if((remote_timer>12150)&&( remote_timer<14850)) ///2F76 39FD
#endif
{
RmtRevStatus = Receive_customer_code;
count = 0;
}
else
{
RmtRevStatus = Receive_head;
#if(OSC11M==1)
if((remote_timer>(11200)) &&( remote_timer<(11300))) //receive is continue code
#endif
#if(OSC12M==1)
if((remote_timer>(11200)) &&( remote_timer<(11300))) //receive is continue code
#endif
{ ///2BC0 2C24
if((CodeKeep==IR_REPEAT_VOLADD)
||(CodeKeep==IR_REPEAT_VOLDEC)
#ifdef EN_REPEAT_RIGHT_LEFT
||(CodeKeep==IR_REPEAT_RIGHT)
||(CodeKeep==IR_REPEAT_LEFT)
#endif
)
{
if(RptKeyTimer)
{
RptKeyTimer=RptKeyMaxTimer;
_bIRKey=CodeKeep;
}
}
}
}
break;
case Receive_customer_code:
i=count/8;
#if(OSC11M==1)
if((remote_timer>125)&&( remote_timer<1625))// a zero bit
#endif
#if(OSC12M==1)
if((remote_timer>125)&&( remote_timer<1625))// a zero bit
#endif
{ ///7D 659
RmtData[i]=(RmtData[i] >> 1) & 0x7F;// a zero bit
}
else
{
#if(OSC11M==1)
if((remote_timer>1626) &&( remote_timer<3250))//a one bit
#endif
#if(OSC12M==1)
if((remote_timer>1626) &&( remote_timer<3250))//a one bit
#endif
{ ///659 CB2
RmtData[i]=(RmtData[i] >> 1) | 0x80;
}
else //receive is disturb
{
RmtRevStatus = Receive_head;
break;
}
}
count++;
switch(count)
{
case 8:
if(RmtData[0]!=IR_CUSTOM_CODE)RmtRevStatus = Receive_head;
break;
case 16:
if(RmtData[1]!=IR_CUSTOM_SUB_CODE)RmtRevStatus = Receive_head;
break;
case 32:
if(RmtData[2]== (~RmtData[3] & 0xff))// Check if data is valid
{
CodeKeep = RmtData[2];
_bIRKey=CodeKeep;
RptKeyTimer=RptKeyMaxTimer;
}
RmtRevStatus = Receive_head;
break;
}
}
}
void SimulateIRWait(void)
{
uint counter=0;
while(SimulateIRStatus==IsNotArrivaledTime)
{
counter++;
if(counter>=8000){break;}
}
}
void SimulateIRSendByte(uchar _byte )
{
uchar i;
for(i=1;i<=8;i++)
{
SimulateIRStatus=IsNotArrivaledTime;
RmtOutIo=0;
TR1=0; //Timer_1 stop count
#if(OSC12M==1)
TH1 =0xfd;// 0xfe; //560us
TL1 =0xcf;// 0x0b; //560us
#endif
#if(OSC11M==1)
TH1 =0xfd;// 0xfe; //560us
TL1 =0xcf;// 0x0b; //560us
#endif
TR1=1; //Timer_1 start count
SimulateIRWait( );
RmtOutIo=1;
SimulateIRStatus=IsNotArrivaledTime;
TR1=0; //Timer_1 stop count
if(_byte&0x01)
{
#if(OSC12M==1)
TH1 = 0xf9;//0xf9; //1 is 2.25-0.56ms
TL1 = 0x65;//0x29; //1 is 2.25-0.56ms
#endif
#if(OSC11M==1)
TH1 = 0xf9;//0xf9; //1 is 2.25-0.56ms
TL1 = 0xea;//0x29; //1 is 2.25-0.56ms
#endif
}
else
{
#if(OSC12M==1)
TH1 = 0xfd;//0xfd; //1 is 1.125-0.56ms
TL1 = 0xca;//0x11; //1 is 1.125-0.56ms
#endif
#if(OSC11M==1)
TH1 = 0xfd;//0xfd; //1 is 1.125-0.56ms
TL1 = 0xca;//0x11; //1 is 1.125-0.56ms
#endif
}
TR1=1; //Timer_1 start count
SimulateIRWait( );
_byte>>=1; // low bit is front according receive
}
}
void SimulateIRSendKey(uchar _key )
{
RmtOutIo=1;
Delay100us( );
SimulateIRStatus=IsNotArrivaledTime;
RmtOutIo=0;
TR1=0; //Timer_2 stop count
#if(OSC12M==1)
TH1 = 0xdc; //Leader signal low = 9ms
TL1 = 0xd7; //Leader signal low = 9ms
#endif
#if(OSC11M==1)
TH1 = 0xdF; //Leader signal low = 9ms
TL1 = 0x99; //Leader signal low = 9ms
#endif
TR1=1; //Timer_2 start count
SimulateIRWait();
SimulateIRStatus=IsNotArrivaledTime;
RmtOutIo=1;
TR1=0; //Timer_2 stop count
#if(OSC12M==1)
TH1= 0xee; //Leader signal high = 4.5ms
TL1 = 0x6b; //Leader signal high = 4.5ms
#endif
#if(OSC11M==1)
TH1= 0xef; //Leader signal high = 4.5ms
TL1 = 0xcc; //Leader signal high = 4.5ms
#endif
TR1=1; //Timer_1 start count
SimulateIRWait();
SimulateIRSendByte(CUSTOMER_CODE);
SimulateIRSendByte(CUSTOMER_SUB_CODE);
SimulateIRSendByte(_key);
SimulateIRSendByte(~_key);
RmtOutIo=0;
SimulateIRStatus=IsNotArrivaledTime;
TR1=0; //Timer_1 stop count
#if(OSC12M==1)
TH1 = 0xfe; //500us
TL1 = 0x0b; //500us
#endif
#if(OSC11M==1)
TH1 = 0xfe; //500us
TL1 = 0x33; //500us
#endif
TR1=1; //Timer_1 start count
SimulateIRWait();
RmtOutIo=1;
}
void Timer0(void) interrupt 1 using 3
{
TH0 = TIMER0TH; // reload counter
TL0 = TIMER0TL;
RmtRevStatus = Receive_head; // anti disturb
TF0=0; //Timer0 复位 可无? at TCON register
}
void Timer1(void) interrupt 3 using 0
{
TR1=0; //Timer_1 stop count
TH1 = TIMER1TH; // reload counter
TL1 = TIMER1TL;
SimulateIRStatus=IsArrivaledTime;
PLScanStatus=AllowScan;
TF1=0; //Timer0 at TCON register
TR1=1; //Timer_1 start count
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -