|
我用的是CY7C63813这个片子,实现的功能是接收红外码。红外接收头接到P0.1口上,在PORT0中断中接收红外码,具体代码如下:
void PORT0_ISR( void )//下降沿有效,无触发时,红外接收头输出高电平
{
unsigned int i;
unsigned int j;
key_code_32 = 0;
P01CR &= 0XBF;//禁止该中断源触发
for(j = 0;j<3120;j++)//delay 9ms,跳过9ms的低电平
{
////
if(!(P0DATA & 0X02))//假如P0.1口在9ms期间出现高电平,判断为干扰脉冲(实测干扰脉冲的低电平宽度只有250us),中断返回
{
//key_pressed = 1;
P01CR |= 0X40;
asm("add SP,-4");
asm("pop X");
asm("pop A");
asm("mov [__r0],A");
asm("pop A");
asm("reti");
}
}
////
//连_发码检测
for(j = 0;j<1043;j++)//delay 3ms
{
if(!(P0DATA & 0X02))//if p0.1 turn to low level,break
{
P01CR |= 0X40;
Lianfa = 1;
asm("add SP,-4");
asm("pop X");
asm("pop A");
asm("mov [__r0],A");
asm("pop A");
asm("reti");
}
}
//key_pressed = 1;
for(j = 0;j<1043;j++)//delay 3ms
{
if(!(P0DATA & 0X02))//if p0.1 turn to low level,break
{
break;
}
}
for(i=0;i<32;i++)
{
while(!(P0DATA & 0X02));//wait for high level
for(j = 0;j<490;j++);//delay 0.9ms
if(P0DATA & 0X02)
{
key_code_32 |= 1;
}
key_code_32 <<= 1;
}
key_pressed = 1;
P01CR |= 0X40;
}
问题出在////之间的代码上。正常操作时,下降沿之后,应该是9ms的低电平,我用示波器抓P0.1口的波形,也是如此,其间没有出现过高电平,但是在PORT0_ISR里面竟然触发了。
开始,我怀疑是不是逻辑不匹配,为了搞清楚P0.1口到底接收到了什么,我禁止PORT0中断,在main函数while(1)下,采用如下语句:
if(P0DATA & 0X02)//P0.1口接收到“1”
P0DATA |= 0X20;//置P0.5口为“1”
else
P0DATA &= 0XDF;
然后用示波器测P0.5口,得到的波形跟P0.1口接收到的波形一样。
这就说明9ms期间,P0.1口没有出现高电平,但是(P0DATA & 0X02)竟然为“真”!!
所以,请教马老师,是不是P0DATA暂存了最初的高电平,而下降沿中断触发检测到的是实际的IO电平变化,所以,造成中断触发之后,P0DATA无法及时保存P0.1口的实际电平????? |
|