历史上的今天
返回首页

历史上的今天

今天是:2025年06月21日(星期六)

2019年06月21日 | stm32检测按键单击,双击,长按

2019-06-21 来源:eefocus

硬件连接:

    按键上拉


外设配置:

    外部配置为下降沿中断,定时器中断时间为5ms。定时器中断抢占优先级必须高于外部中断


检测方法:



    定义一个时间,在该时间段里检测到一个下降沿,认为是单击;低电平持续时间超过该时间,认为是长按;检测到两个下降沿认为是双击。


代码

#define KEY_PRESS_TIME          800         //检测时间段

 

uint16_t key_time_cnt = KEY_PRESS_TIME + 5;

bool key_pressed = false;            //单击标志

bool key_long_pressed = true;        //长按标志

 

void EXTI0_IRQHandler(void)

{

    if(RESET != EXTI_GetITStatus(KEY_EXTI_Line))

    {

        EXTI_ClearITPendingBit(KEY_EXTI_Line);

        

        if (!key_pressed) //第一次按下按键

        {

            key_time_cnt = 0;

            key_pressed = true;

            key_long_pressed = true;

 

            while (!GPIO_ReadInputDataBit(KEY_GPIO_PORT, KEY_GPIO_PIN));

            //延时函数至关重要,再单击和双击时,在定时器中断里将key_long_pressed置为false

            //延时时间不能小于定时器中断时间

            delay_ms(5);            

            if (key_long_pressed && key_pressed)

            {

                //松手执行长按动作

                key_pressed = false;

            }

        }

        else //第二次按下

        {

            key_pressed = false;

            key_long_pressed = true;

            key_time_cnt = KEY_PRESS_TIME + 5;

            //按下时执行双击动作

            while (!GPIO_ReadInputDataBit(KEY_GPIO_PORT, KEY_GPIO_PIN));

            //松手执行双击动作

        }

    }

}

 

void TIM2_IRQHandler(void)

{

    if(RESET != TIM_GetITStatus(TIM2, TIM_IT_Update))

    {

        TIM_ClearITPendingBit(TIM2, TIM_IT_Update);

        

        if (KEY_PRESS_TIME >= key_time_cnt)

        {

            key_time_cnt += 5;

        }

        if (key_time_cnt < KEY_PRESS_TIME)

        {

            //在设置的时间段里检测到松手,表示一定不是长按

            if (GPIO_ReadInputDataBit(KEY_GPIO_PORT, KEY_GPIO_PIN) && key_pressed)

            {

                key_long_pressed = false;

            }

        }

        //设置的时间到

        else if (KEY_PRESS_TIME == key_time_cnt)

        {

            if (!key_long_pressed && key_pressed)

            {

                //执行单击动作

                key_pressed = false;

            }

            if (key_long_pressed && key_pressed)

            {

                //不等松手,执行长按动作

            }

        }

    }

}


推荐阅读

史海拾趣

Amphenol Thermometrics公司的发展小趣事

Amphenol Thermometrics 是 Amphenol 公司旗下的子公司,专注于设计、制造和销售温度传感器和测量解决方案,在电子行业和其他领域发挥着重要作用。以下是关于 Amphenol Thermometrics 公司发展的五个相关故事:

  1. 创立与初期发展:Amphenol Thermometrics 公司的历史可以追溯到20世纪60年代,当时公司成立于美国纽约州的克拉克森市。最初,公司主要致力于生产温度传感器和测量装置,为不同行业的客户提供可靠的温度监测解决方案。随着技术的进步和市场需求的增长,Amphenol Thermometrics 逐渐壮大成为温度传感器领域的重要参与者。

  2. 技术创新与产品多样化:Amphenol Thermometrics 公司在温度传感器领域持续进行技术创新,并不断推出新型的温度传感器和测量解决方案。公司致力于提升产品的精度、灵敏度和可靠性,满足客户对高性能温度监测设备的需求。除了传统的温度传感器,Amphenol Thermometrics 还推出了一系列新型产品,如热电阻、热敏电阻、红外线传感器等,拓展了产品线的多样性。

  3. 客户合作与定制化解决方案:Amphenol Thermometrics 公司与客户建立了密切的合作关系,共同开发定制化的温度传感器和测量解决方案。公司的工程团队与客户紧密合作,根据客户的需求和应用场景,设计和制造符合特定要求的产品。这种定制化解决方案能够满足客户个性化的需求,为客户提供更加专业和完善的温度监测服务。

  4. 质量控制与认证标准:Amphenol Thermometrics 公司高度重视产品质量控制,并严格遵循国际质量管理体系标准。公司的生产工艺和质量管理体系符合ISO 9001质量管理体系认证标准,以确保产品质量的稳定性和可靠性。此外,Amphenol Thermometrics 公司的产品还通过了各种行业和应用领域的认证标准,如汽车行业的TS16949认证等,确保产品符合行业标准和规定。

  5. 全球市场拓展与合作伙伴关系:除了在美国的生产基地外,Amphenol Thermometrics 公司还在全球范围内设有多个销售办事处和代理商网络,拓展了国际市场份额。公司与全球各种行业领先企业建立了长期稳定的合作关系,共同推动产品的创新和市场拓展。通过全球市场拓展和合作伙伴关系,Amphenol Thermometrics 公司不断扩大业务规模,增强了在温度传感器领域的市场竞争力。

