3.按键进阶版(国赛)

1.基础知识

cubemax配置和原来一样。age加一次代表10ms,抖动时长为20ms,age从0到2。

2.单击

#include "key.h"
struct keys key[5]={0,0};
uint8_t key_read()
{
if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0)==0)return 1;
else if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1)==0)return 2;	
else if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2)==0)return 3;
else if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)==0)return 4;
else return 0;
}
void key_serv()
{
 uint8_t key_val=key_read();
if(key_val!=0)
{
key[key_val].age++;
if(key[key_val].age==2)key[key_val].flag=1;
}
else{
for(int i=0;i<5;i++)key[i].age=0;
}
}
#ifndef __key_h
#define __key_h
#include "head.h"
struct keys{
  uint8_t age;
  uint8_t flag;
};
void key_serv(void);
#endif
extern struct keys key[];


void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
 if(htim->Instance==TIM4)
 {
  key_serv();
 }
}


void key_proc()
{
    if(key[1].flag==1)
    {
      count++;
	  key[1].flag=0;
     }
}

3.长按键-长按后抬起执行

#include "key.h"
struct keys key[5]={0,0,0,0};
uint8_t key_read()
{
if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0)==0)return 1;
else if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1)==0)return 2;	
else if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2)==0)return 3;
else if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)==0)return 4;
else return 0;
}
void key_serv_long()
{
 uint8_t key_val=key_read();
if(key_val!=0)
{
key[key_val].age++;
if(key[key_val].age==2)key[key_val].press=1;
}
else{
for(int i=0;i<5;i++)
	{
	 if(key[i].age>69)key[i].long_flag=1;
	 if(key[i].press==1&&key[i].long_flag==0)
	 key[i].short_flag=1;
	 key[i].age=0;
	 key[i].press=0;
	}
}

}
#ifndef __key_h
#define __key_h
#include "head.h"
struct keys{
  uint8_t age;
  uint8_t short_flag;
  uint8_t long_flag;
  uint8_t press;
};
void key_serv_long(void);
#endif
extern struct keys key[];

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
 if(htim->Instance==TIM4)
 {
  key_serv_long();
 }
}

void key_proc()
{
	
    if(key[1].short_flag==1)
    {
      count++;
	  key[1].short_flag=0;
     }
	if(key[1].long_flag==1)
    {
     count--;
	key[1].long_flag=0;
     }
}

4.长按键-长按快速增加功能

#include "key.h"
struct keys key[5]={0,0,0,0};
uint8_t key_read()
{
if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0)==0)return 1;
else if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1)==0)return 2;	
else if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2)==0)return 3;
else if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)==0)return 4;
else return 0;
}
void key_serv_long()
{
 uint8_t key_val=key_read();
if(key_val!=0)
{
key[key_val].age++;
if(key[key_val].age==2)key[key_val].press=1;
}
else{
for(int i=0;i<5;i++)
	{
	 if(key[i].press==1&&key[i].long_flag==0)
	 key[i].short_flag=1;
	 key[i].age=0;
	 key[i].press=0;
     key[i].long_flag=0;//不一样的地方,因为长按快速增加,不需要在main函数中标志位置为0,在这里置零
	}
}
if(key[key_val].age>69)key[key_val].long_flag=1;
}
#ifndef __key_h
#define __key_h
#include "head.h"
struct keys{
  uint8_t age;
  uint8_t short_flag;
  uint8_t long_flag;
  uint8_t press;
};
void key_serv_long(void);
#endif
extern struct keys key[];

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
 if(htim->Instance==TIM4)
 {
  key_serv_long();
 }
}

void key_proc()
{
	
    if(key[1].short_flag==1)
    {
      count++;
	  key[1].short_flag=0;
     }
	if(key[1].long_flag==1)
    {
     count--;
     }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值