历史上的今天

今天是:2024年08月24日(星期六)

2019年08月24日 | stm32中非阻塞式多按键状态检测函数

发布者:心愿达成 来源: eefocus关键字:stm32  非阻塞式  多按键状态  检测函数 手机看文章 扫描二维码
随时随地手机看文章

最近做的项目中,关于按键检测调用比较多,因此我也做个适当用法总结。按键状态检测的原理,一般都是通过读相应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中非阻塞式多按键状态检测函数

上一篇:stm32 外部中断 按键的误触发
下一篇:stm32中按键长短按实现方法

推荐阅读

   2018年8月24日,高通宣布将在中国台湾设立“台湾营运与制造工程暨测试中心”,用以负责高通供应链、相关工程与业务发展等海外业务的核心据点。据了解,该中心预计将于2019年初开始营运,并进行相关领域的人才招募与投资,通过直接与间接的价值创造,为台湾经济带来重大效益。值得注意的是高通成立此中心的背景。本月10日,彭博社报道,高通已与中国...
MRSI Systems(Mycronic Group)很高兴宣布公司MRSI-H / HVM系列产品线的最新进展。MRSI使用行业标准玻璃芯片参考样品测试放置精度,测试结果显示,产品精度从3Sigma的±3微米增强至±1.5微米。该产品从2019年10月1日发货开始,产品名称改为MRSI-H和MRSI-HVM(之前称为MRSI-H3和MRSI-HVM3)。精度的持续提升推动了MRSI公司在行业中高速、灵活的品...
  TI公司的MSP430单片机以独特的低功耗和模块化设计赢得了设计者的青睐。新型MSP430F247其性价比相当高,该16位单片机处理速度快,超低功耗,能节省很多资源;MSP430F247内置I2C模块,方便了程序编写,大大降低了程序的出错率。同时更多的I/O口可以级联更多的外围器件,而无需使用地址数据锁存器件,既方便了程序的编写,也简化了硬件电路的设计。  温...
1.定时器与延时的区别大家可能会觉得我们用延时函数照样可以实现上一讲代码的实验现象,但是定时器与延时的概念不同,延时函数需要占用CPU的使用权,正在延时的时候其他任务没有CPU的使用权就会拖慢执行效率。而定时器是不需要占用CPU的使用权的,它是独立自己运行的,就像我们在第一讲的时候提到调好5分钟的闹钟,在这5分钟里我们可以随意执行任务,也可...

史海拾趣

问答坊 | AI 解惑

国际汽车改装展/华南最大汽车改装展/2009汽车改装展/汽车改装展/广州汽车改装展

2009第七届中国(广州)国际汽车改装展暨2009广州房车、旅居车、礼宾车展览会 时间:2009年2月23-25日     地点:中国·广州琶洲国际采购中心 批准举办:中华人民共和国商务部 主办单位:中国对外贸易经济合作企业协会 中汽 ...…

查看全部问答∨

初始化SD卡时,等待卡退出空闲状态超时错误,总是在这里卡住,都快郁闷死了,高人指点一下!

在ZLG的SmartARM2200上做SD卡的读卡器实验,用的是uC/OS系统和ZLG_SD驱动。总是在卡初始化时返回“SD_ERR_TIMEOUT_WAITIDLE 0x34”错误,不知道为什么?SD卡是Kingstone 2G的。 …

查看全部问答∨

单片机控制AD7656数据转换

用单片机的I/O口控制AD7656的转换,用示波器测量时序正确,但是转换结束信号BUSY始终无效,症状好像根本没有启动AD7656,哪位知道,请告知…

查看全部问答∨

yl2440板子的扩展串口16c2550的驱动问题。请高赐教。

开发板是YL2440。扩展串口的驱动用wince自己的16C550的驱动。现在的情况是可以发送,但是不能接收。是什么原因,高手们赐教。…

查看全部问答∨

vc2005 ppc2003模拟器如何分配设备内存和程序内存,以及pda设备(wm5)上给程序增加内存?

vc2005 ppc2003模拟器如何分配设备内存和程序内存,以及pda设备(wm5)上给程序增加内存?…

查看全部问答∨

添加驱动的疑惑

1、我添加了一个流驱动,选择build and sysgen后,编译到最好报错,错误如下: Error:Could not find \'c:\\wince500\\pbworkspaces\\s3c2440\\smdk2440_arm4i_release\\ad.dll\'on disk\\ Error: failed setting line makeimg: fatal error:co ...…

查看全部问答∨

STM32f103Z串口的奇偶校验是不是有问题?

                                 试验中发现串口设为奇、偶校验数据传输不正确,不知为何?发0x01  接收到0x81…

查看全部问答∨

怎样将MCLK的时钟源设置为LFXT1?

在寄存器FLL_CTL1中将SELM设置为11b后,OFIFG总是会自动置位,而且选择失败,MCLK始终为DCOCLK,快崩溃了,怎么弄啊?…

查看全部问答∨

讨论:看门狗用作定时器模式有用吗?

学习msp430的朋友都知道,看门狗能够用作定时器模式,可以定时控制其片内寄存器,可是它真正有用吗?…

查看全部问答∨

体积最小的步进驱动控制器带有CAN总线

◆     PANdrive系列:控制器+驱动器+电机(步进,直流无刷)+编码器  PANdrive系列产品是一种智能产品集成了控制器,驱动器,电机,磁编码器与一体此外支持如USB,RS232,RS485,CAN等多种通讯方式。外部只需要提供 ...…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved