📄 pcinterrupt.c
字号:
#define EXT_PCINT2_GLOBALS
#include "includes.h"
/************************************************************
Function Name: T2Init
Function: Timer0 initial
Paramenter: None
Return value: None
Author: Chen yuan zhen May.30.2008
*************************************************************/
void PCIntClose(void)
{
EIMSK = 0x00;
}
/************************************************************
Function Name: T2Init
Function: Timer0 initial
Paramenter: None
Return value: None
Author: Chen yuan zhen May.30.2008
*************************************************************/
void PCIntInitial(void)
{
DDRE &= ~(1<<PE2);
EIMSK |= (1<<PCIE0);
PCMSK0 |= (1<<PCINT2);
}
/************************************************************
Function Name: T2Init
Function: Timer0 initial
Paramenter: None
Return value: None
Author: Chen yuan zhen May.30.2008
*************************************************************/
SIGNAL(PCINT0_vect)
{
unsigned char static PCStatus=0;
unsigned char static DataBitStatus=0;
unsigned char static DataByteStatus=0;
unsigned char static data=0;
if( (PCINT_FLAG)&&(PCTimeCounter<80) )
{
switch(PCStatus)
{
case 0:
{
if( (PCTimeCounter>60)&&(PCTimeCounter<80)&&(IS_INFRARED_INPUT) ) //引导码;
{
PCStatus=1;
PCTimeCounter=0;
}
else //还没有开始,不计时。
{
if(IS_INFRARED_INPUT)
{
PCTimeCounter=0;
}
}
break;
}
case 1:
{
if( (!IS_INFRARED_INPUT) ) //第一个数据pulse完成
{
if( (PCTimeCounter>7)&&(PCTimeCounter<11) )
{
PCStatus=2;
PCTimeCounter=0;
}
}
break;
}
case 2:
{
if(IS_INFRARED_INPUT)
{
if( (PCTimeCounter>7)&&(PCTimeCounter<11) ) //第2个数据pulse完成
{
data = data<<1; //为0
PCStatus=1;
PCTimeCounter=0;
DataBitStatus++;
}
else
{
if( (PCTimeCounter>24)&&(PCTimeCounter<30) )
{
data = data<<1; //为1
data += 1;
PCStatus=1;
PCTimeCounter=0;
DataBitStatus++;
}
}
if(DataBitStatus==8)
{
switch(DataByteStatus)
{
case 0:case 1:
{
if( data == 0x0f ) //用户码
{
DataByteStatus++;
}
break;
}
case 2:
{
PCKey=data;
DataByteStatus++;
break;
}
case 3:
{
if( (PCKey+data==0xFF)&&(PCKey<=0x0a) )
{
//按键成功
OCR1A = 63; //0.5s
}
DataByteStatus=0;
break;
}
}
} //end of if(DataBitStatus==8)
} //end of if(IS_INFRARED_INPUT)
break;
} // case 2:
} //end of switch(PCStatus)
}
else
{
if(IS_INFRARED_INPUT)
{
data = 0;
PCTimeCounter=0;
T1Close( );
OCR1A = 7; //64us
T1Start( );
PCStatus=0;
PCINT_FLAG=1;
PCStatus=0; //标志位清0
DataBitStatus=0;
DataByteStatus=0;
data=0;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -