流水灯复位程序怎么设置

时间:2025-01-29 19:32:04 单机游戏

流水灯复位程序设置步骤如下:

定义必要的寄存器和变量

定义计时器(T1)和移位寄存器(SR1)。

设置GPIOF时钟使能。

设置GPIOF的管脚为开漏输出,电平为0。

初始化移位寄存器和计时器

将移位寄存器(SR1)复位为初始位置(第0位)。

设置计时器(T1)的时间延迟,以控制LED灯的亮灭时间。

主循环逻辑

在每个循环中,判断当前LED灯的位置。

将对应输出端口(如Q0)的状态设置为ON,其他输出端口状态设置为OFF。

启动计时器(T1)。

当计时器(T1)到达设定时间后,启动移位寄存器(SR1),将LED灯位置依次右移一位。

判断移位寄存器(SR1)是否已经到达最后一位(第3位),如果是,则将移位寄存器(SR1)复位为初始位置(第0位),否则继续下一位的判断。

复位操作

关闭水流指示器上的手动复位按钮。

找到水流指示器后方的复位弹簧,用力按下并保持几秒钟。

松开复位按钮,观察水流指示器是否恢复正常工作状态。

示例代码

```c

include

include

define RCC_BASE 0x40021000

define RCC_APB2ENR (RCC_BASE + 0x18)

define GPIOF_BASE 0x40011c00

define GPIOF_CHL (0x000 + GPIOF_BASE)

define GPIOF_CHR (0x004 + GPIOF_BASE)

define GPIOF_IDR (0x008 + GPIOF_BASE)

define GPIOF_ODR (0x00c + GPIOF_BASE)

define GPIOF_BSRR (0x010 + GPIOF_BASE)

define GPIOF_BRR (0x014 + GPIOF_BASE)

define GPIOF_LCKR (0x014 + GPIOF_BASE)

void delay(int num) {

int i, j;

for (i = 0; i < num; i++)

for (j = 0; j < 5000; j++);

}

int main(void) {

// 开启GPIOF时钟

*(unsigned int *)RCC_APB2ENR |= 1 << 7;

// 设置GPIOF的管脚为开漏输出,电平为0

*(unsigned int *)GPIOF_ODR &= ~(1 << 0);

*(unsigned int *)GPIOF_ODR &= ~(1 << 1);

*(unsigned int *)GPIOF_ODR &= ~(1 << 2);

*(unsigned int *)GPIOF_ODR &= ~(1 << 3);

// 初始化移位寄存器和计时器

uint8_t sr1 = 0;

uint16_t timer_delay = 1000; // 1秒延迟

while (1) {

// 判断当前LED灯的位置

if (sr1 == 0) {

// 将第1个输出端口(Q0)的状态设置为ON

*(unsigned int *)GPIOF_BSRR |= 1 << 0;

} else {

// 其他输出端口状态设置为OFF

*(unsigned int *)GPIOF_BSRR &= ~(1 << 0);

}

// 开始计时器(T1)

delay(timer_delay);

// 将LED灯位置依次右移一位

sr1 = (sr1 >> 1) | (1 << 3);

// 判断移位寄存器(SR1)是否已经到达最后一位

if (sr1 == 0b1111) {

// 将移位寄存器(SR1)复位为初始位置

sr1 = 0;

}

}

return 0;

}

```

建议