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

浅谈幼儿园网站的建设与管理杭州seo公司

浅谈幼儿园网站的建设与管理,杭州seo公司,2345官网,网站的基本建设投资一、按键消抖 这里记录 状态机 系统滴答定时器 的方法来实现按键消抖。 这是一种非阻塞式的方式实现,比较不错。 周期性检测 → 记录时间戳 → 超时后确认 → 处理释放。 // 按键状态定义 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/213686.html

相关文章:

  • 菏泽网站建设公司有哪些网络事件营销
  • 北京网站设计定制开发建设公司百度模拟搜索点击软件
  • 学校网站管理方案办公软件培训
  • 模板企业网站对seo的理解
  • html5做的网站有哪些独立站谷歌seo
  • 网站开发 免代码网络推广优化网站
  • 如何申请深圳设计公司网站怎么样做seo
  • 效果好的网站建设公司阿里云域名查询
  • 建设部网站资质查询市场营销策划方案范文
  • 大量增加告权重网站友链回提升网站权重吗搜索网站有哪些
  • springmvc技术做网站上海网站推广排名公司
  • 网站建设专今日小说百度搜索风云榜
  • 建立一个网站的流程百度地址
  • 沈阳做网站建设郑州百度推广代理公司
  • 行业网站的特点seo快排公司哪家好
  • 邯郸做网站熊掌号百度竞价怎么收费
  • 建设网站的费用调研郑州企业网站优化排名
  • wordpress登录页面修改密码seo搜索引擎优化的内容
  • 网网站设计网如何做品牌推广方案
  • 免费开网店的一件代发seo海外推广
  • 如何查看一个网站做的外链北京做网页的公司
  • cad图纸免费下载网站百度网盘资源搜索引擎搜索
  • 动漫制作技术专业入门seo优化专员招聘
  • 聊城做网站推广seo系统
  • 网站推广打包百度收录批量提交入口
  • 上海网站建设 数字展厅百度的推广方式有哪些
  • 如何开通小程序店铺百度有专做优化的没
  • 网站开发计划书模板小吃培训2000元学6项
  • 建网站如何添加会员模式百度网盟推广怎么做
  • 网络维护方案厦门站长优化工具