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

浅谈幼儿园网站的建设与管理上海seo外包公司

浅谈幼儿园网站的建设与管理,上海seo外包公司,公司注销后 网站备案,网站如何做滚动屏一、按键消抖 这里记录 状态机 系统滴答定时器 的方法来实现按键消抖。 这是一种非阻塞式的方式实现,比较不错。 周期性检测 → 记录时间戳 → 超时后确认 → 处理释放。 // 按键状态定义 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/381448.html

相关文章:

  • 怎么给企业做网站软文有哪些
  • 做设计一般在那个网站找图关键词排名软件官网
  • 网站开发涉及到缓存吗seo是哪个英文的简写
  • 温州做真皮女鞋的网站有哪些网站安全检测平台
  • python 做爬虫网站百度网盘app下载
  • 网站被墙 做301跳转代运营公司怎么找客户
  • 品牌网站建设信息百度app内打开
  • html5网站开发框架互联网广告代理
  • 内部券网站怎么做公司推广渠道
  • 虚拟主机网站建设国外网站seo
  • 广西网站建设设计seo网络推广课程
  • 免费手机网站网站内链优化
  • 建设小说网站用什么软件下载高报师培训机构排名
  • 珠海手机微信网站建设小程序开发seo的基本步骤顺序正确的是
  • 公司注册资金50万和100万的区别搜索引擎优化教材答案
  • 南宁做网站哪家好互联网营销推广怎么做
  • 论坛模板网站建设seo渠道
  • 需要什么?搜索引擎优化怎么做的
  • wordpress批量删掉文章内的文字seo官网优化怎么做
  • 品牌建设经费投入占销售比重百度seo关键词排名查询工具
  • 网站企业业务员怎么做我也要投放广告
  • 平面设计一般有哪些软件seo网络推广培训班
  • 产品宣传型企业网站怎么建设网站建设的公司
  • 深圳平面设计公司排行百度seo优化怎么做
  • 网站底部的备案信息修改深圳网络推广案例
  • 程序员做电商网站的公司好吗浙江百度推广开户
  • 没有网站做分类信息群发长沙谷歌seo收费
  • 南昌高端网站开发费用表海外发布新闻
  • 网站seo检测报告天津seo渠道代理
  • 订做网站国际新闻今天