使用 PIC 18F4550 闪烁 3 个 LED
Blinking 3 LEDs using PIC 18F4550
我正在尝试使用 C、MPLAB X(IDE 和 IPE)和 PICKit 3 开始使用 PIC 18F4550。
我设法使一个 LED 闪烁没有任何问题,但是当我尝试同时闪烁多个 LED 时,它不起作用。
请注意,我将 post 我的完整代码放在问题的最后。在那之前,我将编写伪代码,希望能使我的问题更清楚一些。
假设我想使 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 会闪烁,其余的会保持关闭状态。
所以我试着翻转输出引脚的顺序
loop{
output1 = 1;
output2 = 1;
output4 = 1;
output3 = 1;
delay();
output1 = 0;
output2 = 0;
output4 = 0;
output3 = 0;
delay();
}
因此,只有连接到输出 3 的 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);
}
这可能是 LATCH 问题。我在启动时遇到过几次这个问题。尝试写入 LATB(输出锁存器)寄存器而不是 PORTB 寄存器。我总是将 LATx 用于输出,将 PORTx 用于输入。
始终写入输出锁存器(在您的情况下为 LATB)并从 PORTx 读取输入。写入 PORTx 具有不可预测的行为。
我正在尝试使用 C、MPLAB X(IDE 和 IPE)和 PICKit 3 开始使用 PIC 18F4550。 我设法使一个 LED 闪烁没有任何问题,但是当我尝试同时闪烁多个 LED 时,它不起作用。
请注意,我将 post 我的完整代码放在问题的最后。在那之前,我将编写伪代码,希望能使我的问题更清楚一些。
假设我想使 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 会闪烁,其余的会保持关闭状态。 所以我试着翻转输出引脚的顺序
loop{
output1 = 1;
output2 = 1;
output4 = 1;
output3 = 1;
delay();
output1 = 0;
output2 = 0;
output4 = 0;
output3 = 0;
delay();
}
因此,只有连接到输出 3 的 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);
}
这可能是 LATCH 问题。我在启动时遇到过几次这个问题。尝试写入 LATB(输出锁存器)寄存器而不是 PORTB 寄存器。我总是将 LATx 用于输出,将 PORTx 用于输入。
始终写入输出锁存器(在您的情况下为 LATB)并从 PORTx 读取输入。写入 PORTx 具有不可预测的行为。