📄 interrupt service.c
字号:
/*void service_t0(void) interrupt TF0_VECTOR using 2
{
TH0=(65536-ir_time)/256;
TL0=(65536-ir_time)%256;
ir_signtime++;
if (ir_signtime>250)
{
ir_signtime=0;
TR0=0;
ir_start_flag=0;
ir_rpt1=ir_rpt2=0;
ir_data[2]=ir_data[3]=0xff; //清除数据.
}
//如果接收到单次的触发脉冲,如干扰或红外信号的结束,关闭定时器,并把红外引导标记清除,把连发标记也清除
}
void service_ex0(void) interrupt IE0_VECTOR using 3
{
EA=0 ; //中断关闭
TH0=(65536-ir_time)/256;
TL0=(65536-ir_time)%256;
if(!ir_start_flag&&ir_signtime>20) //如果没收到引导脉冲,进行引导脉冲CHECK.
{
ir_sign_count=0; //脉冲记数
ir_start_flag=1; //ir_start_flag 引导信号标记。
}
if(ir_start_flag)
{
if(ir_signtime>0&&ir_signtime<10) //符合真正数据的脉冲
{
ir_temp>>=1;
if(ir_signtime>3) ir_temp|=0x80; //如果时间>3是1
ir_sign_count++; //红外脉冲+1
switch (ir_sign_count)
{
case 8:
ir_data[0]=ir_temp; //设备码 if((WORD)(D_Key & D_SystemCodeMask) == (WORD)D_SystemCode) //System code pass
break;
case 16:
ir_data[1]=ir_temp;
break;
case 24:
ir_data[2]=ir_temp; //数据码
break;
case 32:
ir_data[3]=ir_temp;
if (ir_data[0]==~ir_data[1]&&ir_data[2]==~ir_data[3])
{
ir_flag=1; //有键按下.
SBUF=ir_data[2];
P0=ir_data[2];
while(!TI){;}
TI=0;
SBUF=ir_data[2];
while(!TI){;}
TI=0;
}
break;
}
}
if(ir_signtime>0X40)
{
if (ir_rpt1>10)
{
ir_rpt2++;
if(ir_rpt2==2)
{ ir_rpt2=0;
ir_flag=1;}
}
else ir_rpt1++ ;
} //连发码的处理:接收到连发码,淹死20个码,然后每5个码发送一次键按下信号
}
ir_signtime=0; //计数器归0
EA=1;
TR0=1; //开始计时
} */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -