写一个基于stm32f103cbt6的流水灯程序
时间: 2023-11-24 16:07:38 浏览: 65
好的,以下是基于stm32f103cbt6的流水灯程序:
首先,需要定义一些宏定义和全局变量:
```
#define LED_NUM 8 // 灯的数量
#define DELAY_TIME 500 // 延时时间,单位为毫秒
uint8_t ledStatus[LED_NUM] = {1, 0, 0, 0, 0, 0, 0, 0}; // 灯的状态,默认第一个灯亮,其它都是灭
```
接下来,需要初始化GPIO口,将相应的引脚设置为输出模式:
```
void LED_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); // 使能GPIOB时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15; // PB12~PB15
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 速度50MHz
GPIO_Init(GPIOB, &GPIO_InitStructure); // 初始化GPIOB
}
```
然后,需要编写流水灯程序的核心函数,也就是循环打开和关闭LED灯:
```
void LED_Loop(void)
{
uint8_t i = 0;
while (1)
{
for (i = 1; i < LED_NUM; i++)
{
ledStatus[i - 1] = 0; // 将上个灯的状态设为灭
ledStatus[i] = 1; // 将当前灯的状态设为亮
GPIO_Write(GPIOB, (uint16_t)((ledStatus[0] << 12) | (ledStatus[1] << 13) | (ledStatus[2] << 14) | (ledStatus[3] << 15))); // 更新LED灯的状态
Delay(DELAY_TIME); // 延时
}
ledStatus[LED_NUM - 1] = 0; // 关闭最后一个灯
ledStatus[0] = 1; // 打开第一个灯
GPIO_Write(GPIOB, (uint16_t)((ledStatus[0] << 12) | (ledStatus[1] << 13) | (ledStatus[2] << 14) | (ledStatus[3] << 15))); // 更新LED灯的状态
Delay(DELAY_TIME); // 延时
}
}
```
最后,需要在main函数中调用相应函数:
```
int main(void)
{
LED_GPIO_Config(); // 初始化GPIO口
LED_Loop(); // 执行流水灯程序
return 0;
}
```
希望能帮到你!
阅读全文