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

浅谈幼儿园网站的建设与管理西安百度关键词排名服务

浅谈幼儿园网站的建设与管理,西安百度关键词排名服务,wordpress怎么更改介绍,想做交友网站怎么做一、按键消抖 这里记录 状态机 系统滴答定时器 的方法来实现按键消抖。 这是一种非阻塞式的方式实现,比较不错。 周期性检测 → 记录时间戳 → 超时后确认 → 处理释放。 // 按键状态定义 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/38660.html

相关文章:

  • 怎么建设手机网站搜索推广渠道
  • 软考5个高级中哪个好考东莞seo优化排名
  • wordpress 媒体库优化优化排名推广教程网站
  • 做公关用的网站网络广告名词解释
  • 网站代理如何做推广app软件
  • 大型网站建设平台企业宣传推广
  • 技术专业网站建设搜索引擎收录入口
  • 西安有哪些家做网站的公司个人自己免费建网站
  • 怎样添加网站地图优化大师的功能有哪些
  • 网站建设 课程友链互换平台推荐
  • asp.net动态网站开发技术什么是软文文案
  • 虚拟机如何做网站如何优化关键词的排名
  • 搭建网站大概多少钱网络营销师证书查询
  • 外贸b2c商城网站设计广州营销网站建设靠谱
  • 网站域名根目录黑锋网seo
  • 代加工接订单网站东莞seo网站制作报价
  • 龙岩网站建设公司搜索引擎优化的内容有哪些
  • 潢川手机网站建设网络营销百度百科
  • 济南网站建设自媒体平台有哪些
  • 做网站台式还是笔记本磁力宅
  • 网页制作处理中的三剑客广州seo公司排名
  • 网站内容规范免费行情网站app大全
  • java鲜花商城网站设计知名的建站公司
  • 企业形象网站开发公司网络推广该怎么做
  • 和狗做的网站好百度店铺注册
  • 企业网站建设电话如何搭建网站平台
  • 网站可信度建设世界杯比分查询
  • 商会网站建设招标方案关键词com
  • 安装网站源码风云榜
  • 网站要素的优化设计百度统计app