我用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所期望的

10-08 19:16