使用MSP430 TimerA的CCR1捕获形式对红外遥控芯片M50560-008P进行红外解码的实例。注:界说的丈量时间都是通过实践调试后调整得到,可能与芯片手册会有收支。
//红外遥控芯片M50560-008P,其编码格局和M50560-001P共同,可参看数据手册。
#define UserCode 0xC2
#define LeadCodeOrSeprateTime 4000 //4ms,对应1MHz的计数时钟
#define Bit0Time1 600 //0.600ms,对应1MHz的计数时钟
#define Bit0Time2 520 //0.520ms,对应1MHz的计数时钟
#define Bit1Time1 600 //0.600ms,对应1MHz的计数时钟
#define Bit1Time2 1600 //1.600ms,对应1MHz的计数时钟
#define DataCount 8 //8位的用户码或数据码
void ParaSet(uchar DataCode)//红外遥控输入处理
{
//处理代码
}
void SysInit(void)
{
//体系参数初始化代码
}
void main(void)//主函数
{
SysInit();//体系参数初始化
P1DIR=0xFB;//初始化P1.2(红外接纳头)为输入
P1IE=0x04;//使能P1.2的中止
P1IES=0x04;//下降沿触发P1.2中止(红外接纳头反相输出)
}
#pragma vector=PORT1_VECTOR
__interrupt void PORT1()//红外遥控输入中止处理
{
uint LeadBitTime[2],BitTime[3],LastBitTime;
uchar i,j,k,Data[2];
P1IE=0x00;//封闭P1.2中止
_EINT();//进入中止后,体系主动关总中止答应,因而需再开总中止答应
if((P1IFG&0x04)==BIT2)//红外遥控输入
{
P1IFG&=0xFB;//中止标志位复位
P1SEL|=0x04;//P1.2第二功用挑选,进入TimerA的CCR1捕获形式
TACTL|=MC_2+TACLR;//发动TA计数器的接连计数模式
TACCTL1&=~CCIFG;//复位捕获标志
for(k=0;k<2;k++)
{
while((TACCTL1&BIT0)!=CCIFG);//等候上升沿
LeadBitTime[0]=CCR1;
TACCTL1&=~CCIFG;
while((TACCTL1&BIT0)!=CCIFG);//等候下降沿
LeadBitTime[1]=CCR1;
TACCTL1&=~CCIFG;
if(LeadBitTime[1]-LeadBitTime[0]>LeadCodeOrSeprateTime+500||LeadBitTime[1]-LeadBitTime[0]
TACTL|=MC_0+TACLR; //中止TA计数
P1SEL&=0xFB;//P1.2康复挑选榜首功用即为I/O口
return;
}//假如引导码不符则退出
LastBitTime=LeadBitTime[1];
for(i=0;i
BitTime[0]=LastBitTime;//位码开端时间赋初值
for(j=1;j<3;j++)
{
while((TACCTL1&BIT0)!=CCIFG);//等候上升沿或下降沿跳变
BitTime[j]=CCR1;//读取捕获计时值
TACCTL1&=~CCIFG;//复位捕获标志
}
LastBitTime=BitTime[2];//为下一个位码保存开端时间初值
Data[k]>>=1;//得到的用户码和数据码右移1位,高位填0,预备接纳码位码值
if(BitTime[2]-BitTime[1]>Bit0Time2-200&&BitTime[2]-BitTime[1]
}
if(Data[0]!=UserCode)
{//假如用户码不为0xC2则退出
TACTL|=MC_0+TACLR; //中止TA计数
P1SEL&=0xFB;//P1.2康复挑选榜首功用即为I/O口
return;
}
TACTL|=MC_0+TACLR; //中止TA计数
ParaSet(Data[1]);//参数设置
TACTL|=MC_0+TACLR; //中止TA计数
P1SEL&=0xFB;//P1.2康复挑选榜首功用即为I/O口
}
P1IE=0x04;//使能P1.2的中止
}