哎,msp430写红外解码不成功啊,又不知道问题出在哪,谁能指条明路啊,谢谢了
[复制链接]
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 编辑 ]
|