3536|3

3

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

唉 430解码红外失败好久了! [复制链接]

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中断标志   
}

最新回复

请问问题出在哪里呢?为什么不一步步边写边测呢?比如能读出引导码了再写读出数据的……  详情 回复 发表于 2012-7-17 03:38
 
点赞 关注

回复
举报

6

帖子

0

TA的资源

一粒金砂(中级)

沙发
 
我觉得这种分边界的方法区分数据位,不太好
抓中心点来得可靠很多
 
 

回复

24

帖子

0

TA的资源

一粒金砂(中级)

板凳
 

最不喜欢看别人的程序了,而且还是一篇 下来,不加注释。
 
 
 

回复

327

帖子

0

TA的资源

纯净的硅(高级)

4
 
请问问题出在哪里呢?为什么不一步步边写边测呢?比如能读出引导码了再写读出数据的……
 
个人签名Python全文搜索引擎:<url>http://code.google.com/p/ming-search/</url>
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表