在实验1实验测试代码上完成基础实验和扩展实验,然后给出代码
时间: 2024-12-22 08:11:51 浏览: 3
### 实验1 - 基础实验和扩展实验代码
#### 基础实验
**实验目的**:
1. 熟悉与 GPIO 相关的 GD32F30X 库函数。
2. 编写程序实现 LED1~LED8 的流水灯功能,流水时间间隔为 0.5 秒。
**实验代码**:
```c
#include "gd32f30x.h"
// 延时函数
void delay(uint32_t count) {
while (count--) {
__NOP();
}
}
// 初始化 GPIO
void gpio_init(void) {
// 使能 GPIO 时钟
rcu_periph_clock_enable(RCU_GPIOB);
rcu_periph_clock_enable(RCU_GPIOD);
// 配置 PB0-PB11 和 PD12-PD13 为推挽输出
gpio_init(GPIOB, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_8 | GPIO_PIN_9 | GPIO_PIN_10 | GPIO_PIN_11);
gpio_init(GPIOD, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_12 | GPIO_PIN_13);
// 初始化所有 LED 关闭
gpio_bit_reset(GPIOB, GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_8 | GPIO_PIN_9 | GPIO_PIN_10 | GPIO_PIN_11);
gpio_bit_reset(GPIOD, GPIO_PIN_12 | GPIO_PIN_13);
}
// 主函数
int main(void) {
// 初始化 GPIO
gpio_init();
while (1) {
// 流水灯效果
for (int i = 0; i < 8; i++) {
gpio_bit_set(GPIOB, 1 << i); // 打开第 i 个 LED
delay(500000); // 延时 0.5 秒
gpio_bit_reset(GPIOB, 1 << i); // 关闭第 i 个 LED
}
for (int i = 0; i < 2; i++) {
gpio_bit_set(GPIOD, 1 << (i + 12)); // 打开第 i+12 个 LED
delay(500000); // 延时 0.5 秒
gpio_bit_reset(GPIOD, 1 << (i + 12)); // 关闭第 i+12 个 LED
}
}
}
```
#### 扩展实验
**实验目的**:
1. 编写程序实现 SW17 按键控制流水灯的方向。
2. 编写程序实现 SW18 按键控制流水灯的流水时间在 0.1~1 秒之间数字调节,步进为 0.1 秒。
**实验代码**:
```c
#include "gd32f30x.h"
#define DELAY_1MS 100000
// 延时函数
void delay(uint32_t count) {
while (count--) {
__NOP();
}
}
// 初始化 GPIO
void gpio_init(void) {
// 使能 GPIO 时钟
rcu_periph_clock_enable(RCU_GPIOB);
rcu_periph_clock_enable(RCU_GPIOD);
rcu_periph_clock_enable(RCU_GPIOE);
rcu_periph_clock_enable(RCU_GPIOG);
// 配置 PB0-PB11 和 PD12-PD13 为推挽输出
gpio_init(GPIOB, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_8 | GPIO_PIN_9 | GPIO_PIN_10 | GPIO_PIN_11);
gpio_init(GPIOD, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_12 | GPIO_PIN_13);
// 配置按键 PE3 和 PE4 为输入
gpio_init(GPIOE, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_3 | GPIO_PIN_4);
// 初始化所有 LED 关闭
gpio_bit_reset(GPIOB, GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_8 | GPIO_PIN_9 | GPIO_PIN_10 | GPIO_PIN_11);
gpio_bit_reset(GPIOD, GPIO_PIN_12 | GPIO_PIN_13);
}
// 获取按键状态
uint8_t get_key_status(uint16_t pin) {
return gpio_input_bit_get(GPIOE, pin);
}
// 主函数
int main(void) {
// 初始化 GPIO
gpio_init();
uint8_t direction = 1; // 1 表示正方向,0 表示反方向
float delay_time = 0.5; // 默认延时时间为 0.5 秒
while (1) {
// 检查按键状态
if (!get_key_status(GPIO_PIN_3)) { // SW17 按键被按下
while (!get_key_status(GPIO_PIN_3)); // 等待按键释放
direction = !direction; // 改变方向
}
if (!get_key_status(GPIO_PIN_4)) { // SW18 按键被按下
while (!get_key_status(GPIO_PIN_4)); // 等待按键释放
delay_time += 0.1;
if (delay_time > 1.0) {
delay_time = 0.1;
}
}
// 流水灯效果
if (direction) {
for (int i = 0; i < 8; i++) {
gpio_bit_set(GPIOB, 1 << i); // 打开第 i 个 LED
delay((uint32_t)(delay_time * DELAY_1MS)); // 延时
gpio_bit_reset(GPIOB, 1 << i); // 关闭第 i 个 LED
}
for (int i = 0; i < 2; i++) {
gpio_bit_set(GPIOD, 1 << (i + 12)); // 打开第 i+12 个 LED
delay((uint32_t)(delay_time * DELAY_1MS)); // 延时
gpio_bit_reset(GPIOD, 1 << (i + 12)); // 关闭第 i+12 个 LED
}
} else {
for (int i = 7; i >= 0; i--) {
gpio_bit_set(GPIOB, 1 << i); // 打开第 i 个 LED
delay((uint32_t)(delay_time * DELAY_1MS)); // 延时
gpio_bit_reset(GPIOB, 1 << i); // 关闭第 i 个 LED
}
for (int i = 1; i >= 0; i--) {
gpio_bit_set(GPIOD, 1 << (i + 12)); // 打开第 i+12 个 LED
delay((uint32_t)(delay_time * DELAY_1MS)); // 延时
gpio_bit_reset(GPIOD, 1 << (i + 12)); // 关闭第 i+12 个 LED
}
}
}
}
```
### 总结
以上代码实现了基础实验和扩展实验的要求。基础实验实现了 LED1~LED8 的流水灯功能,每 0.5 秒切换一次。扩展实验增加了两个功能:SW17 按键可以改变流水灯的方向,SW18 按键可以在 0.1~1 秒之间调节流水灯的时间间隔。希望这些代码对你有所帮助!
阅读全文