#include <intrins.h> //中断服务宏
#include "delay.h"
#include "main.h"
sbit IRIN = P3^2; //红外接收器数据线(外部中断0)
//--------------------------------------------------------------------------
void ext_int_0_inti(void) //外部中断0初始化
{
IRIN = 1; //红外引脚
IT0 = 1; //IT0 = 0低电平触发,IT0 = 1则为下降沿触发
EX0 = 1; //INT0中断开
}
void extInt_0_interrupt(void) interrupt 0 //using 0//INT0中断 由P3.2引脚产生
{
unsigned char s_j, s_k, s_N=0, s_IRCOM[4];
static unsigned char s_time;
EX0 = 0;
do {_delay_us(100); s_N++;} while (!IRIN); //等IR变为高电平,跳过9ms的前导低电平信号
if (s_N<90) {goto EXIT;} //前导低电平 低于9ms 退出
s_N = 0;
do{_delay_us(100); s_N++;} while (IRIN); //等IR变为低电平
if (s_N>2 && s_N<25) //2.25ms为重复
{
if (s_time>9) {g_system.button_event = 1;} else {s_time++;} //一秒后连续触发
goto EXIT;
}
if (s_N>44) //4.5ms的前导
{
s_time = 0;
for (s_j=0; s_j<4; s_j++) //收集四组数据
{
for (s_k=0; s_k<8; s_k++) //每组数据有8位
{
s_N = 0;
while (!IRIN); //等IR变为高电平
while (IRIN)
{
_delay_us(100);
s_N++;
if (s_N>24 ) {goto EXIT;} //高电平计数超过2.25ms自动离开
}
// if (s_N>17) {goto EXIT;} //高电平计数超过1.69ms自动离开
s_IRCOM[s_j] >>= 1;
if (s_N>8) {s_IRCOM[s_j] |= 0x80;} //N<0.565ms为低电平;N>0.565ms&&N<1.69ms为高电平
}
}
if ((s_IRCOM[2]!=~s_IRCOM[3])//判断接收数据是否正确
// && (IRCOM[0]!=0x00) && (IRCOM[1]!=0xFF)//比较用户码是否正确
) {goto EXIT;}
g_system.button_datum = s_IRCOM[2]; //装载数据
g_system.button_event = 1; //发起按键事件
}
EXIT :
EX0=1;
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>