STM32F407ZE 通过按键控制LED灯示例,要求:
①按键按下 D1亮 按键松开 D1灭
②按键按下一次 D1亮 按键再按下一次 D1灭 ----(按键每按下一次D1实现翻转)
需要注意的是按键需用到延时消抖,延时时长按实际进行修改,检测按键按下与松开应该使用标志位等区分,如果只是通过读取按键返回值判断,在while循环里可能会对同一个LED灯多次操作。
#include
void delay_ms(int ms) //延时函数
{
int i,j;
for(i=0; i
for(j=0; j<10000;j++);
}
void LED_Init()
{
GPIO_InitTypeDef led1,led2;
//先开启对应用到的模块时钟节拍
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF,ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE,ENABLE);
//初始化LED1、LED2、蜂鸣器
led1.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_8;
led1.GPIO_Mode = GPIO_Mode_OUT;
led1.GPIO_Speed = GPIO_Fast_Speed;
led1.GPIO_OType = GPIO_OType_PP;
led1.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOF,&led1);
//初始化LED3、LED4
led2.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14;
led2.GPIO_Mode = GPIO_Mode_OUT;
led2.GPIO_Speed = GPIO_Fast_Speed;
led2.GPIO_OType = GPIO_OType_PP;
led2.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOE,&led2);
//所有LED灯置高电平(熄灯)
GPIO_ToggleBits(GPIOF,GPIO_Pin_9);
GPIO_ToggleBits(GPIOF,GPIO_Pin_10);
GPIO_ToggleBits(GPIOE,GPIO_Pin_13);
GPIO_ToggleBits(GPIOE,GPIO_Pin_14);
}
void KEY_Init()
{
GPIO_InitTypeDef KEY1,KEY2;
//先开启对应用到的模块时钟节拍
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE,ENABLE);
//初始化KEY1
KEY1.GPIO_Pin = GPIO_Pin_0 ;
KEY1.GPIO_Mode = GPIO_Mode_IN;
KEY1.GPIO_Speed = GPIO_Fast_Speed;
KEY1.GPIO_OType = GPIO_OType_PP;
KEY1.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOA,&KEY1);
//初始化KEY2、KEY3、KEY4
KEY2.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4;
KEY2.GPIO_Mode = GPIO_Mode_IN;
KEY2.GPIO_Speed = GPIO_Fast_Speed;
KEY2.GPIO_OType = GPIO_OType_PP;
KEY2.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOE,&KEY2);
}
int main()
{
LED_Init();
KEY_Init();
int key1 = 1;
int key2 = 1;
int key3 = 1;
int key4 = 1;
while(1)
{
if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0) == 0) //判断KEY1是否被按下
{
delay_ms(50); //延时消抖
if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0) == 0) //判断KEY1是否被按下
{
if(key1) //标志位
{
key1 = 0; //标志位置0
GPIO_ToggleBits(GPIOF,GPIO_Pin_9); //点亮D1
GPIO_ToggleBits(GPIOF,GPIO_Pin_8); //按键提示音(开)
delay_ms(5);
GPIO_ToggleBits(GPIOF,GPIO_Pin_8); //按键提示音(关)
}
}
}
if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0) == 1) //判断KEY1是否被松开
key1 = 1; //标志位置1
if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2) == 0) //判断KEY2是否被按下
{
GPIO_ToggleBits(GPIOF,GPIO_Pin_10); //点亮D2
GPIO_ToggleBits(GPIOF,GPIO_Pin_10); //熄灭D1
if(key2) //标志位
{
key2 = 0; //标志位置0
GPIO_ToggleBits(GPIOF,GPIO_Pin_8); //按键提示音(开)
delay_ms(5);
GPIO_ToggleBits(GPIOF,GPIO_Pin_8); //按键提示音(关)
}
}
if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2) == 1) //判断KEY2是否被松开
key2 = 1; //标志位置1
if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3) == 0) //判断KEY3是否被按下
{
delay_ms(50); //延时消抖
if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3) == 0) //判断KEY3是否被按下
{
if(key3) //标志位
{
key3 = 0; //标志位置0
GPIO_ToggleBits(GPIOE,GPIO_Pin_13); //点亮D3
GPIO_ToggleBits(GPIOF,GPIO_Pin_8); //按键提示音(开)
delay_ms(5);
GPIO_ToggleBits(GPIOF,GPIO_Pin_8); //按键提示音(关)
}
}
}
if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3) == 1) //判断KEY3是否被松开
key3 = 1; //标志位置1
if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_4) == 0) //判断KEY4是否被按下
{
GPIO_ToggleBits(GPIOE,GPIO_Pin_14); //点亮D4
GPIO_ToggleBits(GPIOE,GPIO_Pin_14); //熄灭D4
if(key4) //标志位
{
key4 = 0; //标志位置0
GPIO_ToggleBits(GPIOF,GPIO_Pin_8); //按键提示音(开)
delay_ms(5);
GPIO_ToggleBits(GPIOF,GPIO_Pin_8); //按键提示音(关)
}
}
if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_4) == 1) //判断KEY4是否被松开
key4 = 1; //标志位置1
}
}
STM32F407ZE 通过按键控制LED灯示例,要求:
①按键按下 D1亮 按键松开 D1灭
②按键按下一次 D1亮 按键再按下一次 D1灭 ----(按键每按下一次D1实现翻转)
需要注意的是按键需用到延时消抖,延时时长按实际进行修改,检测按键按下与松开应该使用标志位等区分,如果只是通过读取按键返回值判断,在while循环里可能会对同一个LED灯多次操作。
#include
void delay_ms(int ms) //延时函数
{
int i,j;
for(i=0; i
for(j=0; j<10000;j++);
}
void LED_Init()
{
GPIO_InitTypeDef led1,led2;
//先开启对应用到的模块时钟节拍
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF,ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE,ENABLE);
//初始化LED1、LED2、蜂鸣器
led1.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_8;
led1.GPIO_Mode = GPIO_Mode_OUT;
led1.GPIO_Speed = GPIO_Fast_Speed;
led1.GPIO_OType = GPIO_OType_PP;
led1.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOF,&led1);
//初始化LED3、LED4
led2.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14;
led2.GPIO_Mode = GPIO_Mode_OUT;
led2.GPIO_Speed = GPIO_Fast_Speed;
led2.GPIO_OType = GPIO_OType_PP;
led2.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOE,&led2);
//所有LED灯置高电平(熄灯)
GPIO_ToggleBits(GPIOF,GPIO_Pin_9);
GPIO_ToggleBits(GPIOF,GPIO_Pin_10);
GPIO_ToggleBits(GPIOE,GPIO_Pin_13);
GPIO_ToggleBits(GPIOE,GPIO_Pin_14);
}
void KEY_Init()
{
GPIO_InitTypeDef KEY1,KEY2;
//先开启对应用到的模块时钟节拍
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE,ENABLE);
//初始化KEY1
KEY1.GPIO_Pin = GPIO_Pin_0 ;
KEY1.GPIO_Mode = GPIO_Mode_IN;
KEY1.GPIO_Speed = GPIO_Fast_Speed;
KEY1.GPIO_OType = GPIO_OType_PP;
KEY1.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOA,&KEY1);
//初始化KEY2、KEY3、KEY4
KEY2.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4;
KEY2.GPIO_Mode = GPIO_Mode_IN;
KEY2.GPIO_Speed = GPIO_Fast_Speed;
KEY2.GPIO_OType = GPIO_OType_PP;
KEY2.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOE,&KEY2);
}
int main()
{
LED_Init();
KEY_Init();
int key1 = 1;
int key2 = 1;
int key3 = 1;
int key4 = 1;
while(1)
{
if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0) == 0) //判断KEY1是否被按下
{
delay_ms(50); //延时消抖
if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0) == 0) //判断KEY1是否被按下
{
if(key1) //标志位
{
key1 = 0; //标志位置0
GPIO_ToggleBits(GPIOF,GPIO_Pin_9); //点亮D1
GPIO_ToggleBits(GPIOF,GPIO_Pin_8); //按键提示音(开)
delay_ms(5);
GPIO_ToggleBits(GPIOF,GPIO_Pin_8); //按键提示音(关)
}
}
}
if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0) == 1) //判断KEY1是否被松开
key1 = 1; //标志位置1
if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2) == 0) //判断KEY2是否被按下
{
GPIO_ToggleBits(GPIOF,GPIO_Pin_10); //点亮D2
GPIO_ToggleBits(GPIOF,GPIO_Pin_10); //熄灭D1
if(key2) //标志位
{
key2 = 0; //标志位置0
GPIO_ToggleBits(GPIOF,GPIO_Pin_8); //按键提示音(开)
delay_ms(5);
GPIO_ToggleBits(GPIOF,GPIO_Pin_8); //按键提示音(关)
}
}
if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2) == 1) //判断KEY2是否被松开
key2 = 1; //标志位置1
if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3) == 0) //判断KEY3是否被按下
{
delay_ms(50); //延时消抖
if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3) == 0) //判断KEY3是否被按下
{
if(key3) //标志位
{
key3 = 0; //标志位置0
GPIO_ToggleBits(GPIOE,GPIO_Pin_13); //点亮D3
GPIO_ToggleBits(GPIOF,GPIO_Pin_8); //按键提示音(开)
delay_ms(5);
GPIO_ToggleBits(GPIOF,GPIO_Pin_8); //按键提示音(关)
}
}
}
if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3) == 1) //判断KEY3是否被松开
key3 = 1; //标志位置1
if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_4) == 0) //判断KEY4是否被按下
{
GPIO_ToggleBits(GPIOE,GPIO_Pin_14); //点亮D4
GPIO_ToggleBits(GPIOE,GPIO_Pin_14); //熄灭D4
if(key4) //标志位
{
key4 = 0; //标志位置0
GPIO_ToggleBits(GPIOF,GPIO_Pin_8); //按键提示音(开)
delay_ms(5);
GPIO_ToggleBits(GPIOF,GPIO_Pin_8); //按键提示音(关)
}
}
if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_4) == 1) //判断KEY4是否被松开
key4 = 1; //标志位置1
}
}
举报