为什么我的灯4 8 12 就是不能亮啊
是代码问题还是图的问题啊
刚开始学完全不懂




晚上好🌙🌙🌙
本答案参考通义千问
你提到在 Proteus 流水灯实验中,灯 4、8、12 始终不亮,这可能是由以下几个原因引起的。我们从 代码问题 和 电路图(Proteus 图)问题 两个方面进行分析,并给出详细解决方案。
for 循环但没有正确控制 LED 的亮灭顺序,或者索引越界。重点提示:如果你在 Proteus 中用了“LED”元件,建议使用“LED (Common Cathode)”或“LED (Common Anode)”,并确保接线正确。
#include "stm32f10x.h"
void Delay(unsigned int time) {
for (unsigned int i = 0; i < time; i++);
}
int main(void) {
// 使能 GPIOA 时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
// 配置 PA0~PA15 为推挽输出
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_All;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStruct);
while (1) {
// 流水灯效果
for (int i = 0; i < 16; i++) {
GPIO_ResetBits(GPIOA, 1 << i); // 点亮第 i 位
Delay(10000);
GPIO_SetBits(GPIOA, 1 << i); // 关闭第 i 位
}
}
}
重点提示:上述代码中,PA0 到 PA15 对应的是 16 个 LED。如果你只用了 12 个 LED,那么应该只操作前 12 个引脚。
假设你只有 12 个 LED,可以这样修改代码:
#include "stm32f10x.h"
void Delay(unsigned int time) {
for (unsigned int i = 0; i < time; i++);
}
int main(void) {
// 使能 GPIOA 时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
// 配置 PA0~PA11 为推挽输出
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 |
GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 |
GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 |
GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStruct);
while (1) {
for (int i = 0; i < 12; i++) {
GPIO_ResetBits(GPIOA, 1 << i); // 点亮第 i 位
Delay(10000);
GPIO_SetBits(GPIOA, 1 << i); // 关闭第 i 位
}
}
}
重点提示:这个版本只控制 PA0 到 PA11,也就是 12 个 LED,避免越界。
| 错误类型 | 说明 | |----------|------| | LED 接线错误 | 阳极/阴极接反,或未接限流电阻 | | GPIO 初始化错误 | 没有配置为输出,或配置错误 | | 延时函数无效 | 延时太短,看不到变化 | | 循环逻辑错误 | 控制的引脚超出范围,或逻辑混乱 |
如果你愿意提供具体的代码和 Proteus 电路图截图,我可以帮你进一步分析!希望这些内容对你有帮助 😊