c - 在 pic 18F4550 上启用端口 RB4 和 RB3

标签 c embedded microcontroller pic

我在 mplab v8.63 中用 C 编译器 C18 在 pic 18F4550 上编写了这个程序。如果我按下 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 = 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 的引脚更改

关于c - 在 pic 18F4550 上启用端口 RB4 和 RB3,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5397074/

相关文章:

c - 打印 void* 类型的值

关于赋值运算符的c编程查询请在windows和linux中指定输出及其原因

gcc - 使用 Arm GNU 汇编器弹出推送

c - 静态全局结构变量值更改为 FF

microcontroller - 8051微 Controller 套件推荐?

c++ - 如何在 Linux 上创建 stub 共享库

c - C中这个奇怪的函数指针声明是什么意思?

linux - 只有 root 可以登录。可能的原因?

c - LPC1788 微 Controller 的内存分配问题

c - 哪个更好? 32 位 MCU 中的 int8_t 与 int32_t