stm32f103c8t6按键流水灯代码
时间: 2023-08-24 12:06:07 浏览: 94
stm32f103c8t6代码
5星 · 资源好评率100%
以下是基于STM32F103C8T6的按键流水灯代码,使用Keil MDK开发环境。
首先要在Keil中配置好工程和芯片,然后创建一个C文件,命名为main.c。接下来,将以下代码复制到main.c文件中:
```c
#include "stm32f10x.h"
int main(void)
{
// 初始化GPIOB和GPIOC的时钟
RCC->APB2ENR |= RCC_APB2ENR_IOPBEN | RCC_APB2ENR_IOPCEN;
// 设置GPIOB.5、GPIOB.6和GPIOB.7为输出
GPIOB->CRL &= ~(GPIO_CRL_MODE5 | GPIO_CRL_MODE6 | GPIO_CRL_MODE7);
GPIOB->CRL |= (GPIO_CRL_MODE5_0 | GPIO_CRL_MODE6_0 | GPIO_CRL_MODE7_0);
GPIOB->CRL &= ~(GPIO_CRL_CNF5 | GPIO_CRL_CNF6 | GPIO_CRL_CNF7);
// 设置GPIOC.13为输入
GPIOC->CRH &= ~GPIO_CRH_MODE13;
GPIOC->CRH &= ~GPIO_CRH_CNF13;
// 定义变量,用于存储按键状态并初始化为未按下状态
uint8_t button_state = 0;
while(1)
{
// 检测按键状态
if(GPIOC->IDR & GPIO_IDR_IDR13)
{
// 按键未按下,将状态设置为未按下状态
button_state = 0;
}
else
{
// 按键已按下,将状态设置为已按下状态
button_state = 1;
}
// 流水灯效果
if(button_state == 1)
{
GPIOB->BSRR = GPIO_BSRR_BS5;
for(int i = 0; i < 100000; i++);
GPIOB->BSRR = GPIO_BSRR_BR5;
GPIOB->BSRR = GPIO_BSRR_BS6;
for(int i = 0; i < 100000; i++);
GPIOB->BSRR = GPIO_BSRR_BR6;
GPIOB->BSRR = GPIO_BSRR_BS7;
for(int i = 0; i < 100000; i++);
GPIOB->BSRR = GPIO_BSRR_BR7;
}
else
{
GPIOB->BSRR = GPIO_BSRR_BR5 | GPIO_BSRR_BR6 | GPIO_BSRR_BR7;
}
}
}
```
代码中使用了GPIOB.5、GPIOB.6和GPIOB.7作为LED灯的控制引脚,GPIOC.13作为按键引脚。
程序先初始化GPIOB和GPIOC的时钟,并将GPIOB.5、GPIOB.6和GPIOB.7设置为输出,GPIOC.13设置为输入。然后定义一个变量button_state,用于存储按键状态。
程序进入while循环后,先检测按键状态,如果按键未按下,则将button_state设置为未按下状态,否则将button_state设置为已按下状态。
接下来是流水灯效果,如果button_state为1,则依次点亮GPIOB.5、GPIOB.6和GPIOB.7,每个LED点亮100000个时钟周期后熄灭,然后再点亮下一个LED。如果button_state为0,则同时熄灭所有LED。
最后,程序会一直在while循环中运行,直到程序停止。
需要注意的是,为了使按键能正常工作,需要在开发板上连接一个上拉电阻或者使用内部上拉电阻。如果使用内部上拉电阻,需要在初始化GPIOC.13时将GPIOC.13的模式设置为输入上拉模式,代码如下:
```c
// 设置GPIOC.13为输入上拉模式
GPIOC->CRH &= ~GPIO_CRH_MODE13;
GPIOC->CRH &= ~GPIO_CRH_CNF13;
GPIOC->CRH |= GPIO_CRH_CNF13_0;
GPIOC->ODR |= GPIO_ODR_ODR13;
```
阅读全文