430解码红外好久勒 怎么也进展 ,这个程序不知道错哪了 调了好久也没调出来 纠结呀!
#include <msp430x14x.h> #include "TFT_LCD24.h" //#include "char.h" #include "delay.h"
//数组a依次储存用户码、用户反码与键数据码、键数据反码 uchar a[4]; //a是8位的char型,与各位码的位数相同 uint LowTime,HighTime; uchar c[9];//每一位码的8位 uchar flag=0;
//定时器 A 初始化 void Timer_A0_init(void) { TACTL |= TASSEL_2+ID_3+TACLR+MC_2; //选择MCLK,8分频,清零,连续计数模数 }
//高频晶体振荡器初始化 void XT2_init(void) { unsigned int i; WDTCTL = WDTPW + WDTHOLD; //关闭看门狗 BCSCTL1 &= ~XT2OFF; //设置XT2为有效 do { IFG1 &= ~OFIFG;//消除振荡器失效 for(i = 0xFF; i > 0; i--);//稳定时间至少要50us } while((IFG1&OFIFG) != 0);//如果振荡器失效标志存在则继续循环 BCSCTL2 |= SELM_2+SELS;//设置MCLK = XT2 }
//IO 红外输入(P1.6)初始化 void IO_init(void) { P1SEL &=~BIT6; P1DIR &=~BIT6; //PI.6设置为输入 P1IE |=BIT6; //P1.6中断功能打开 P1IES |=BIT6; //P1.6下降沿触发中断 P1IFG =0x00; //中断标志清零 }
//系统(systerm)初始化 void Systerm_init(void) { XT2_init(); LCD_INIT(); LCD_clear(0xf800);
Timer_A0_init(); IO_init(); }
//分离各位码,以在彩屏上面显示 void fenjie(void) { c[0]=a[0]/16+0x30; c[1]=a[0]%16+0x30; c[2]=a[1]/16+0x30; c[3]=a[1]%16+0x30; c[4]=a[2]/16+0x30; c[5]=a[2]%16+0x30; c[6]=a[3]/16+0x30; c[7]=a[3]%16+0x30; c[8]=0; LCD_ShowChar(20,20,0xffff,0xf800,c); }
//该解码函数被中断函数调用 int DeCode(void) { unsigned char i,j,temp; for(i=0;i<4;i++) { for(j=0;j<8;j++) { temp=temp>>1; //为什么不放在下面 TACTL |= TASSEL_2+ID_3+TACLR+MC_2; //清零启动计数器 while( (P1IN&BIT6)==0X00 ); TACTL = 0; LowTime = TAR; TACTL |= TACLR+MC_2; //清零启动计数器 while( (P1IN|0XbF)==0XFF ); TACTL = 0; HighTime = TAR;
if( (LowTime<415)||(LowTime>715) ) return 0; if( (HighTime>460)&&(HighTime<660) ) //0 0.565ms/1us=565次 temp=temp&0xbf; if( (HighTime>1430)&&(HighTime<1930) ) //1 1.685ms/1us=1685次 temp=temp|0x40; } a=temp; }
return 1; //一次按键的解码结束 }
void main(void) { Systerm_init(); _EINT(); P2DIR |= 0xff; P2OUT = 0xff; while(1) { // LCD_printf(LowTime); // LCD_ShowChar(20,20,0xffff,0xf800,c); fenjie(); } }
/***************************************************************************** 端口1中断函数 用到P1.6中断源(下降沿触发中断) ******************************************************************************/ #pragma vector=PORT1_VECTOR //P1.6下降沿触发进入中断函数 __interrupt void Port1(void) { if(P1IFG&BIT6) //首先判断中断源 { P2OUT =0xfe; TACTL |= TASSEL_2+ID_3+TACLR+MC_2; //启动定时器计数 while( (P1IN&0x40) ==0X00 ); TACTL = 0; //定时器暂停(此时TAR的内容不受影响) LowTime=TAR; TACTL |= TASSEL_2+ID_3+TACLR+MC_2; //启动定时器计数 while( (P1IN|0xbf==0XFF) ); TACTL = 0; //定时器暂停 HighTime=TAR; P2OUT=0x7f; //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(); flag=1; // P2OUT=0x7f; } } } P1IFG =0X00; //清除P1.6中断标志 }
|