帮我写一段基于stm32单片机点亮led的c语言代码,要求:三个按键,第一个按键按下后5个led同时点亮,第二个按键,按下后5个led交替点亮,时间间隔为1秒,第三个按键,按下后5个led同时亮灭,间隔时间1秒
时间: 2023-09-27 14:11:55 浏览: 65
好的,以下是基于STM32单片机点亮LED的C语言代码,实现了三个按键的功能要求:
```c
#include "stm32f10x.h"
int main(void)
{
// 使能GPIOC时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
// 配置GPIOC的Pin13~17为输出模式
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15 | GPIO_Pin_16 | GPIO_Pin_17;
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);
// 配置GPIOA的Pin0~2为输入模式
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);
// 定义变量记录LED的状态
uint8_t led_state[5] = {0};
// 定义变量记录按键的状态
uint8_t button_state[3] = {1, 1, 1}; // 初始状态都为1表示没有按下
// 定义变量记录定时器的计数值
uint32_t timer_count = 0;
while(1)
{
// 检测按键的状态
for(int i = 0; i < 3; i++)
{
if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0 << i) == 0) // 按键按下
{
if(button_state[i] == 1) // 按键之前没有按下
{
button_state[i] = 0; // 记录按键已经按下
switch(i)
{
case 0: // 第一个按键按下
for(int j = 0; j < 5; j++)
{
led_state[j] = 1; // 点亮所有LED
}
GPIO_SetBits(GPIOC, GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15 | GPIO_Pin_16 | GPIO_Pin_17);
break;
case 1: // 第二个按键按下
for(int j = 0; j < 5; j++)
{
led_state[j] = 0; // 关闭所有LED
}
GPIO_ResetBits(GPIOC, GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15 | GPIO_Pin_16 | GPIO_Pin_17);
break;
case 2: // 第三个按键按下
for(int j = 0; j < 5; j++)
{
led_state[j] = !led_state[j]; // 反转所有LED的状态
}
break;
}
}
}
else // 按键没有按下
{
button_state[i] = 1; // 记录按键没有按下
}
}
// 第二个按键按下后,每隔1秒交替点亮LED
if(button_state[1] == 0 && timer_count % 1000 == 0)
{
for(int i = 0; i < 5; i++)
{
if(i % 2 == 0)
{
led_state[i] = 1;
}
else
{
led_state[i] = 0;
}
}
if(GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_13) == 1) // 如果LED13已经点亮
{
GPIO_ResetBits(GPIOC, GPIO_Pin_13 | GPIO_Pin_15 | GPIO_Pin_17); // 关闭LED13、15、17
GPIO_SetBits(GPIOC, GPIO_Pin_14 | GPIO_Pin_16); // 点亮LED14、16
}
else // 如果LED13已经关闭
{
GPIO_ResetBits(GPIOC, GPIO_Pin_14 | GPIO_Pin_16); // 关闭LED14、16
GPIO_SetBits(GPIOC, GPIO_Pin_13 | GPIO_Pin_15 | GPIO_Pin_17); // 点亮LED13、15、17
}
}
// 更新LED的状态
for(int i = 0; i < 5; i++)
{
if(led_state[i] == 1)
{
GPIO_SetBits(GPIOC, GPIO_Pin_13 << i);
}
else
{
GPIO_ResetBits(GPIOC, GPIO_Pin_13 << i);
}
}
// 延时1毫秒
for(int i = 0; i < 8000; i++); // 这里用一个简单的循环来模拟延时,实际应用中应该使用定时器
timer_count++;
}
}
```
需要注意的是,以上代码中使用了一个简单的循环来模拟延时,实际应用中应该使用定时器来实现。另外,如果需要使用其他的GPIO引脚来控制LED,需要修改对应的代码。
阅读全文