1

我在 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;
}
4

2 回答 2

1

在 PIC TRIS 寄存器中,设置为 1 的位表示输入,设置为 0 表示输出。您将 TRISB = 0b00110000 设置为端口 B 上的所有输出,除了作为输入的 RB5 和 4。如果还需要 RB3 作为数字输入,则需要设置 TRISB = 0b00111000。位计数为 b7、b6、b5、b4、b3、b2、b1、b0。

但是,您期望 RB3 触发 RBIF,正如我在此处解释的那样。所以你有它,只有 RB5 和 4 会触发 RBIF,但如果 R​​B3 那时低,它会切换 D1 和 A2。所以按照我的建议将此代码移动到主循环,直到你让它工作,然后让它在中断上工作。

正如 ChrisJ 所说,除非您禁用它,否则某些引脚默认为模拟输入,这样您就不会获得数字输入并中断您期望使用 ADCON1 的引脚更改

于 2011-03-23T13:32:33.433 回答
0

如果该PBADEN位置位,则 PORTB 初始化为 RB4:RB0 设置为模拟输入。如果是这样,您必须使用ADCON1禁用 RB4:RB0 上的模拟输入。手册第 10.2 节开头的示例程序写入 0x0EADCON1以正确初始化 PORTB。

有关位的解释,另请参见第 21.0 节ADCON1

于 2011-03-22T20:16:11.663 回答