2023/4/20 21:34:55 用keil5写代码,写关于stm32最小系统板的代码,用stm32f10x.h的库函数,将三个led灯的引脚定义在gpioa的pin0,pin1,pin2,且输出为0时灯亮起,将两个按键的引脚定义在gpiob的pin1,pin11,三个led灯初始为不亮,当其中一个按键按下并松开后led灯进行流水灯,在任意时刻按下另一个按键并松开后流水灯方向与之前的方向相反 2023/4/20 21:35:50
时间: 2023-06-06 07:06:07 浏览: 102
自建keil标准空模板库函数型stm32f10x系列方便移植调试
这是一个技术问题,我可以回答。您可以使用以下代码实现:
#include "stm32f10x.h"
int main(void)
{
// 定义 LED 引脚
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
// 定义按键引脚
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
// 初始化三个 LED 灯为不亮
GPIO_SetBits(GPIOA, GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2);
// 流水灯程序
uint8_t LED_state = 0; // 当前 LED 亮的状态,初始为0代表都不亮
uint8_t dir = 1; // 流水灯的方向,初始为1代表从左往右
while (1)
{
if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1) == Bit_RESET)
{
// 如果检测到按键1被按下
while (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1) == Bit_RESET);
// 等待按键1松开
if (dir == 1)
{
// 如果当前从左往右,那么改为从右往左
dir = -1;
LED_state = 2; // 从第三个 LED 灯开始亮起
}
else
{
// 如果当前从右往左,那么改为从左往右
dir = 1;
LED_state = 0; // 从第一个 LED 灯开始亮起
}
}
if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_11) == Bit_RESET)
{
// 如果检测到按键2被按下
while (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_11) == Bit_RESET);
// 等待按键2松开
break; // 退出流水灯程序
}
// 改变三个 LED 灯的状态
if (dir == 1)
{
if (LED_state == 0)
{
GPIO_SetBits(GPIOA, GPIO_Pin_0);
GPIO_ResetBits(GPIOA, GPIO_Pin_1 | GPIO_Pin_2);
LED_state = 1;
}
else if (LED_state == 1)
{
GPIO_SetBits(GPIOA, GPIO_Pin_1);
GPIO_ResetBits(GPIOA, GPIO_Pin_0 | GPIO_Pin_2);
LED_state = 2;
}
else if (LED_state == 2)
{
GPIO_SetBits(GPIOA, GPIO_Pin_2);
GPIO_ResetBits(GPIOA, GPIO_Pin_0 | GPIO_Pin_1);
LED_state = 0;
}
}
else
{
if (LED_state == 0)
{
GPIO_SetBits(GPIOA, GPIO_Pin_2);
GPIO_ResetBits(GPIOA, GPIO_Pin_1 | GPIO_Pin_0);
LED_state = 1;
}
else if (LED_state == 1)
{
GPIO_SetBits(GPIOA, GPIO_Pin_1);
GPIO_ResetBits(GPIOA, GPIO_Pin_2 | GPIO_Pin_0);
LED_state = 2;
}
else if (LED_state == 2)
{
GPIO_SetBits(GPIOA, GPIO_Pin_0);
GPIO_ResetBits(GPIOA, GPIO_Pin_2 | GPIO_Pin_1);
LED_state = 0;
}
}
for (int i = 0; i < 100000; i++);
// 稍微延迟一下,让人类眼睛有时间感知到流水灯的变化
}
return 0;
}
阅读全文