【蓝桥杯】KEY(基础板上的四个按键)

这四个按键有两种方法驱动:

  • 循环扫描
  • 外部中断

建议使用外部中断。

KEY的硬件连接

【蓝桥杯】KEY(基础板上的四个按键)_第1张图片

KEY STM32
KEY1 PA0
KEY2 PA8
KEY3 PB1
KEY4 PB2
KEY软件驱动

key.c

#include "key.h"
#include "stm32f10x_it.h"
#include "led.h"

void KEY_Init(void)
{
	EXTI_InitTypeDef   EXTI_InitStructure;
	GPIO_InitTypeDef   GPIO_InitStructure;
	NVIC_InitTypeDef   NVIC_InitStructure;

	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB, ENABLE);

	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_8;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
	GPIO_Init(GPIOA, &GPIO_InitStructure);

	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1|GPIO_Pin_2;
	GPIO_Init(GPIOA, &GPIO_InitStructure);

	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
	//PA0
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);

	EXTI_InitStructure.EXTI_Line = EXTI_Line0;
	EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
	EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;  
	EXTI_InitStructure.EXTI_LineCmd = ENABLE;
	EXTI_Init(&EXTI_InitStructure);

	NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&NVIC_InitStructure);
	//PA8
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource8);
	
	EXTI_InitStructure.EXTI_Line = EXTI_Line8;
	EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
	EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;  
	EXTI_InitStructure.EXTI_LineCmd = ENABLE;
	EXTI_Init(&EXTI_InitStructure);
	
	NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&NVIC_InitStructure);
	//PB1
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource1);
	
	EXTI_InitStructure.EXTI_Line = EXTI_Line1;
	EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
	EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;  
	EXTI_InitStructure.EXTI_LineCmd = ENABLE;
	EXTI_Init(&EXTI_InitStructure);
	
	NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn;;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&NVIC_InitStructure);
	//PB2
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource2);
	
	EXTI_InitStructure.EXTI_Line = EXTI_Line2;
	EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
	EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;  
	EXTI_InitStructure.EXTI_LineCmd = ENABLE;
	EXTI_Init(&EXTI_InitStructure);
	
	NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn;;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&NVIC_InitStructure);
}
//按键1:PA0
void EXTI0_IRQHandler(void)
{
	delay_ms(5);
  if(EXTI_GetITStatus(EXTI_Line0) != RESET)
  {
	LED_Control(LED1,1);
    /* Clear the  EXTI line 0 pending bit */
    EXTI_ClearITPendingBit(EXTI_Line0);
  }
}
//按键2:PA8
void EXTI9_5_IRQHandler(void)
{
	delay_ms(5);
  if(EXTI_GetITStatus(EXTI_Line8) != RESET)
  {
	LED_Control(LED1,0);
    /* Clear the  EXTI line 8 pending bit */
    EXTI_ClearITPendingBit(EXTI_Line8);
  }
}
//按键3:PB1
void EXTI1_IRQHandler(void)
{
	delay_ms(5);
  if(EXTI_GetITStatus(EXTI_Line1) != RESET)
  {
	LED_Control(LED2,1);
    /* Clear the  EXTI line 0 pending bit */
    EXTI_ClearITPendingBit(EXTI_Line1);
  }
}
//按键4:PB2
void EXTI2_IRQHandler(void)
{
	delay_ms(5);
  if(EXTI_GetITStatus(EXTI_Line2) != RESET)
  {
	LED_Control(LED2,0);
    /* Clear the  EXTI line 0 pending bit */
    EXTI_ClearITPendingBit(EXTI_Line2);
  }
}

key.h

#ifndef __KEY_H
#define __KEY_H

#include "stm32f10x.h"

void KEY_Init(void);

#endif
KEY的驱动使用

在main()函数中调用KEY_Init()初始化按键

int main()
{
    ...
    KEY_Init();
    ...
    while(1)
    {
        ...
    }
}

增加按键功能则只需在对应外部中断响应函数中添加代码即可,比如按下KEY1点亮LED1:

void EXTI0_IRQHandler(void)
{
	delay_ms(5);
  if(EXTI_GetITStatus(EXTI_Line0) != RESET)
  {
    led_Control(LED1,1);
    EXTI_ClearITPendingBit(EXTI_Line0);
  }
}

利用库函数的Example快速写KEY驱动

跟LED驱动一样,KEY驱动可以在对应的库函数Example中找到大量我们需要的代码,减少写驱动的时间

在比赛提供的V3.5库的"Project->STM32F10x_StdPeriph_Examples->EXTI->EXTI_Config"文件夹下,打开"main.c":
【蓝桥杯】KEY(基础板上的四个按键)_第2张图片
再打开"EXTI_Config"下的"stm32f10x_it.c"
【蓝桥杯】KEY(基础板上的四个按键)_第3张图片

你可能感兴趣的:(蓝桥杯)