单片机开发中多功能按键详细解析设计

发布者:InspiredDreamer最新更新时间:2020-06-19 来源: eefocus关键字:单片机  多功能按键详  单击  双击  长按 手机看文章 扫描二维码
随时随地手机看文章

引言:在很多项目开发过程中我们通常会涉及到按键的使用,为了使按键的功能更多远化我们通常会区别按键的单击、双击、长按等操作过程从而实现更多的功能。现在让我们来分析一下他们的实现原理和过程。


一、原理解析(注意i:这里我们的硬件设计为当按键按下为低电平,如硬件设计不一致反过来即可,原理是相同的)


首先我们来看一下单击、双击、长按电平时序图

在这里插入图片描述

从三种时序图我们可以看出三种操作方式的区别就在于当按键按下后低电平和高电平的时间,通过判断高低电平的变化时间就可以把这三种方式区别开。


单击、和长按的区别:

在这里插入图片描述

单击和双击时序图非常的相似,最大的区别就是按键按下后低电平的持续时间,这里我们对比单击和长按的时序图,可知长按的低电平时间要比单击的要长很多所以这里我们假设单击时低电平的时间为S1,长按时低电平的时间为S2,我们只要在单击和双击之间加一个判断时间这里我们加入S3作为判断,当按键按下时低电平的时间超过了S3则判断为长按,若低电平时间小于S3则判断为单击。我们可以根据自己的需要设定S3的时间来规定什么是长按,什么是单击。


单击和双击的区别:

在这里插入图片描述

通过时序图我们可以看到双击相当于两次单击,双击时第一次按键放开到第二次按键按下有一个时间间隔这里我们用D1表示,而双击和单击的区别在于在D1时间过后单击的电平一直处于高电平状态,而双击则会再次出现一段低电平,这里我们可以加一个定时器在第一次按键放开后开始计时,计时的最大值为D2,这里我们只要判断在D2时间内是否出现了低电平。如果出现了低电平则双击,如果没有出现低电平则为单击。如果出现低电平的时间超过了D2则为两次单击而不是双击。这里我们可以更改D2的时间来改变双击的速度。


二、程序源码


在这里插入代码片

#define TOUCH_KEY_A  GPIO_Pin_1

#define TOUCH_KEYPORT  GPIOA

#define KEYA_SPEED1 100   //长按的时间长度(单位10mS)

#define KEYA_SPEED2 10   //双击的时间长度(单位20mS)


u8 A,B,C;



void KEY_READ(void)

{

if(!GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_A)){ //检测按键是否按下

delay_ms(20); //延时去抖动

if(!GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_A)){//再次判断

while((!GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_A))&&C C++;delay_ms(10); //长按判断的计时

}

if(C>=KEYA_SPEED1){ //长键处理

//长按后执行的程序放到此处

GPIO_WriteBit(LEDPORT,LED1,(BitAction)(1));//LED控制

while(!GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_A));

}else{ //单击处理

for(b=0;b delay_ms(20);

if(!GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_A)){

a=1;

//双击后执行的程序放到此处

GPIO_WriteBit(LEDPORT,LED2,(BitAction)(1));//LED控制


while(!GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_A));

}

}

if(a==0){ //判断单击

//单击后执行的程序放到此处

GPIO_WriteBit(LEDPORT,LED1|LED2,(BitAction)(0));//LED控制

}

}

A=0;C=0; //参数清0

}

} //按键判断在此结束

关键字:单片机  多功能按键详  单击  双击  长按 引用地址:单片机开发中多功能按键详细解析设计

上一篇:单片机--按键定时器检测:短按、长按
下一篇:单片机学习笔记-51单片机实现独立按键的短按及长按触发

推荐阅读最新更新时间:2024-11-05 16:58

