📄 infrared.c
字号:
#include "Infrared.h"
#include "Serial.h"
xdata uchar uSendCount1 = 0;
xdata uchar count = 0;
xdata uchar uRecvCount = 0;
xdata uchar KeyHead = 0;
xdata uchar Data0 = 0;
xdata uchar Data1 = 0;
xdata uchar rKey = 0;
bit bFirstGetKey = 1;
uchar GetKey(void)
{
if(bFirstGetKey)
{
bFirstGetKey = 0;
T2MOD &= 0xFC; /* T2OE=0;定时器2输出不允许 */
T2MOD |= 0x00; /* DCEN=1;可以设置为向上/下计数:此程序中为向上达到0xff时溢出*/
C_T2 = 0;
EXF2=0; /* reset flag 定时器2外部标志位清除*/
TCLK=0;RCLK=0; /* disable baud rate generator 不用于波特率发生器*/
TH2=0x00;
TL2=0x00;
RCAP2H=0x00;
RCAP2L=0x00;
ET2=1;
IT3 = 1; // 设置中断触发方式为下降沿触发
EX3=1; // 允许外部中断INT0
}
if(rKey)
{
uchar tKey = rKey;
rKey = 0;
return tKey;
}
return 0;
}
//下面是外部中断INT0的中断服务程序
void Int0IrqHandler (void) interrupt 7 {
EX3 = 0;
delay(30);
if(P4_2 == 0)
{
TH2 = 0xFF;
TL2 = 0x47;
TR2 = 1;
if(uSendCount1 == 0) count = 100;
uSendCount1++;
if(count >= 0x05&& count <= 0x18)
{
if(uRecvCount < 8)
{
KeyHead >>= 1;
if(count > 0x0C)
{
KeyHead |= 0x80;
}
}else
if(uRecvCount >= 0x1A&& uRecvCount < 0x22)
{
Data0 >>= 1;
if(count > 0x0C)
{
Data0 |= 0x80;
}
}else
if(uRecvCount >= 0x22&& uRecvCount < 0x2A)
{
Data1 >>= 1;
if(count > 0x0C)
{
Data1 |= 0x80;
}
}
uRecvCount++;
}
count = 0;
}
EX3 = 1;
}
void timer2 (void) interrupt 5
{
TR2 = 0;
TF2 = 0;
TH2 = 0xFF;
TL2 = 0x47;
TR2 = 1;
count ++;
if((count > 200)&&(uSendCount1 > 1))
{
TR2 = 0;
uSendCount1 = 0;
uRecvCount = 0;
if(KeyHead == 0x1F&&(Data0 = ~Data1))
{
//Send(Data0);
rKey = Data0;
}
KeyHead = 0;
Data0 = 0;
Data0 = 0;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -