STM32通过按键控制LED灯示例

STM32F407ZE 通过按键控制LED灯示例,要求:
①按键按下 D1亮 按键松开 D1灭
②按键按下一次 D1亮 按键再按下一次 D1灭 ----(按键每按下一次D1实现翻转)

需要注意的是按键需用到延时消抖,延时时长按实际进行修改,检测按键按下与松开应该使用标志位等区分,如果只是通过读取按键返回值判断,在while循环里可能会对同一个LED灯多次操作。

#include <stm32f4xx.h>

void delay_ms(int ms)									//延时函数
{
    
    
	int i,j;
	for(i=0; i<ms; 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
	}
}

猜你喜欢

转载自blog.csdn.net/weixin_43793181/article/details/109030711