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

徐州市城乡和住房建设局网站网站流量超限什么意思

徐州市城乡和住房建设局网站,网站流量超限什么意思,代理彩票网站做链接,网站空间 windows linux一、按键消抖 这里记录 状态机 系统滴答定时器 的方法来实现按键消抖。 这是一种非阻塞式的方式实现,比较不错。 周期性检测 → 记录时间戳 → 超时后确认 → 处理释放。 // 按键状态定义 typedef enum {KEY_STATE_IDLE,//空KEY_STATE_DEBOUNCE,//防抖KEY_STATE…

一、按键消抖

这里记录 状态机 + 系统滴答定时器 的方法来实现按键消抖。

这是一种非阻塞式的方式实现,比较不错。

周期性检测 → 记录时间戳 → 超时后确认 → 处理释放。

// 按键状态定义
typedef enum {KEY_STATE_IDLE,//空KEY_STATE_DEBOUNCE,//防抖KEY_STATE_PRESSED//压
} KeyState;KeyState key_state = KEY_STATE_IDLE;
uint32_t key_timestamp = 0;
void key_scan()
{//按键一switch(key_state){case KEY_STATE_IDLE://状态一if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0) == GPIO_PIN_RESET){key_state = KEY_STATE_DEBOUNCE;key_timestamp = HAL_GetTick();//记录当前时间戳}break;case KEY_STATE_DEBOUNCE://状态二if(HAL_GetTick() - key_timestamp >= 20){if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0) == GPIO_PIN_RESET){key_state = KEY_STATE_PRESSED;//执行任务//led_show(1);count ++ ;}else {key_state = KEY_STATE_IDLE;}//抖动误判}break;case KEY_STATE_PRESSED://状态三if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) != GPIO_PIN_RESET){key_state = KEY_STATE_IDLE;}break;}//按键二//按键三//按键四
}

 二、区分长按键和短按键

// 状态定义(修正注释)
typedef enum {KEY_STATE_IDLE,          // 空闲KEY_STATE_PRESS_DEBOUNCE,// 按下消抖KEY_STATE_PRESSED,       // 已确认按下(等待长按触发)KEY_STATE_LONG_PRESS,    // 长按已触发KEY_STATE_RELEASE_DEBOUNCE // 释放消抖
} KeyState;KeyState key_state = KEY_STATE_IDLE;
uint32_t key_press_start_time = 0;
uint32_t key_release_start_time = 0;void key_scan() {switch(key_state) {// 初始状态:检测按下case KEY_STATE_IDLE:if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_RESET) {key_state = KEY_STATE_PRESS_DEBOUNCE;key_press_start_time = HAL_GetTick();}break;// 按下消抖(等待20ms)case KEY_STATE_PRESS_DEBOUNCE:if (HAL_GetTick() - key_press_start_time >= 20) {if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_RESET) {key_state = KEY_STATE_PRESSED; // 进入持续检测状态key_press_start_time = HAL_GetTick(); // 重置计时} else {key_state = KEY_STATE_IDLE; // 抖动误判}}break;// 已确认按下:持续检测时长case KEY_STATE_PRESSED:// 持续按下超过1秒 → 触发长按if (HAL_GetTick() - key_press_start_time >= 1000) {key_state = KEY_STATE_LONG_PRESS;count--; // 长按操作printf("Long Press Detected!\r\n");}// 检测是否提前释放else if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) != GPIO_PIN_RESET) {key_state = KEY_STATE_RELEASE_DEBOUNCE;key_release_start_time = HAL_GetTick();count++; // 单击操作printf("Short Press Detected!\r\n");}break;// 长按已触发状态case KEY_STATE_LONG_PRESS:if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) != GPIO_PIN_RESET) {key_state = KEY_STATE_RELEASE_DEBOUNCE;key_release_start_time = HAL_GetTick();}break;// 释放消抖(20ms)case KEY_STATE_RELEASE_DEBOUNCE:if (HAL_GetTick() - key_release_start_time >= 20) {key_state = KEY_STATE_IDLE;}break;}
}

三、按键消抖老方案(有问题)

一般我会用HAL_Delay();函数。

//B1按键
if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_0) == GPIO_PIN_RESET) //检测按键是否按下
{HAL_Delay(5000); // 消抖if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_0) == GPIO_PIN_RESET) // 说明确实按下去了{执行任务while(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_0) == GPIO_PIN_RESET); // 等待按键释放	}
}

原代码问题分析

 阻塞式设计
while(HAL_GPIO_ReadPin(...)); // 卡死在这里等待释放
  • 问题:在等待按键释放时,CPU 被完全占用

  • 后果

    • 系统无法响应其他任务(如屏幕刷新、通信)

    • 若按键被意外卡住,程序将永久死锁

http://www.dtcms.com/wzjs/602241.html

相关文章:

  • 淘宝运营跟做网站哪种工资高德阳网站建设推广
  • 亚马逊跨境电商官方网站阿里邮箱注册
  • wordpress 没有小工具天津seo网络优化师
  • 网站建设历史谷歌搜索关键字网站
  • 渭南网站建设公司wordpress备份文件
  • 建设网站站点过程中平面设计工作主要内容
  • 在哪个网站买做性的人做韩国的跨境电商网站
  • 做电台需要的文章从哪个网站找公司名字查询
  • .简述网站开发的流程网站建设360
  • 做购物网站建设的公司wordpress首页轮播图
  • 网站出现的的问题成都有什么好玩的娱乐场所
  • 网站的标签自己建的网站地址
  • 杭州网站建设哪个平台好百度云服务器安装wordpress
  • 有没有网站做胡兼职网页界面设计的特点在于
  • 中国十大门户网站网站建设案例简介怎么写
  • 网站界面设计规划wordpress 标签分类
  • 建立网站建设考核激励制度全网软文推广
  • 免费做网站的软件重点实验室网站建设
  • 网站建设与维护 排序题网站icp备案怎么写
  • 如果在网站做推广连接国外 电商网站
  • 公司做网站怎么做账太仓网站建设哪家好
  • 特种工建设网站wordpress 生成xml
  • 会宁网站建设公司怎样自己做网站卖钱
  • 重庆大坪网站建设河北智慧团建官网登录入口
  • wordpress 最新教程视频seo门户网站优化
  • 北京网站建设华网天下科技公司神马收录提交入口
  • 政务公开网站建设情况大连电子商务网站建设
  • 神马站长平台泉州学校网站开发
  • 为网站做外链的方式建筑营销型网站
  • 网站关键词用什么隔开网站网站地图怎么做