(1)电路中包含 16 个 LED 灯,接在 STM32 的任何 GPIO 口,分别命名为 D1、D2、……D16,D1~D16 排 成一竖排; (2)电路中还包含两个开关 K1 和 K2,接在另一个 GPIO 口,在 Proteus 软件中画出仿真电路图; (3
时间: 2024-04-02 15:32:44 浏览: 22
)可以使用 STM32 的任何 GPIO 口来控制 LED 灯的亮灭和开关 K1 和 K2 的打开和关闭。在 Proteus 软件中,可以通过添加 Microcontroller 模块来模拟 STM32,然后添加 LED 和 Switch 模块模拟 LED 灯和开关。连接它们的引脚,然后通过编写程序来控制它们的亮灭和开关。在程序中使用 GPIO 库来设置引脚的输入/输出状态,从而控制 LED 灯和开关的状态。在仿真过程中,可以通过模拟输入来测试程序的正确性。
相关问题
(1)电路中包含 16 个 LED 灯,接在 STM32 的任何 GPIO 口,分别命名为 D1、D2、……D16,D1~D16 排 成一竖排; (2)电路中还包含两个开关 K1 和 K2,接在另一个 GPIO 口,在 Proteus 软件中画出仿真电路图; (3)起始 16 个 LED 灯都灭,K1 和 K2 无效时,LED 灯不变化,每次点亮或熄灭的时间为 0.5s; (4)单独 K1 控制规律 1:从上至下挨个点亮的规律为:D1→D2→D3→......→D14→D15→D16,自动循环; (5)单
独 K2 控制规律 2:从下至上挨个点亮的规律为:D16→D15→D14→......→D3→D2→D1,自动循环;
以下是电路图和 STM32 代码:
![image.png](attachment:image.png)
```c
#include "main.h"
void delay(int time) // 延时函数
{
int i, j;
for (i = 0; i < time; i++)
for (j = 0; j < 1000; j++);
}
int main(void)
{
HAL_Init();
__HAL_RCC_GPIOA_CLK_ENABLE(); // 使能 GPIOA 时钟
__HAL_RCC_GPIOB_CLK_ENABLE(); // 使能 GPIOB 时钟
GPIO_InitTypeDef GPIO_InitStruct = { 0 };
GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_1; // K1 和 K2 连接的 GPIO 引脚
GPIO_InitStruct.Mode = GPIO_MODE_INPUT; // 输入模式
GPIO_InitStruct.Pull = GPIO_NOPULL; // 不打开上拉或下拉
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
GPIO_InitStruct.Pin = 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_PIN_12 | GPIO_PIN_13 | GPIO_PIN_14 | GPIO_PIN_15; // D1~D16 连接的 GPIO 引脚
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; // 推挽输出模式
GPIO_InitStruct.Pull = GPIO_NOPULL; // 不打开上拉或下拉
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
int i = 0, j = 0; // i、j 分别表示 D1~D16 灯的编号和亮灯状态
while (1)
{
if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_RESET) // K1 按下
{
for (i = 0; i < 16; i++) // 按顺序点亮 D1~D16 灯
{
j = 1 << i; // 1 左移 i 位,得到二进制数的第 i 位是 1,其它位都是 0
HAL_GPIO_WritePin(GPIOB, 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_PIN_12 | GPIO_PIN_13 | GPIO_PIN_14 | GPIO_PIN_15 | GPIO_PIN_16, j); // 根据二进制数点亮对应的灯
delay(500); // 延时 500ms
}
}
else if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_1) == GPIO_PIN_RESET) // K2 按下
{
for (i = 15; i >= 0; i--) // 按顺序点亮 D16~D1 灯
{
j = 1 << i; // 1 左移 i 位,得到二进制数的第 i 位是 1,其它位都是 0
HAL_GPIO_WritePin(GPIOB, 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_PIN_12 | GPIO_PIN_13 | GPIO_PIN_14 | GPIO_PIN_15 | GPIO_PIN_16, j); // 根据二进制数点亮对应的灯
delay(500); // 延时 500ms
}
}
else // K1 和 K2 都没有被按下
{
HAL_GPIO_WritePin(GPIOB, 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_PIN_12 | GPIO_PIN_13 | GPIO_PIN_14 | GPIO_PIN_15 | GPIO_PIN_16, GPIO_PIN_RESET); // 关闭所有灯
}
}
}
```
阅读全文
相关推荐
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![pdf](https://img-home.csdnimg.cn/images/20241231044930.png)
![rar](https://img-home.csdnimg.cn/images/20241231044955.png)
![rar](https://img-home.csdnimg.cn/images/20241231044955.png)
![rar](https://img-home.csdnimg.cn/images/20241231044955.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![rar](https://img-home.csdnimg.cn/images/20241231044955.png)
![rar](https://img-home.csdnimg.cn/images/20241231044955.png)
![rar](https://img-home.csdnimg.cn/images/20241231044955.png)
![rar](https://img-home.csdnimg.cn/images/20241231044955.png)
![rar](https://img-home.csdnimg.cn/images/20241231044955.png)
![rar](https://img-home.csdnimg.cn/images/20241231044955.png)
![rar](https://img-home.csdnimg.cn/images/20241231044955.png)