当前位置: 首页 > news >正文

深圳国贸网站建设网站推广引流

深圳国贸网站建设,网站推广引流,什么是企业营销网站,网站建立前期调查说明:本文处理按键的短按、长按检测执行,非矩阵按键 硬件可以类似如下连接即可,无需放置上下拉电阻; 按键动作分长按、短按(弹起时执行)两种 按下不放执行长按,但松开按键时不予执行短按函数 多个按键可以同时操作 按…

说明:本文处理按键的短按、长按检测执行,非矩阵按键
硬件可以类似如下连接即可,无需放置上下拉电阻;
在这里插入图片描述
按键动作分长按、短按(弹起时执行)两种
按下不放执行长按,但松开按键时不予执行短按函数
多个按键可以同时操作
按键引脚会自动配置软件上下拉

1、驱动文件

Key_Driver.h

#ifndef _Key_Driver_H_
#define _Key_Driver_H_
#include "Common_Driver.h"extern void Key_Init(void);
extern void Key_Scan(void);#endif

Key_Driver.c

/**********************************************************************
*file:按键扫描处理文件
*author:残梦
*date:2023.2.15
*Version:V1.0
*note:  按键动作分长按、短按(弹起时执行)两种按下不放执行长按,但松开按键时不予执行短按函数多个按键可以同时操作按键引脚会自动配置软件上下拉
使用方法:1、修改宏按键个数值:KEY_NUM2、修改宏按键引脚对应时钟:KEYx_GPIO_CLK_ENABLE()3、修改按键编码枚举:KeyCode_EnumDef4、修改按键端口及引脚号变量数组:Key_gpioPort[]、Key_gpioPin[];端口和引脚需相对应,第一个为按键05、修改按键引脚初始电平状态值:KeyInitStatus[]6、主函数调用按键初始化函数Key_Init()7、1ms调用1次扫描函数Key_Scan()8、修改按键长按、短按执行函数:Key_LongPressAction()、Key_Action()
**********************************************************************/
#include "Key_Driver.h"#define LongPressThr 2000//长按LongPressThr毫秒标为长按按键动作
#define LongPressInc 500//长按LongPressInc毫秒执行一次长按动作函数#define KEY_NUM 4//按键个数
#define KEY0_GPIO_CLK_ENABLE()      __HAL_RCC_GPIOE_CLK_ENABLE()
#define KEY1_GPIO_CLK_ENABLE()      __HAL_RCC_GPIOE_CLK_ENABLE()
#define KEY2_GPIO_CLK_ENABLE()      __HAL_RCC_GPIOE_CLK_ENABLE()
#define KEY3_GPIO_CLK_ENABLE()      __HAL_RCC_GPIOA_CLK_ENABLE()typedef enum
{eKeyCode0 = 0,eKeyCode1 = 1,eKeyCode2 = 2,eKeyCode3 = 3
}KeyCode_EnumDef;//按键编码static GPIO_TypeDef*    Key_gpioPort[KEY_NUM]   = {GPIOE,GPIOE,GPIOE,GPIOA};//按键引脚对应端口key0-key
static uint16_t         Key_gpioPin[KEY_NUM]    = {GPIO_PIN_4,GPIO_PIN_3,GPIO_PIN_2,GPIO_PIN_0};//按键引脚对应引脚号key0-key
static uint8_t          KeyInitStatus[KEY_NUM]  = {1,1,1,0};//按键引脚初始电平状态:0--低电平,1--高电平
static uint8_t KeyReset = 1;//无需用户更改static void Key_LongPressAction(KeyCode_EnumDef key,uint32_t DownTime);
static void Key_Action(KeyCode_EnumDef key);/****************************************************
@function:按键初始化(无需用户修改)
@param:void
@return:void
@date:2023.2.15
@note:
****************************************************/
void Key_Init(void)
{GPIO_InitTypeDef GPIO_InitStruct = {0};KEY0_GPIO_CLK_ENABLE();KEY1_GPIO_CLK_ENABLE();KEY2_GPIO_CLK_ENABLE();KEY3_GPIO_CLK_ENABLE();//外设引脚初始化GPIO_InitStruct.Mode = GPIO_MODE_INPUT;for(uint8_t i = 0;i < KEY_NUM;i++){GPIO_InitStruct.Pull = KeyInitStatus[i]?GPIO_PULLUP:GPIO_PULLDOWN;GPIO_InitStruct.Pin = Key_gpioPin[i];HAL_GPIO_Init(Key_gpioPort[i], &GPIO_InitStruct);}KeyReset = 1;
}/******************************
@function:按键扫描函数(无需用户修改)
@param:void
@return:void
@date:2023.2.15
@remark:需在定时中断中调用,推荐调用间隔1ms长按和短按分为两种按下不放执行长按,但是弹起时不予执行短按函数
******************************/
void Key_Scan(void)
{static uint8_t keybuf[KEY_NUM] = {0xFF};//按键扫描缓冲区赋值static uint8_t KeySta[KEY_NUM] = {1};//全部矩阵按键的当前状态static uint8_t backup[KEY_NUM] = {1};//按键值备份,保存前一次的值static uint32_t KeyDownTime[KEY_NUM] = {0};//长按累计时间static uint32_t KeyDownThr[KEY_NUM] = {LongPressThr};static uint8_t KeyDownFlag[KEY_NUM] = {0};uint8_t i = 0,pinSta = 0;if(KeyReset){KeyReset = 0;for(i = 0;i < KEY_NUM;i++){keybuf[i] = 0xFF;KeySta[i] = 1;backup[i] = 1;KeyDownTime[i] = 0;KeyDownThr[i] = LongPressThr;KeyDownFlag[i] = 0;}}//将按键值移入缓冲区for(i=0;i < KEY_NUM;i++){pinSta = (uint8_t)HAL_GPIO_ReadPin(Key_gpioPort[i],Key_gpioPin[i]);if(!KeyInitStatus[i]){pinSta = pinSta?0:1;}keybuf[i] = (keybuf[i] << 1) | pinSta;}//消抖后更新按键状态for (i=0; i < KEY_NUM; i++){if((keybuf[i] & 0x0F) == 0x00){KeySta[i] = 0;}//连续4次扫描值为0,即4ms内都是按下状态时,可认为按键已稳定的按下else if((keybuf[i] & 0x0F) == 0x0F){KeySta[i] = 1;}//连续4次扫描值为1,即4*4ms内都是弹起状态时,可认为按键已稳定的弹起}for(i=0; i < KEY_NUM; i++)//循环检测按键{if(KeySta[i] == 0)//长按按键{KeyDownTime[i] += 1;if(KeyDownTime[i] >= KeyDownThr[i]){KeyDownFlag[i] = 1;		//长按标志KeyDownThr[i] += LongPressInc; //时间阈值增加LongPressInc毫秒,以准备下次执行Key_LongPressAction((KeyCode_EnumDef)i,KeyDownTime[i]); //调用长按执行函数}}//按键弹起 if(backup[i] != KeySta[i])//检测按键动作{if(backup[i] != 1)//按键按下时执行动作{if(KeyDownFlag[i] == 0)//长按弹起避免重复执行	{Key_Action((KeyCode_EnumDef )i); //调用按键动作函数}}backup[i] = KeySta[i];     //刷新前一次的备份值}if(KeySta[i]) {KeyDownFlag[i] = 0;	//长按标志KeyDownTime[i] = 0;	//累加时间清零KeyDownThr[i] = LongPressThr;//恢复阈值}					}
}/******************************
@function:长按按键动作函数
@param:key-按键键码
@return:void
@date:2023.2.15
@remark:void
******************************/
static void Key_LongPressAction(KeyCode_EnumDef key,uint32_t DownTime)
{printf("Key%d:%d\r\n",key,DownTime);switch(key){case eKeyCode0:{}break;case eKeyCode1:{}break;case eKeyCode2:{}break;case eKeyCode3:{}break;}
}/******************************
@function:短按按键动作函数
@param:key-按键键码
@return:void
@date:2023.2.16
@remark:void
******************************/
static void Key_Action(KeyCode_EnumDef key)
{printf("Action Key%d\r\n",key);switch(key){case eKeyCode0:{}break;case eKeyCode1:{}break;case eKeyCode2:{}break;case eKeyCode3:{}break;}}

