启用pic 18F4550上的端口RB4和RB3

时间:2011-03-22 19:59:14

标签: c embedded microcontroller pic

我已经在pic 18F4550上使用c编译器C18在mplab v8.63中编写了这个程序。如果我按下我的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;
}

2 个答案:

答案 0 :(得分:1)

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

但是,您期望RB3触发RBIF,而不是explained here。因此,只有RB5和4才会触发RBIF,但如果RB3此时为低,则会切换D1和A2。所以将这段代码按照我的建议移动到主循环,直到你得到它为止,然后让它在中断上工作。

正如ChrisJ所说,有些引脚默认为模拟输入,除非你禁用它,所以你不会得到数字输入和中断引脚更改,你期望使用ADCON1

答案 1 :(得分:0)

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

有关ADCON1位的说明,另请参见第21.0节。