【蓝桥杯嵌入式】以定时中断的方式处理按键

前言:程序以10ms定时中断处理按键,设置按键标志位,防止多次执行。

一、CubeMX配置:

定时器配置:

打开中断NVIC:

按键配置略:

由于按键为按下低电平,故设置为上拉输入。

二、代码部分:

在main中开启定时器1:

HAL_TIM_Base_Start_IT(&htim1);

创建interrupt.h和interrupt.c文件用于写关于中断的代码

interrupt.h代码:

#ifndef _INTERRUPT_H
#define _INTERRUPT_H

#include "main.h"
#include "tim.h"
#include "led.h"
#include "stdbool.h"

struct keys{
	uint8_t flag;
	bool state;
	bool signal;
};

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim);

#endif

解释:设置keys结构体,bool state为按键此时的状态,uint8_t flag为标志位,bool signal为按键触发信号,在按键事件被处理后要将signal清零,防止被多次触发。

interrupt.c代码:

#include "interrupt.h"

struct keys key[4]={0,0,0,0};
void Keyprocess(){
	key[0].state = !HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0);
	key[1].state = !HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1);
	key[2].state = !HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2);
	key[3].state = !HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0);
	for(int i=0;i < 4;i++){
		if(key[i].state == true){
			if(key[i].flag == 0) key[i].flag ++;
			else if(key[i].flag == 1){
				key[i].signal = 1;
				key[i].flag ++;
			}
		}
		else{
			key[i].flag = 0;
			key[i].signal = 0;
		}
	}
}


void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
	if(htim->Instance==htim1.Instance)		         //10ms中断
	{
		Keyprocess();
	}
}

解释:该程序含有四个按键,由于是上拉输入,故将读取结果取非。当按键按下时判断标志位,首次进入flag由0变1,10ms后下一次进入程序,若仍为按下状态则确定状态为按下按键挂起按键信号signal,此过程为消抖及消去电平跳变所带来的干扰的过程。 HAL_TIM_PeriodElapsedCallback为10ms中断处理。

主程序中处理按键方法:

extern struct keys key[];

if(key[0].signal == 1){
    //按键按下时的处理代码
    key[0].signal = 0;
}

注意:清除signal标志位!

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值