中断扫描按键

Posted mygod2093725_wht

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了中断扫描按键相关的知识,希望对你有一定的参考价值。

之前都是使用软扫描,代码参考:

int button_scan()

	if(BUTTON==1)
	
		delay_ms(20);
		if(BUTTON==1)
		
			while(BUTTON==1);
			return 1;
		
	
	else
	
		return 0;
	

缺点是必须放到主函数的while(1)循环,如果while(1)中其他功能占用大量时间,就无法实现按键的连续扫描。

但是如果采用中断方式,当按钮连接的pin来一个上升沿或下降沿,就会中断主进程去执行中断函数,从而实现连续扫描。

1.FWlib中引入stm32xxxx_exti.c,main.c的stm32xxxx_conf.h中的#include "stm32f10x_exti.h"取消注释,然后main.c中引入misc.h,stm32f10x_exti.h

2.初始化,代码参考:

void Key_Init(void)

	GPIO_InitTypeDef GPIO_InitStructure;
	EXTI_InitTypeDef EXTI_InitStructure;
	NVIC_InitTypeDef NVIC_InitStructure;
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);	
	
	GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_0;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
	GPIO_Init(GPIOB, &GPIO_InitStructure);
	
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,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 = 0;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&NVIC_InitStructure);

3.在stm32xxxx_it.c中编写中断处理函数,这里注意处理按键抖动,代码参考:

void EXTI0_IRQHandler(void)

	int i;
	char but[4]="@b#";
	if(EXTI_GetITStatus(EXTI_Line0) != RESET)	
	
		if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_0)==1)
		
			delay_ms(5);
			if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_0)==1)
			
				while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_0)==1);
				for(i=0;i<3;i++) USART_SendChar(USART1,but[i]);
			
		
	
	EXTI_ClearITPendingBit(EXTI_Line0);

 

以上是关于中断扫描按键的主要内容,如果未能解决你的问题,请参考以下文章

中断扫描按键

STM32基本GPIO操作:按键输入(扫描+外部中断)

STM32的按键方法

GPIO—按键轮询

2440 无法进入按键中断服务函数怎么办

最好的按键扫描和消抖方法,适用于复合长按按下或抬起响应按键