如果是依次读取三个io口呢,根据每个io口电平来实现上述功能,该怎么写程序
时间: 2024-02-20 14:58:52 浏览: 71
如果需要依次读取三个 IO 口的电平,并根据每个 IO 口的电平来执行不同的操作,可以使用一个循环语句来实现。
下面是示例代码:
```c
#include "stm32f1xx_hal.h"
void operate_motor(void) {
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET); // 使步进电机开始运转
HAL_Delay(2000); // 等待2秒钟
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET); // 停止步进电机
}
void operate_light(void) {
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_SET); // 打开灯
HAL_Delay(5000); // 等待5秒钟
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_RESET); // 关闭灯
}
void operate_fan(void) {
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_SET); // 打开风扇
HAL_Delay(3000); // 等待3秒钟
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_RESET); // 关闭风扇
}
int main(void) {
HAL_Init(); // 初始化 HAL 库
__HAL_RCC_GPIOA_CLK_ENABLE(); // 使能 GPIOA 时钟
GPIO_InitTypeDef GPIO_InitStruct = {0};
// 配置 PA0, PA1, PA2 为输入模式
GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_PULLUP;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
// 配置 PA1, PA2, PA3 为输出模式
GPIO_InitStruct.Pin = GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
while (1) {
if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_RESET) { // 如果 IO 口0为低电平
operate_motor(); // 操作步进电机
} else if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_1) == GPIO_PIN_RESET) { // 如果 IO 口1为低电平
operate_light(); // 操作灯
} else if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_2) == GPIO_PIN_RESET) { // 如果 IO 口2为低电平
operate_fan(); // 操作风扇
}
}
}
```
在这个示例代码中,我们使用了一个 while 循环来依次读取三个 IO 口的电平,并根据每个 IO 口的电平来执行不同的操作。如果 IO 口0为低电平,就调用 `operate_motor()` 函数;如果 IO 口1为低电平,就调用 `operate_light()` 函数;如果 IO 口2为低电平,就调用 `operate_fan()` 函数。
阅读全文