#c8t6按键控制LED亮灭
#求助
不知道代码哪里出了问题,灯能正常亮和灭,按键耶用万用表测过了,按键有电压,按下后电压为零,但是用程序控制不了LED。实在是不知道是哪里出了问题,求帮帮忙!
贴上完整的代码,帮你看KEY_Scan函数应该设计有问题
以下是stm32f030c8t6用三个按键控制分别控制三个LED亮灭,已经注释,有问题问我。
#include "stm32f0xx.h"
#define LED1_PIN GPIO_Pin_0 // LED1在PB0引脚上
#define LED2_PIN GPIO_Pin_1 // LED2在PB1引脚上
#define LED3_PIN GPIO_Pin_2 // LED3在PB2引脚上
#define BUTTON1_PIN GPIO_Pin_3 // 按钮1在PB3引脚上
#define BUTTON2_PIN GPIO_Pin_4 // 按钮2在PB4引脚上
#define BUTTON3_PIN GPIO_Pin_5 // 按钮3在PB5引脚上
void GPIO_Config(void);
void Delay(__IO uint32_t nCount);
int main(void)
{
GPIO_Config(); // 初始化GPIO引脚
while (1)
{
if (GPIO_ReadInputDataBit(GPIOB, BUTTON1_PIN) == 0) // 如果按钮1按下
{
GPIO_SetBits(GPIOB, LED1_PIN); // 点亮LED1
}
else
{
GPIO_ResetBits(GPIOB, LED1_PIN); // 熄灭LED1
}
if (GPIO_ReadInputDataBit(GPIOB, BUTTON2_PIN) == 0) // 如果按钮2按下
{
GPIO_SetBits(GPIOB, LED2_PIN); // 点亮LED2
}
else
{
GPIO_ResetBits(GPIOB, LED2_PIN); // 熄灭LED2
}
if (GPIO_ReadInputDataBit(GPIOB, BUTTON3_PIN) == 0) // 如果按钮3按下
{
GPIO_SetBits(GPIOB, LED3_PIN); // 点亮LED3
}
else
{
GPIO_ResetBits(GPIOB, LED3_PIN); // 熄灭LED3
}
Delay(100000); // 稍作延迟
}
}
void GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE); // 使能GPIOB时钟
GPIO_InitStructure.GPIO_Pin = LED1_PIN | LED2_PIN | LED3_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; // 输出模式
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; // 推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_Level_1; // 输出速度为10MHz
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; // 无上下拉
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = BUTTON1_PIN | BUTTON2_PIN | BUTTON3_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; // 输入模式
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; // 上拉输入
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
void Delay(__IO uint32_t nCount)
{
while(nCount--)
{
}
}
在这个程序中,我们使用了GPIO_Config()函数来初始化GPIO引脚,使LED引脚为输出模式,按键引脚为上拉输入模式。接下来,我们在主函数main()中不断地读取按钮状态,并根据按钮状态控制相应的LED灯亮灭。上拉输入模式。接下来,我们在主函数main()中不断地读取按钮状态,并根据按钮状态控制相应的LED灯亮灭。
如果按钮被按下,GPIO_ReadInputDataBit()函数会返回0,此时我们调用GPIO_SetBits()函数点亮相应的LED灯;如果按钮没有被按下,GPIO_ReadInputDataBit()函数会返回1,此时我们调用GPIO_ResetBits()函数熄灭相应的LED灯。
最后,我们在Delay()函数中添加一个稍作延迟的循环,以防止程序过于频繁地读取按钮状态和改变LED灯状态。
需要注意的是,在这个程序中,我们使用了GPIOB端口来连接三个LED和三个按钮,且使用了RCC_AHBPeriph_GPIOB来使能GPIOB端口的时钟,因此需要在程序开头添加stm32f0xx.h头文件,以便使用相关的宏定义和函数。同时,需要根据实际连接方式调整LED和按钮引脚的宏定义。