嵌入式实验三led灯一个点亮其余全灭
时间: 2025-06-30 14:35:18 浏览: 15
### 嵌入式开发中控制LED灯点亮与熄灭的实现
在嵌入式开发中,可以通过GPIO接口来控制LED灯的点亮与熄灭。以下是一个典型的实验场景:当按下某个按键时,指定的一个LED灯被点亮,而其余的LED灯全部熄灭。
#### 初始化GPIO引脚
首先需要初始化用于控制LED灯的GPIO引脚。以下是基于C语言的代码示例:
```c
void LED_Init(void) {
// 配置LED对应的GPIO为输出模式
P1DIR |= 0x0F; // 将P1.0~P1.3设置为输出方向
P1OUT &= ~0x0F; // 初始状态下关闭所有LED灯
}
```
此部分代码设置了四个LED灯(假设连接到P1.0-P1.3),并将它们的方向设为输出[^1]。
---
#### 主程序逻辑设计
主程序通过读取按键输入并更新LED状态来实现功能需求。下面展示了一个完整的`main()`函数实现:
```c
#include <ioCC2530.h> // CC2530头文件
#define BUTTON_PRESSED 0 // 按键按下标志位
#define LED_COUNT 4 // 总共使用的LED数量
// 定义LED和按钮对应关系
#define LED1 P1_0
#define LED2 P1_1
#define LED3 P1_2
#define LED4 P1_3
#define BUTTON1 P2_0 // 假设按键接在P2.0上
void LED_Init(void);
void Button_Init(void);
int main(void) {
uint8_t currentLedIndex = 0;
LED_Init(); // 初始化LED
Button_Init(); // 初始化按键
while (1) {
if (!BUTTON1) { // 如果检测到按键按下
__delay_cycles(10000); // 去抖动延迟
if (!BUTTON1) { // 再次确认按键是否真的按下
// 关闭所有LED灯
P1OUT &= ~(0x0F);
// 只点亮当前索引对应的LED灯
switch(currentLedIndex % LED_COUNT){
case 0: LED1 = 1; break;
case 1: LED2 = 1; break;
case 2: LED3 = 1; break;
case 3: LED4 = 1; break;
}
// 更新下一个要点亮的LED索引
currentLedIndex++;
while(!BUTTON1); // 等待按键释放
}
}
}
}
void LED_Init(void) {
P1DIR |= 0x0F; // 设置P1.0~P1.3为输出
P1OUT &= ~0x0F; // 所有LED初始状态为熄灭
}
void Button_Init(void) {
P2DIR &= ~0x01; // 设置P2.0为输入
P2INP |= 0x01; // 启用内部弱上拉电阻
}
```
以上代码实现了每次按下按键时切换点亮不同的LED灯,并确保只有一个LED处于点亮状态,其余均熄灭[^2]。
---
#### 使用HAL库的STM32版本代码
对于使用STM32微控制器的情况,可以借助CubeMX工具生成框架代码,并手动补充业务逻辑。下面是类似的实现方式:
```c
#include "stm32f1xx_hal.h"
uint8_t currentLedIndex = 0;
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
int main(void) {
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
while (1) {
if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_RESET) {
// 当PA0上的按键被按下时
HAL_Delay(20); // 去抖动处理
if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_RESET) {
// 清除所有LED灯的状态
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7 | GPIO_PIN_8 | GPIO_PIN_9 | GPIO_PIN_10, GPIO_PIN_RESET);
// 根据currentLedIndex决定哪个LED应该点亮
switch (currentLedIndex % 4) {
case 0: HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_SET); break;
case 1: HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_SET); break;
case 2: HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9, GPIO_PIN_SET); break;
case 3: HAL_GPIO_WritePin(GPIOB, GPIO_PIN_10, GPIO_PIN_SET); break;
}
currentLedIndex++; // 转向下一盏LED
while(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_RESET); // 等待按键松开
}
}
}
}
void SystemClock_Config(void) {}
static void MX_GPIO_Init(void) {
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
GPIO_InitTypeDef GPIO_InitStruct = {0};
// PA0作为按键输入
GPIO_InitStruct.Pin = GPIO_PIN_0;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_PULLUP;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
// PB7~PB10作为LED输出
GPIO_InitStruct.Pin = GPIO_PIN_7 | GPIO_PIN_8 | GPIO_PIN_9 | GPIO_PIN_10;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}
```
这段代码展示了如何利用STM32 HAL库管理多个LED灯的行为,同样遵循“一个点亮、其余熄灭”的原则[^5]。
---
###
阅读全文
相关推荐



















