我用mplab v8.63编写了这个程序,在pic 18F4550上使用c编译器C18。如果我按下picdem(S3)上的按钮,并且RB5上连接了一个led(带电阻器),那么led就会亮起。当我按下(S3)并且RB4上有一个led时,led将不亮(虽然我希望如此)与RB3相同。我忘了放什么东西了吗?
目标是用LDR分别测量红色、绿色和蓝色LED。但首先我显然必须启用端口RB5、RB4和RB3。
#pragma code
/******************************************************************************/
void main (void)
{
TRISD = 0x00; // PORTD as output
TRISB = 0b00110000; // RB4 en RB5 as input
TRISA = 0x00; // RA output
RCONbits.IPEN = 0; // priority
INTCONbits.GIE = 1; // enable interrupt
INTCONbits.RBIE = 1; // interrupt portB on
while(1)
{
_asm sleep _endasm
}
}
#pragma interrupt ISR
void ISR (void)
{
//int red= 01110010011011110110111101100100;
int on = 1;
int off = 0;
if (INTCONbits.RBIF==1)
{
if(PORTBbits.RB5==0) // S3 pressed?
{
LATDbits.LATD1 ^= 1; // D2 toggle
LATAbits.LATA2 ^= on;
}
if(PORTBbits.RB4==0)
{
LATDbits.LATD1 ^= 1; // D2 toggle
LATAbits.LATA2 ^= on;
}
if(PORTBbits.RB3==0)
{
LATDbits.LATD1 ^= 1; // D2 toggle
LATAbits.LATA2 ^= on;
}
}
INTCONbits.RBIF = 0;
}
最佳答案
在PIC TRIS寄存器中,设置为1的位表示输入,0表示输出。您将TRISB设置为0b001000,这是端口B上除RB5和4之外的所有输出。如果您还需要RB3作为数字输入,则需要设置TRISB=0b00111000。位被计数为b7、b6、b5、b4、b3、b2、b1、b0。
然而,你期望RB3触发RBIF,而不是Iexplained here。因此,正如你所拥有的,只有RB5和4会触发RBIF,但如果那时RB3很低,它会切换D1和A2。所以,按照我的建议把这段代码移到主循环中,直到它工作为止,然后让它在中断时工作。
正如ChrisJ所说,有些管脚默认为模拟输入,除非您禁用它,这样您就不会得到数字输入,并在管脚更改时中断,这是您使用ADCON1所期望的