(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)单
时间: 2024-03-21 18:40:36 浏览: 62
独 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); // 关闭所有灯
}
}
}
```
阅读全文