STM32按键控制正反流水
时间: 2023-08-18 10:04:00 浏览: 306
以下是一个 STM32 按键控制正反流水灯的代码:
```c
#include "stm32f10x.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"
GPIO_InitTypeDef GPIO_InitStructure;
int main(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能 GPIOA 时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3; //选择GPIOA的引脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //时钟速度为50MHz
GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化GPIOA
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); //使能 GPIOC 时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //选择GPIOC的引脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //上拉输入
GPIO_Init(GPIOC, &GPIO_InitStructure); //初始化GPIOC
int direction = 1; //正反流水方向,默认为正向
int delay = 500000; //延时时间,默认为500000个时钟周期
while(1)
{
if(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_0) == 0) //判断按键是否按下
{
direction = !direction; //改变流水方向
for(int i=0; i<200000; i++); //短暂延时
}
if(direction == 1) //正向流动
{
GPIO_SetBits(GPIOA, GPIO_Pin_0); //点亮第一个LED灯
GPIO_ResetBits(GPIOA, GPIO_Pin_3); //熄灭最后一个LED灯
for(int i=0; i<3; i++)
{
GPIO_SetBits(GPIOA, GPIO_Pin_1 << i); //依次点亮其他LED灯
GPIO_ResetBits(GPIOA, GPIO_Pin_0 << i); //依次熄灭前面的LED灯
for(int j=0; j<delay; j++); //延时一段时间
}
GPIO_ResetBits(GPIOA, GPIO_Pin_2); //熄灭倒数第二个LED灯
GPIO_SetBits(GPIOA, GPIO_Pin_0); //点亮第一个LED灯
for(int i=2; i>=0; i--)
{
GPIO_SetBits(GPIOA, GPIO_Pin_1 << i); //依次点亮其他LED灯
GPIO_ResetBits(GPIOA, GPIO_Pin_2 << i); //依次熄灭后面的LED灯
for(int j=0; j<delay; j++); //延时一段时间
}
}
else //反向流动
{
GPIO_SetBits(GPIOA, GPIO_Pin_2); //点亮倒数第二个LED灯
GPIO_ResetBits(GPIOA, GPIO_Pin_0); //熄灭第一个LED灯
for(int i=0; i<3; i++)
{
GPIO_SetBits(GPIOA, GPIO_Pin_2 << i); //依次点亮前面的LED灯
GPIO_ResetBits(GPIOA, GPIO_Pin_3 >> i); //依次熄灭后面的LED灯
for(int j=0; j<delay; j++); //延时一段时间
}
GPIO_ResetBits(GPIOA, GPIO_Pin_1); //熄灭倒数第一个LED灯
GPIO_SetBits(GPIOA, GPIO_Pin_2); //点亮倒数第二个LED灯
for(int i=2; i>=0; i--)
{
GPIO_SetBits(GPIOA, GPIO_Pin_2 << i); //依次点亮前面的LED灯
GPIO_ResetBits(GPIOA, GPIO_Pin_1 >> i); //依次熄灭后面的LED灯
for(int j=0; j<delay; j++); //延时一段时间
}
}
}
}
```
这段代码的作用是通过按键控制正反流水灯。在每次循环中,首先判断按键是否按下,如果按下则改变流水方向。接着根据流水方向点亮对应的LED灯,依次点亮其他LED灯,再熄灭前面或后面的LED灯,实现正反流水灯效果。延时时间可以根据需要进行调整。
阅读全文