最近做的项目中,关于按键检测调用比较多,因此我也做个适当用法总结。按键状态检测的原理,一般都是通过读相应IO口位是否置位来判断是否按下,并且用延时来消抖以及区分长短按。根据延时的用法,也可以区分为阻塞式和非阻塞式。阻塞式即在延时过程中一直等待到计数值,CPU一直被占用无法去执行别的过程,一般这样是不太合理的设计。所以我们都采用非阻塞式,即用轮询的方式去判断是否延时时间到达,其具体代码如下图:
具体思路就是在第一次检测到按下的情况下,给计时变量赋定时器的计数值,等到大于设定长按时间值后,赋长按状态值给按键状态位。等到松手后,若判断大于消抖时间后赋值短按,然后计时变量初始化,最后返回状态值。
但是这样的写法始终存在一个BUG,即长按结束后,会返回一个长按状态之后还会有个短按状态。在检测函数上,我暂时还没有想到解决方法,不过可以在按键处理时,加上上个状态位一起判断即可。具体代码如下:
void key_handle()
{
static uint32_t key_press_time=0;
static uint32_t key_laststate ;
uint8_t key_nowstate ;
uint8_t handle_flag=0;
key_nowstate=Key_state(&key1_press_time,HOME_KEY_PORT, HOME_KEY_PIN);
if(key_nowstate==KEY_PRESS_SHORT && key_laststate==KEY_PRESS_NULL)
{
handle_flag=1;
}
key_laststate=key_nowstate;
return handle_flag;
}
上一篇:stm32 外部中断 按键的误触发
下一篇:stm32中按键长短按实现方法
推荐阅读
史海拾趣
Falco Electronics非常重视企业文化建设。公司倡导“以人为本”的管理理念,注重员工的成长和发展。公司为员工提供了良好的工作环境和福利待遇,还定期开展各种培训活动,帮助员工提升技能水平。这种良好的企业文化吸引了大量优秀人才的加入,也为公司的持续发展提供了有力保障。
品质一直是EICHHOFF公司发展的核心竞争力。为了确保产品质量的稳定性和可靠性,公司建立了一套完善的质量管理体系,并持续进行改进和优化。从原材料采购到生产加工、从产品检测到售后服务,每一个环节都严格按照质量管理体系的要求进行。
此外,EICHHOFF公司还积极引入国际先进的品质管理工具和方法,如六西格玛、精益生产等,以进一步提高产品质量和生产效率。这些努力使得EICHHOFF的产品在行业中享有很高的声誉和信誉。
Advanced Thermal Products Inc公司成立于XXXX年,由一群热衷于热管理技术的工程师创立。在初创期,ATP公司便以独特的技术视角,专注于研发高效、创新的热管理产品。他们针对当时电子设备散热效果不佳的痛点,成功开发出了一款新型的热管理解决方案,为公司在行业内树立了良好的口碑。
为了进一步提升竞争力,CSC开始着手进行产业链整合。公司通过与上下游企业的深度合作,形成了紧密的产业链协同关系。这不仅降低了生产成本,提高了生产效率,还使得CSC能够更好地把握市场动态和技术趋势,为公司的持续发展提供了有力保障。
在国内市场取得一定成绩后,ACP Optoelectronic Technology Co Ltd开始积极拓展国际市场。公司积极参加国际电子展会和技术交流活动,与海外企业建立合作关系,拓展销售渠道。经过几年的努力,ACP Optoelectronic Technology Co Ltd的产品已经成功打入多个国际市场,公司也逐渐发展成为一家具有国际影响力的光电企业。
为了进一步提升竞争力,EasySync公司积极寻求与行业领先企业的战略合作。通过与这些企业的合作,公司不仅获得了更多的技术支持和市场资源,还共同研发出了一系列创新产品。这些产品不仅丰富了公司的产品线,还进一步巩固了公司在同步技术领域的领先地位。
国际汽车改装展/华南最大汽车改装展/2009汽车改装展/汽车改装展/广州汽车改装展 2009第七届中国(广州)国际汽车改装展暨2009广州房车、旅居车、礼宾车展览会 时间:2009年2月23-25日 地点:中国·广州琶洲国际采购中心 批准举办:中华人民共和国商务部 主办单位:中国对外贸易经济合作企业协会 中汽 ...… 查看全部问答∨ |
初始化SD卡时,等待卡退出空闲状态超时错误,总是在这里卡住,都快郁闷死了,高人指点一下! 在ZLG的SmartARM2200上做SD卡的读卡器实验,用的是uC/OS系统和ZLG_SD驱动。总是在卡初始化时返回“SD_ERR_TIMEOUT_WAITIDLE 0x34”错误,不知道为什么?SD卡是Kingstone 2G的。 … 查看全部问答∨ |
yl2440板子的扩展串口16c2550的驱动问题。请高赐教。 开发板是YL2440。扩展串口的驱动用wince自己的16C550的驱动。现在的情况是可以发送,但是不能接收。是什么原因,高手们赐教。… 查看全部问答∨ |
|
vc2005 ppc2003模拟器如何分配设备内存和程序内存,以及pda设备(wm5)上给程序增加内存? vc2005 ppc2003模拟器如何分配设备内存和程序内存,以及pda设备(wm5)上给程序增加内存?… 查看全部问答∨ |
|
在寄存器FLL_CTL1中将SELM设置为11b后,OFIFG总是会自动置位,而且选择失败,MCLK始终为DCOCLK,快崩溃了,怎么弄啊?… 查看全部问答∨ |
|
◆ PANdrive系列:控制器+驱动器+电机(步进,直流无刷)+编码器 PANdrive系列产品是一种智能产品集成了控制器,驱动器,电机,磁编码器与一体此外支持如USB,RS232,RS485,CAN等多种通讯方式。外部只需要提供 ...… 查看全部问答∨ |