stm32f103编写按键控制八个流水灯
时间: 2023-09-21 21:09:36 浏览: 188
好的,以下是一个简单的按键控制八个流水灯的STM32F103程序:
```c
#include "stm32f10x.h"
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
// 打开GPIOC时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
// 配置PC0~PC7为输出
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
// 打开GPIOA时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
// 配置PA0为输入
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
int main(void)
{
GPIO_Configuration();
int8_t flag = 0;
uint32_t i = 0;
while (1)
{
if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == RESET)
{
flag = !flag; // 取反标志位
while (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == RESET); // 等待按键释放
}
if (flag)
{
GPIO_SetBits(GPIOC, GPIO_Pin_0 << i); // 点亮第i个LED
i = (i + 1) % 8; // 循环更新LED编号
GPIO_ResetBits(GPIOC, GPIO_Pin_0 << i); // 灭掉第i个LED
Delay(100000); // 延迟一定时间
}
}
}
void Delay(__IO uint32_t nCount)
{
while (nCount--)
;
}
```
在该程序中,我们首先定义了一个`GPIO_Configuration`函数,用于配置GPIO口。在该函数中,我们将PC0~PC7配置为输出,用于控制八个LED灯的亮灭;将PA0配置为输入,并且开启上拉,用于连接按键。
在`main`函数中,我们定义了一个标志位`flag`,用于标记是否需要流水灯的效果。当按下按键时,我们将`flag`取反,并等待按键释放。当`flag`为真时,我们使用`i`变量循环更新LED编号,点亮当前编号的LED,然后灭掉上一个编号的LED,最后延迟一定时间,实现流水灯效果。
最后,我们定义了一个简单的延迟函数`Delay`,用于延迟一定时间,以便肉眼观察到流水灯效果。
阅读全文