PIC – RB7有值吗?

我读取端口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; } 

三件事:

  1. 无论您是否有任何连线,输入始终为高或低。 你有适当的上拉或下拉电路吗?
  2. 您可能需要去抖动该输入以防止单个输入触发多个状态更改。
  3. 看起来你没有在启动时设置输出D1。 我不认为它默认为任何特定的状态。

您正在回读B7上的输出值,这没有多大意义。 除非您在代码中设置B7,否则B7将清除(低),因此B7没有任何变化。 在任何情况下,对B7的输出锁存器的更改都不会触发RBIF。

当RB7至RB4中的任何一个改变状态时,RBIF置位。 你已经将RB5和RB4声明为输入,那么为什么不在RBIF触发时读取其中的一个?

 if (PORTBbits.RB5 == 1) LATDbits.LATD1 ^= 1; 

如果您在端口中断更改function方面遇到问题,只需在主循环代码中尝试以下行来certificate您的IO。

  LATDbits.LATD1 = PORTBbits.RB5; 

如果您的硬件没有上拉或下拉,则应使用INTCON2中的RBPU标志启用端口B上的弱上拉。 请注意,当您将引脚声明为输出时,这些将自动关闭。