中断扫描按键
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);
以上是关于中断扫描按键的主要内容,如果未能解决你的问题,请参考以下文章