STM32中断+定时器实现长按、短按(一)

2024-03-06 14:20 浏览 2798人

项目,要实现长按、短按、还有多按,用按键来控制单片机开关机,关机后进入到睡眠低功耗,所以我将按键配置中断,用中断来唤醒睡眠,加上定时器完成长短按键,话不多说,开始进入正题。(点击此处黄色字体领取文中配套资料

单片机选择STM32F103C8T6最小系统板

轻触按键

在学习单片机时,接触最多的外设除了LED就是按键,所以按键的介绍就只是简单说一下。

根据按键原理图可知,GPIO引脚P0.0(PA0)、P0.1(PA1)、P5.2在没有按键没有按下时连接的是R5、R6、R8三个电阻接地线,所以在按键没有按下时处于低电平,按键K4、K3、K2 == 0;至于二极管D2、D3是按键K3、K4应用于影响按键K2的,不使用可以不用管。

当按键K4按下时,电源VDD接通经过电阻R5到达地线GND,GPIO引脚P0.0可检测到高电平,按键K4 == 1,

按键是高电平响应,代码可以这这样写:

//#include "key.c" void KEY_Init(void) {
	GPIO_InitTypeDef GPIO_InitStructure; //定义GPIO结构体 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //上拉输入 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //PA0引脚 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //输出频率 GPIO_Init(GPIOA, &GPIO_InitStructure); //结构体配置完成初始化 } uint8_t KEY_Stare(void) 
{ static uint8_t key_state = 0;//按键状态位 if(KEY_STATA && !key_state) { printf("key_ON\r\n");//按下按键 key_state = 1;
	} if(!KEY_STATA && key_state) { printf("KEY_OFF\r\n");//松开按键 key_state = 0;
	} return key_state;
} //#include "key.h" #define KEY_STATE	!!(GPIOA->IDR & 0x0001)//寄存器读取按键状态位 #define KEY_STATA	!!GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0)//标准库读取 void KEY_Init(void); uint8_t KEY_Stare(void);

如果读者按键是低电平响应,只需要修改KEY_STATA的取反即可。

 //#include "key.c" void KEY_Init(void) {
	GPIO_InitTypeDef GPIO_InitStructure; //定义GPIO结构体 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //上拉输入 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //PA0引脚 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //输出频率 GPIO_Init(GPIOA, &GPIO_InitStructure); //结构体配置完成初始化 } uint8_t KEY_Stare(void) 
{ static uint8_t key_state = 0;//按键状态位 if(!KEY_STATA && !key_state) {//此处修改即可 printf("key_ON\r\n");//按下按键 key_state = 1;
	} if(KEY_STATA && key_state) { printf("KEY_OFF\r\n");//松开按键 key_state = 0;
	} return key_state;
} //#include "key.h" #define KEY_STATE	!!(GPIOA->IDR & 0x0001)//寄存器读取按键状态位 #define KEY_STATA	!!GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0)//标准库读取 void KEY_Init(void); uint8_t KEY_Stare(void); 


定时器

选择STM32F103C8T6的通用定时器TIM2。

点击此处完整代码可进群免费领取!!!

嵌入式物联网的学习之路非常漫长,不少人因为学习路线不对或者学习内容不够专业而错失高薪offer。不过别担心,我为大家整理了一份150多G的学习资源,基本上涵盖了嵌入式物联网学习的所有内容。点击下方链接,0元领取学习资源,让你的学习之路更加顺畅!记得点赞、关注、收藏、转发哦!