使用PIC 18F4550闪烁3个LED

时间:2016-09-17 15:38:24

标签: c embedded pic microchip mplab

我正在尝试使用C,MPLAB X(包括IDE和IPE)并使用PICKit 3开始使用PIC 18F4550。 我设法闪烁一个LED没有任何问题,但当我尝试同时闪烁多个LED时,它不起作用。

请注意,我会在问题的最后发布我的完整代码。在那之前,我将编写伪代码,希望能让我的问题更加清晰。

假设我要闪烁4个LED,每个LED连接到芯片的输出引脚,你显然会输入类似

的内容
loop{
     output1 = 1;
     output2 = 1;
     output3 = 1;
     output4 = 1;
     delay();
     output1 = 0;
     output2 = 0;
     output3 = 0;
     output4 = 0;
     delay();
}

您可能希望所有LED同时打开和关闭。但是,我注意到只有连接到output4的LED才会闪烁,其余的LED将保持关闭状态。 所以我尝试按顺序翻转输出引脚的顺序

 loop{
         output1 = 1;
         output2 = 1;
         output4 = 1;
         output3 = 1;
         delay();
         output1 = 0;
         output2 = 0;
         output4 = 0;
         output3 = 0;
         delay();
    }

因此,只有连接到输出3的LED会闪烁,其余的LED将保持关闭状态。

所以我想,不知何故,代码没有像我预期的那样按顺序执行。 任何人都可以为我提供解释和可能的解决方案吗?

非常感谢!

这是完整的代码

#include <xc.h>
#include <p18f4450.h>
#pragma config FOSC = HS

#define outRed  PORTBbits.RB0
#define outBlue PORTBbits.RB1
#define outYellow PORTBbits.RB2
#define outGreen PORTBbits.RB3
#define _XTAL_FREQ 10000000

void delay(unsigned int);



void main(void) {
    TRISBbits.TRISB0 = 0;
    TRISBbits.TRISB1 = 0;
    TRISBbits.TRISB2 = 0;
    TRISBbits.TRISB3 = 0;

    while(1) {
        outRed = 1;
        outGreen = 1;
        outBlue = 1;
        outYellow = 1;
        delay(1000);   
        outRed = 0;
        outGreen = 0;
        outBlue = 0;
        outYellow = 0;
        delay(1000);
    }        

}

void delay(unsigned int delayInput) {
    unsigned int mul = delayInput/50;
    unsigned int count = 0;
    for (count = 0; count <= mul; count ++)
        __delay_ms(50);
}

2 个答案:

答案 0 :(得分:1)

这可能是一个LATCH问题。我启动时有几次遇到这个问题。尝试写入LATB(输出锁存)寄存器而不是PORTB寄存器。我总是使用LATx作为输出,使用PORTx作为输入。

答案 1 :(得分:0)

始终写入输出锁存器(在您的情况下为LATB)并从PORTx读取输入。写给PORTx有不可预测的行为。