<STM32学习>按键控制和外部中断控制按键
·
前言
<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的占用率和损耗
更多推荐





所有评论(0)