文章目录


前言

<stm32江协议科技> &&keysking


一、按键的原理

1.按键硬件方面的处理:通过电容来进行消抖

2.若没有硬件方面处理,通过软件来进行硬件消抖

二、按键控制LED灯

1.不用中断控制按键

代码如下(示例):

main.c   key.c

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "LED.h"
#include "Key.h"

uint8_t KeyNum;

int main(void)
{
	LED_Init();
	Key_Init();
	
	while (1)
	{
		KeyNum = Key_GetNum();
		if (KeyNum == 1)
		{
			LED1_Turn();
		}
		if (KeyNum == 2)
		{
			LED2_Turn();
		}
	}
}
#include "stm32f10x.h"                  // Device header
#include "Delay.h"

void Key_Init(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_11;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB, &GPIO_InitStructure);
}

uint8_t Key_GetNum(void)
{
	uint8_t KeyNum = 0;
	if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1) == 0)
	{
		Delay_ms(20);
		while (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1) == 0);
		Delay_ms(20);
		KeyNum = 1;
	}
	if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_11) == 0)
	{
		Delay_ms(20);
		while (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_11) == 0);
		Delay_ms(20);
		KeyNum = 2;
	}
	
	return KeyNum;
}

2.用中断控制按键

代码如下(示例):

main.c     key.c

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "LED.h"
#include "Key.h"

uint8_t KeyNum;

int main(void)
{
	LED_Init();
	Key_Init();
	
	while (1)
	{
		
		
	}
}
void EXTI0_IRQHandler(void)
{
    if(EXTI_GetITStatus(EXTI_Line0) == SET)  
    {
     
        if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_0) == 0)
        {
              Delay_ms(20);
            LED1_Turn();   
            while(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_0) == 0);
            Delay_ms(20);        
    }
		EXTI_ClearITPendingBit(EXTI_Line0);  
}
	}
#include "stm32f10x.h"                  // Device header
#include "Delay.h"

void Key_Init(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB, &GPIO_InitStructure);
	
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource0);
	
	EXTI_InitTypeDef  exti_structure;
	 exti_structure.EXTI_Line= EXTI_Line0;
	 exti_structure.EXTI_LineCmd=ENABLE;
	 exti_structure.EXTI_Mode=EXTI_Mode_Interrupt;
	 exti_structure.EXTI_Trigger=EXTI_Trigger_Falling;
	EXTI_Init(&exti_structure);
	
	NVIC_InitTypeDef nvic_structure;
	nvic_structure.NVIC_IRQChannel=EXTI0_IRQn;
	nvic_structure.NVIC_IRQChannelCmd=ENABLE;
	nvic_structure.NVIC_IRQChannelPreemptionPriority=1;
	nvic_structure.NVIC_IRQChannelSubPriority=1;
	NVIC_Init(&nvic_structure);
	
}

总结

普通按键控制,简洁明了,在函数内实现按键消抖,使用轮询扫描,降低了CPU的效率

中断控制按键,在中断内实现按键消抖,降低了CPU的占用率和损耗

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