这些故事展示了 Amphenol Thermometrics 公司从成立初期到如今在技术创新、产品多样化、客户合作与定制化解决方案、质量控制与认证标准以及全球市场拓展与合作伙伴关系等方面取得的重要进展。

ADTech公司的发展小趣事

AdTech公司在成立之初,以其完整的传统半导体器件工艺在通信、激光医疗和激光防卫领域获得了广泛认可。然而,随着技术的不断进步和市场的变化,公司管理层意识到需要转型以维持竞争优势。2008年,经过三年的技术储备,AdTech决定将原有的光电探测器业务剥离,转而专注于量子级联激光器(QCL)的研发和生产。这一决策使公司能够专注于前沿技术,逐渐在QCL领域建立了领先地位,成为美国各大QCL激光设备的核心供应商。

Defense Logistics Agency公司的发展小趣事

随着军事现代化的推进,DLA意识到整合与优化供应链的重要性。于是,DLA开始着手整合各个军事部门的后勤系统,实现资源的集中管理和统一调配。通过引入先进的供应链管理技术,DLA大幅提高了物资采购、存储、运输和分发的效率,确保了美军在全球范围内的作战需求得到及时、准确的满足。

FARNELL公司的发展小趣事

为了保持在电子行业中的领先地位,FARNELL公司积极寻求创新与合作。公司与多家知名电子元器件制造商建立了长期合作关系,共同研发新产品、新技术。同时,FARNELL公司还致力于为客户提供定制化的解决方案,满足不同客户的需求。这种创新与合作的精神使FARNELL公司在电子行业中保持了持续的发展动力。

Eastman Kodak Company公司的发展小趣事

随着技术的不断进步,伊士曼柯达公司不断推出新的产品和服务,以满足市场的多样化需求。在20世纪初,柯达已成为全球最大的胶卷供应商,并占据了美国摄影市场的绝大部分份额。此外,公司还积极向国际市场扩张,通过设立分支机构和办事处,将产品销往全球各地。这一时期,柯达不仅凭借其优质的产品赢得了广泛的客户基础,还树立了良好的品牌形象。

Elma Electronic Inc公司的发展小趣事

Elma对产品质量的追求是显而易见的。通过对所有员工的培训以及遵循认证的ISO标准的系统程序,Elma达到了行业领先的质量水平。这种对质量的承诺不仅体现在产品制造过程中,更贯穿于整个公司的运营和管理中。

问答坊 | AI 解惑

大家对nrf2401多个之间通信有什么看法?

一个总接收 多个发送 大家对这个的实现有什么看法没?…

查看全部问答>

视频监控系统中的各种干扰解决方法大全

监控系统在各领域中的应用越来越多,在不同环境、不同安装条件和不同施工人员下,由于线路、电气环境的不同,或是在施工中疏忽,容易引发各种不同的干扰。这些干扰就会通过传输线缆进入闭路电视监控系统,造成视频图像质量下降、系统控制失灵、运行 ...…

查看全部问答>

关于LinuxLink

请问LinuxLink是什么东西?是不是包括专门为IXP425定制的linux kernel?就象REDHAT是专门为X86定制的linux kernel一样…

查看全部问答>

【设计工具】ISE设计流程简介

$(\'swf_fCr\').innerHTML=AC_FL_RunContent(\'width\', \'550\', \'height\', \'400\', \'allowNetworking\', \'internal\', \'allowScriptAccess\', \'never\', \'src\', encodeURI(\'http://www.tudou.com/v/LvxONqdJFXA/&rpid=93619453&res ...…

查看全部问答>

烧录问题,疑是仿真器故障

各位大大您们好: 小弟我的LaunchPad(MSP-EXP430G2)突然不能烧录了,前一分钟正常,在没有更改USB链接、电路、电源、等等的情况下,只改了一些程式,就突然显示一下信息: 【MSP430: Error initializing emulator: Could not find MSP-FET430UIF ...…

查看全部问答>

ccs老是报错。

我用f2812生成pwm波来控制永磁同步电机,可是ccs编译下载完成后,一开交流电源,ccs就报错,这样显示“Power Failure on Target CPU: Error 0x20001020/-1135 Severe Error during: Execution, Target,  Unrecoverable emulation error ...…

查看全部问答>

带有FR功能的温度测试点

打算做一个无线温度标签,功能比较简单,FRID+测温即可。FRID打算选择无线射频卡芯片,暂时找了一个国产的,QR2213。MCU当然首先咱们的金刚狼,温度采集现在有两种想法,一个是选测温芯片,另外一个就是用单片机内部的温度传感器,精度在1°左右就 ...…

查看全部问答>