C8T6超绝模块--按键检测点亮LED

C8T6超绝模块–按键检测点亮LED

大纲

  1. 按键原理
  2. 初始化LED
  3. 初始化按键
  4. 编写main

具体案例

按键原理

C8T6超绝模块--按键检测点亮LED_第1张图片
(这里针对的是我的板子的原理图,具体的查看自己的板子)注意看,这里按键一端接到的是地,当我们没按下按键时,其默认是低电压,当我们按下按键时,电路连通时,这是高电平

初始化LED

具体在我的上一篇博客C8T6超绝模块–LED里面有具体的阐述,这里就不一一介绍了

初始化按键

当然,大概流程还是得先打开时钟,完成GPIO配置,我这里的按键K0外接在PA0上,所以要对GPIOA的Pin0引脚进行初始化配置

初始化按键的GPIO

void KEY_GPIO_Config(void)
{
	GPIO_InitTypeDef			GPIO_InitStruct;
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);// 打开对应的时钟
	// 配置GPIO
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;
	
	GPIO_Init(GPIOA,&GPIO_InitStruct);
}

这里就是正常的配置GPIO

下面是按键的电压扫描函数
本质上就是读取按键相连的那个GPIO的电压,然后根据高低电压对其进行处理
这里要注意的一点,有些板子在这里外接了一个电容器,当我们按下键位时,可以通过电容的充放电来实现硬件消抖,而如果没有外接电容器,当我们按下按键时,就会产生波纹抖动(高低电压变化不是一蹴而就的),导致按键没有达到我们预期的效果,我们要使用软件消抖(通过延时来判断电压,保证我们按下按键时,电压是处于稳定状态的)

#define KEY_ON			1
#define KEY_OFF			0

 uint8_t Key_Scan(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)
{
	/*检测是否有按键按下 */
   	if(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == KEY_ON ) 
	  {	   
	 	 /*延时消抖*/
	  	Delay(50000);		
	   		if(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == KEY_ON )  
					{	 
						/*等待按键释放 */
						while(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == KEY_ON);   
			 			return 	KEY_ON;	 
					}
			else
					return KEY_OFF;
		}
	else
		return KEY_OFF;
}

这里通过库函数 GPIO_ReadInputDataBit 来读取指定端口的指定引脚的电压,然后通过延时函数进行延时,再读取此刻的电压(因为经过延时之后的电压是处于稳定的,如果此时按键还是按下了,就继续执行后面的代码),此时按键是按下的,我们用while循环让其一直卡在按键按下时,当按键松开时,最后返回真值,否者直接返回按键没按下

第一个检测按键是否按下,如果按下了,我们通过延时判断是不是稳定的(否则就是抖动或误触),如果按键是真的按下,我们一直卡住按键按下,当按键松开时,循环结束,返回按键按下的真值

main函数

int main(void)
{
	LED_GPIO_Config();
	
	KEY_GPIO_Config();
	while(1)
{
		if(Key_Scan(KEY_GPIO_PORT,KEY_GPIO_PIN) == KEY_ON)
			{
				LED_G_TOGGLE;
				
		}
		
}

初始化LED,再初始化按键,然后死循环一直读取按键的电压,当按键按下时,就反转小灯此时的状态

你可能感兴趣的:(STM32模块示例代码,stm32,单片机)