在线时间0 小时
UID2066008
注册时间2013-12-27
NXP金币0 
 
 
 
该用户从未签到 
新手上路 
  
 
	- 积分
 - 38
 
 
- 最后登录
 - 1970-1-1
  
 
 | 
 
 #pragma CODE_SEG __NEAR_SEG NON_BANKED 
 void interrupt 66 PIT0 (void) 
{ 
  irtime++;  //用于计数2个下降沿之间的时间 
 
}   
  #pragma CODE_SEG DEFAULT  
 
#pragma CODE_SEG __NEAR_SEG NON_BANKED 
 
 void interrupt 6 IRQ_interrupt(void)  
  
  { 
 static unsigned char i; 
 static byte startflag; 
 if(startflag) 
 { 
  PORTB_PB0=1; 
  if(irtime=33)   //引导码 TC9012的头码,根据码的格式,应该等待9ms的起始码和4.5ms的结果码完成后才能读码 
   
   i=0;  
  irdata=irtime;     //记录条边沿的时间间隔, 
  irtime=0; 
  i++; 
 
if(i==33) 
  { 
   irok=1; 
   i=0; 
  PORTB_PB1=1; 
  }          //引导码过后就是接受数据了,赋初值i=0  
 }               //32位数据完成后就把标志位irok置1 表示数据接收完成 
 else 
 { 
  irtime=0; 
  startflag=1; 
   
 } 
 
} 
 
#pragma CODE_SEG DEFAULT  
 
void Ircordpro(void) //红外码值处理函数 
{ 
 unsigned char i, j, k; 
 unsigned char cord,value; 
 k=1; 
   
 for(i=0;i1;   //8为数据移位 
   } 
   k++;    //字节数加1 
  } 
  IRcord=value; 
  value=0;     
 }  
 if((IRcord[2])==~IRcord[3]) //检测后两位是不是反码 如果是标志位置1  
 { 
  irpro_ok=1;//处理完毕标志位置1 
   
 } 
 
} 
 
void Ir_work(void)//红外键值散转程序 
{ 
 
  irpro_ok=0;//处理完成标志 
  }                 
 
void main(void)  
{      
DisableInterrupts;                 
initPIT(); 
 DDRB=0xff; 
 PORTB=0x00; 
 IRQinit();  
  
 EnableInterrupts; 
 
 for(;;)  
   
  {   
    if(irok==1)                        //如果接收好了进行红外处理 
  {  
   // PORTB_PB2=1; 
   Ircordpro(); 
    irok=0; 
  } 
    if(irpro_ok==1)                   //如果处理好后进行工作处理,如按对应的按键后显示对应的数字等 
  { 
   Ir_work(); 
    }   
} 
     
  }  
  
变量声明什么的就省了,我的疑问是我按了按键以后 PB0和PB1的灯可以灭掉,从调试看按键以后irok=1了,但是为什么进不了 Ircordpro()这个函数,哪位大神求救啊
        
        
        
         |   
 
 
 
 |