按键
定时器-单按键
1.设置引脚
![](https://img-blog.csdnimg.cn/016eb2f7354341d0a00bec8b3d282b51.png)
①PB0~PB2 PA0 设置为intput
②设置上拉
![](https://img-blog.csdnimg.cn/6cb372a399c743ccb33216db95a5b9a8.png)
2.选择时钟
①选择TIM3->外部时钟
![](https://img-blog.csdnimg.cn/e8768d098a6b4bacaaf4d2a3d4ce5a23.png)
②设置时钟参数
![](https://img-blog.csdnimg.cn/ffff9b1bf95e462281ac74e903fb0a8a.png)
③打开中断
![](https://img-blog.csdnimg.cn/4845fc179d2e46a080e5e4e9ce17403c.png)
3.新建两个文件,并在bsp中导入存在的文件
4.interrupt.h
#ifndef _INTERRUPT_H_
#define _INTERRUPT_H_
#include "main.h"
#include "stdbool.h"
struct keys
{
uchar judge_sta;
bool key_sta;
bool single_flag;
};
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim);
#endif
judge_sta; //按键判断 0,1,2key_sta; //按键状态 0-按下 1-松开single_flag; //1-真正的按键单击
5.interrupt.c
#include "interrupt.h"
struct keys key[4]={0,0,0};
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim->Instance==TIM3)
{
key[0].key_sta=HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0);
key[1].key_sta=HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1);
key[2].key_sta=HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2);
key[3].key_sta=HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0);
for(int i=0;i<4;i++)
{
switch(key[i].judge_sta)
{
case 0:
{
if(key[i].key_sta==0)
key[i].judge_sta=1;
}
break;
case 1:
{
if(key[i].key_sta==0)
{
key[i].judge_sta=2;
key[i].single_flag=1;
}
else key[i].judge_sta=0;
}
break;
case 2:
{
if(key[i].key_sta==1)
{
key[i].judge_sta=0;
}
}
break;
}
}
}
}
6.main.c
①包含头文件,引入外部变量
②打开时钟中断
HAL_TIM_Base_Start_IT(&htim3);
③在while语句中写按键功能
if(key[0].single_flag==1)
{
sprintf(text," key0down ");
LCD_DisplayStringLine(Line8,(uint8_t *)text);
key[0].single_flag=0;
}
if(key[1].single_flag==1)
{
sprintf(text," key1down ");
LCD_DisplayStringLine(Line8,(uint8_t *)text);
LED_Disp(0x01);
HAL_Delay(500);
key[1].single_flag=0;
}
按键标志量要初始化置0