2、使用方法

1、修改宏按键个数值:KEY_NUM
2、修改宏按键引脚对应时钟:KEYx_GPIO_CLK_ENABLE()
3、修改按键编码枚举:KeyCode_EnumDef
4、修改按键端口及引脚号变量数组:Key_gpioPort[]、Key_gpioPin[];端口和引脚需相对应,第一个为按键0
5、修改按键引脚初始电平状态值:KeyInitStatus[]
6、主函数调用按键初始化函数Key_Init()
7、1ms调用1次扫描函数Key_Scan()
8、修改按键长按、短按执行函数:Key_LongPressAction()、Key_Action()

测试效果:
在这里插入图片描述
注意:扫描时间1ms如觉得太长可以更久调用1次,程序中会检测4次引脚的状态值,如都为1或0则算为稳定状态
按键文件下载:
链接:https://pan.baidu.com/s/1sO_kFuJb6wtLiMlFbneFsA
提取码:sun5

http://www.shuangfujiaoyu.com/news/63497.html

相关文章:

  • 云南省植保植检站网址色盲测试图免费测试
  • 推动高质量发展的措施长沙正规seo优化价格
  • 能登上日本网站的代理服务器亚马逊seo推广
  • 政府专题网站模板新闻式软文经典案例
  • 哪个网站注册域名好百度实名认证
  • 企业网站建设服务网络推广的渠道有哪些
  • 镇江百度网站东莞关键词seo
  • b2c购物网站建设产品线上营销有哪些方式
  • 刚做的网站搜全名查不到免费模板
  • 怎么样建设个人网站网络搭建是干什么的
  • 建设部证书查询网站吸引人的推广标题
  • 做购物网站需要学哪些常德政府网站市民留言
  • 360网站地图怎么做网站建站价格
  • 做服装行业网站想要推广网页
  • 宁波做网站定制企业营销策划书范文
  • 长春做网站团队广州seo顾问服务
  • 网站后台管理的超链接怎么做注册网站平台
  • 做本地网站应该选什么内容深圳整站seo
  • 我国档案网站建设淘客推广
  • 安阳网站如何创建个人网页
  • 嘉兴公司做网站如何在百度免费发布广告
  • 新余网站开发天津网站建设开发
  • 网上做批发有哪些网站有哪些郑州百度推广公司电话
  • 中国十大品牌网站怎么做网络平台
  • 高校信息化建设网站系统微信网站设计费用
  • 建永久网站星沙网站优化seo
  • 网站建设叫什么软件企业网站优化软件
  • 黑群晖架设wordpress网站优化 秦皇岛
  • 淄博周村专业网站建设公司网络营销是学什么
  • python兼职网站开发站长平台网站