基于RISC技术的8位微控制器设计
摘要:介绍基于RISC技术的8位微控制器的设计与实现。主要包括RISC指令集的选取;取指单元、译码单元、执行单元的设计;取指、译码、回写三级流水线技术的实现。该微控制器包含8级硬件堆栈、1个8位计数器、1个计数器溢出中断、2个外部中断源、8位数据输入和输出端口、16个通用寄存器、2K%26;#215;16位的程序存储器、512字节的数据存储器。设计使用可综合的Verilog语言描述, QuartusⅡ软件仿真,FPGA器件验证实现。 关键词:RISC Verilog 8位微控制器 FPGA 引 言 随着微电子技术的不断发展,超大规模集成电路的集成度和工艺水平不断提高,将整个应用电子系统集成在一个芯片中(SoC),已成为
[半导体设计/制造]
单片机交通灯实验汇编语言程序
经过几天的整理,终于将网络上得到交通灯仿真文件,用汇编自己编写了一个程序,实验结果完全符合本人的思路,实验成功。 程序比较长,估计还会用更好的办法重新写。 编写心得是:单片机编程,不一定要背指令,用时可以查,也不必去默写子程序,用时还是可以查,但是,很关键的就是,你的程序,你自己要清楚整个的执行过程,也就是单片机的执行流程。而在实际的应用中,要注意驱动电路的设计,特别是单片机上电复位输出高电平可能造成的影响。 程序如下:如果网页显示格式错乱可从http://www.51hei.com/f/jtda.rar处下载. ORG 0000H START: MOV R2,#30 SU0: MOV P
[单片机]
<font color='red'>单片机</font>交通灯实验汇编语言程序
为网友解答的51单片机波特率计算习题
【第1题】 已知51单片机串行通信口在串口方式1,波特率为9600bps, 系统晶振频率为11.0592MHZ,求TL1和TH1中装入的数值是多少? 【答】: 方式1是16位计数器, 2^16=65536d 当SMOD取0,波特率=F/ , 预装值N=256-F/(波特率x32x12)=65536-11059200/(9600x32x12)=65533d=FFFDh TH1←0FFh, TL1←0FDh ======================================= 【第2题】 已知51单片机使用晶振为11.0592MHZ,用T1的工作方式2作波特率发生器, 串口通信的波特率为9600bps,要求: 1.写出T1
[单片机]
IAR Systems功耗调试技术支持Renesas RX微控制器架构
IAR Systems近日宣布IAR Embedded Workbench的创新性功耗调试功能现已能用于瑞萨电子RX系列 微控制器架构 。通过在 嵌入式 软件代码中使用功耗调试,可以更为严格的控制硬件在某个时间以何种方式产生耗能,将功耗控制在低位来延长移动设备的电池使用时间并减少散热。 IAR Embedded Workbench将系统功耗同跟踪数据和 源代码 相关联, 从而分析出如何设计代码才能节省功耗,查看是否有功耗相关的异常。 “我们的RX内核在性能,代码和数据密度以及功耗方面都是一流的。”瑞萨电子美洲,消费以及工业类业务部门产品市场部总监Ritesh Tyagi 说,“传统的软件开发工具只是专注于性能和代码密
[工业控制]
略谈MSP43单片机端口
MSP430的端口有P1、P2、P3、P4、P5、P6、S和COM(型号不同,包含的端口也不仅相同,如MSP430X11X系列只有P1,P2端口,而MSP430X4XX系列则包含全部上述端口),它们都可以直接用于输入/输出。MSP430系统中没有专门的输入/输出指令,输入/输出操作通过传送指令来实现。端口P1`P6的每一位都可以独立用于输入/输出,即具有位寻址功能。常见的键盘接口可以直接用端口进行模拟,用查询或者中断方式控制。由于MSP430的端口只有数据口,没有状态口或控制口,在实际应用中,如在查询式输入/输出传送时,可以用端口的某一位或者几位来传送状态信息,通过查询对应位的状态来确定外设是否处于“准备好”状态。 端口的功能
[单片机]
略谈MSP43<font color='red'>单片机</font>端口
单片机---HLK-W801图形框架LVGL下开发(五)
2022年3月24日效果,增加了汉化,APP包括温湿度,计算器,wifi连接,在wifi连接状态下,能够进行NTP时间同步及查询天气。 海凌科w801开发的单片机主机 前面由于转移到w801上,SRAM明显吃紧,连喜欢的背景图都放不下了,感觉很是可惜啊,这次就想着扩展一下图片存储。 本章重点 好几天都没更新了,主要是这几天等SD卡座,然后重新规划了一下这块开发板的引脚,最终重新规划后,只剩下了两个引脚没有用了。 买了SD卡座,就是为了今天的学习,学习一下文件系统和lvgl中使用文件作为多媒体素材的来源,例如图标,背景图片等等,因为总是用c文件来存这些东西,最终会把你的sram给装满,尽管它很容就装满了,一共才两百多kb。
[单片机]
<font color='red'>单片机</font>---HLK-W801图形框架LVGL下开发(五)
基于单片机多功能供电控制系统
引言 在工业控制中经常需要对某些温度进行巡检和控制,需要定时控制电机的起动和停止,需要根据料位计开关的状态控制多台卸料、输料电机按照设定顺序运转。在对温度巡检和控制时,要求当温度低于设定的温度下限时,加热系统开始工作,当温度超过设定温度上限时,加热系统停止工作。某台电机是启动还是停止不仅取决于定时时间、料位计开关状态, 还取决于其它电机的运行状态。 硬件设计 本系统以单片机为基础,将多路温度控制、电机定时起停和卸料、输料控制等几项功能合而为一。此外,本系统还具有以下功能:1、通过检测电机的接触器,在电机该运转而没有运转时进行故障报警。2、在热电阻开路时报警。3、能自动检测电机的通路,屏蔽掉没有接入的通路。4、通过键盘设置相应的参
[单片机]
基于<font color='red'>单片机</font>的<font color='red'>多功能</font>供电控制系统
STM32单片机小Tips 玩转IAR开发STM32
BKP还没有搞完,怎么又换到了RTC上了,因为RTC和BKP有些联系,想不关联还不行呢。 以下是数据手册上有关RTC的介绍: RTC 简介 实时时钟是一个独立的定时器。RTC模块拥有一组连续计数的计数器,在相应软件配置下,可提供时钟日历的功能。修改计数器的值可以重新设置系统当前的时间和日期。 RTC模块和时钟配置系统(RCC_BDCR寄存器)是在后备区域,即在系统复位或从待机模式唤醒后RTC的设置和时间维持不变。 系统复位后,禁止访问后备寄存器和RTC,防止对后备区域(BKP)的意外写操作。执行以下操作使能对后备寄存器和RTC的访问: ● 设置寄存器RCC_APB1ENR的PWREN和BKPEN位来使能电源和后备接口时
[电源管理]
STM32<font color='red'>单片机</font>小Tips 玩转IAR开发STM32
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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