1 红外解码子程序如下:a[4] 依次储存用户码、用户反码与键数据码、键数据反码
2 利用P1.7的下降沿触发中断,我写的注释蛮多的,应该很容易看清楚程序思路的
3 试过几次,就是不知道问题出在哪?先谢过了
4 定时器时钟选了8m,8分频以后,就是1m了,也就是说 :计数一次的时间是1us
#include <msp430x14x.h>
//数组a依次储存用户码、用户反码与键数据码、键数据反码
unsigned char a[4]; //a是8位的char型,与各位码的位数相同
unsigned int LowTime,HighTime;
unsigned char c0,c1,c2,c3,c4,c5,c6,c7;//每一位码的8位
//该解码函数被中断函数调用
int DeCode(void)
{
unsigned char i,j,temp;
for(i=0;i<4;i++)
{
for(j=0;j<8;j++)
{
temp=temp>>1; //为什么不放在下面
TACTL |= TACLR+MC_2; //清零启动计数器
while( (P1IN&0X80)==0X00 );
TACTL |= MC_0;
LowTime = TAR;
TACTL |= TACLR+MC_2; //清零启动计数器
while( (P1IN|0X7F)==0XFF );
TACTL |= MC_0;
HighTime = TAR;
if( (LowTime<415)||(LowTime>715) )
return 0;
if( (HighTime>460)&&(HighTime<660) ) //0 0.565ms/1us=565次
temp=temp&0x7f;
if( (HighTime>1430)&&(HighTime<1930) ) //1 1.685ms/1us=1685次
temp=temp|0x80;
}
a[I]=temp;
}
return 1; //一次按键的解码结束
}
//分离各位码,以在12864在上面显示
void fenjie(void)
{
c0=a[0]/16;
c1=a[0]%16;
c2=a[1]/16;
c3=a[1]%16;
c4=a[2]/16;
c5=a[2]%16;
c6=a[3]/16;
c7=a[3]%16;
}
/*****************************************************************************
端口1中断函数
用到P1.7中断源(下降沿触发中断)
******************************************************************************/
#pragma vector=PORT1_VECTOR //P1.7下降沿触发进入中断函数
__interrupt void Port1(void)
{
if(P1IFG&BIT7) //首先判断中断源
{
TACTL |= TACLR+MC_2; //启动定时器计数
while( (P1IN&0X80) ==0X00 );
TACTL |= MC_0;//定时器暂停(此时TAR的内容不受影响)
LowTime=TAR;
TACTL |= TACLR+MC_2; //启动定时器计数
while( (P1IN|0X7F==0XFF) );
TACTL |= MC_0;
HighTime=TAR;
//9ms低电平应计9000次(9ms/1us=9000) 4.5ms高点平应计4500次(4.5ms/1us=4500次)
//如果引导码 结果码正确,就开始解各部分码
if( (LowTime>8500)&&(LowTime<9500) && (HighTime>4000)&&(HighTime<5000) )
{
if(DeCode()==1)
{
fenjie();
}
}
}
P1IFG =0X00; //清除P1.7中断标志
}
[
本帖最后由 江汉大学南瓜 于 2011-7-12 21:02 编辑 ]
此帖出自
小平头技术问答
TACTL |= TACLR+MC_2; //清零启动计数器
while( (P1IN&0X80)==0X00 );
TACTL |= MC_0;
LowTime = TAR;
也就是上句中的TAR,可一直是0(我用的是map430f5529)
一周热门 更多>