我读取端口RB7,并在if中检查值。如果RB7上有输出我希望我芯片上的LED亮起(LED D1),但即使没有任何连接到RB7,它也会一直燃烧。我做错了什么?这是PIC 18F4550它是用mplab v8.63和C18编译器编写的。
void main (void)
{
TRISD = 0x00; // PORTD als uitgang
TRISB = 0b00110000; // RB4 en RB5 als ingang
RCONbits.IPEN = 0; // prioriteit uit
INTCONbits.GIE = 1; // enable interrupt
INTCONbits.RBIE = 1; // interrupt portB aan
TRISBbits.TRISB7 = 0;
TRISBbits.TRISB6 = 0;
TRISBbits.TRISB3 = 0;
while(1)
{
_asm sleep _endasm
}
}
#pragma interrupt ISR
void ISR (void)
{
if (INTCONbits.RBIF==1)
{
if(LATBbits.LATB7 == 1) // value on RB7 ?
{
LATDbits.LATD1 ^= 1; // D2 togglen
}
}
INTCONbits.RBIF = 0;
}
答案 0 :(得分:2)
三件事:
答案 1 :(得分:0)
您正在回读B7上的输出值,这没有多大意义。 B7将清除(低),除非您在代码中设置它,因此B7没有变化。在任何情况下,更改B7的输出锁存器都不会触发RBIF。
当RB7至RB4中的任何一个改变状态时,RBIF置位。您已将RB5和RB4声明为输入,那么为什么不在RBIF触发时读取其中一个?
if (PORTBbits.RB5 == 1)
LATDbits.LATD1 ^= 1;
如果您在端口中断更改功能方面遇到问题,只需在主循环代码中尝试以下行来证明您的IO。
LATDbits.LATD1 = PORTBbits.RB5;
如果您的硬件没有上拉或下拉,则应使用INTCON2中的RBPU标志启用端口B上的弱上拉。请注意,当您将引脚声明为输出时,这些会自动关闭。