STM32入坑(五)按键控制LED小灯

简介

名称:按键控制LED小灯
功能:KEY0控制LED小灯,按键按一次灯亮,再按一次灯灭
硬件资源:STM32开发板、(按键、LED灯)

按键原理

STM32入坑(五)按键控制LED小灯_第1张图片
如图,当配置按键KEY0为上拉输入,扫描按键的状态时,为高电平。当我们手动按下按键KEY0时,按键和GND接通,再扫描按键KEY0时则为低电平。上述就是按键的原理,如果扫描到按键对应端口为低电平,则表示按键按下。(当然按键如果接高电平则应配置按键模式为下拉输入)

GPIO口的操作说明

1.读取IO口输入电平的库函数:
GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_15) //读取A15引脚

2.读取IO口输入电平的位带操作:
PAin(15) //读取A15引脚

配置及方法

1. 配置按键端口
注:引脚需配置为上/下拉输入

void KEY_Init(void)
{
	/*****     配置PA15    *****/
	GPIO_InitTypeDef GPIO_InitStruct;
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IPU;//上拉
	GPIO_InitStruct.GPIO_Pin=GPIO_Pin_15;
	GPIO_InitStruct.GPIO_Speed=GPIO_Speed_10MHz;	
	GPIO_Init(GPIOA,&GPIO_InitStruct);
	GPIO_SetBits(GPIOA,GPIO_Pin_15);
}

2.编写按键扫描函数

//mode为是否支持连按
//0:不支持连按;  1:支持连按
u8 KEY_Scan(u8 mode)
{
	static u8 key_up=1;//按键松开标志
	if(mode)key_up=1;  //支持连按
	if(key_up&&(KEY1==0))
	{
		delay_ms(10);  //去抖
		key_up = 0;
		if(KEY1==0)return KEY1_PRES;
	}else if(KEY1==1)key_up=1;
	return 0;  //无按键按下
}

3.主函数初始化LED,delay和KEY

	delay_init();
	LED_Init();
	KEY_Init();

4.在while中扫描按键,如果KEY0按键按下,LED状态翻转

	while(1)
	{
		key = KEY_Scan(0);//不支持连续按得到按键值
		if(key)
		{
			switch(key)
			{
				case KEY1_PRES:LED=!LED;break;
				default:
				delay_ms(100);
			}
		}
	}

注意事项

  1. 按键扫描函数中必须有个delay_us(10),用于消抖,滤除干扰信号。
  2. 扫描函数中,原子哥配备了一个参数mode,用于支持连按和不连按。大家根据需求选择。

程序已经过调试验证,key0按键和LED灯工作正常

完整代码传送门:
//download.csdn.net/download/m0_46195580/12504210

你可能感兴趣的:(单片机)