历史上的今天
今天是:2025年06月19日(星期四)
2020年06月19日 | 单片机开发中多功能按键详细解析设计
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 } if(C>=KEYA_SPEED1){ //长键处理 //长按后执行的程序放到此处 GPIO_WriteBit(LEDPORT,LED1,(BitAction)(1));//LED控制 while(!GPIO_ReadInputDataBit(TOUCH_KEYPORT,TOUCH_KEY_A)); }else{ //单击处理 for(b=0;b 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 } } //按键判断在此结束
史海拾趣
|
电话机电路原理的详细解说ppt文件 ---------------------soso--------------------------------- 确认没有找到解压密码,请朋友们注意! 如果有解压密码的朋友,请与大家共享,谢谢!… 查看全部问答> |
|
重金 寻求wince上(6410)播放rmvb视频的方案,期待与有成熟技术的公司合作! 重金 寻求wince上(6410)播放rmvb视频的方案,期待与有成熟技术的公司合作! 联系QQ:314629407 … 查看全部问答> |
|
__CONFIG(INTIO & WDTDIS & PWRTDIS & BORDIS & UNPROTECT & MCLRDIS); 这是我的配置字 这时是否应该使用内部晶振 且频率是4MHZ? 我用的是TMR0的中断来产生PWM波 TMR0的预分频器的设置如下 PS0=0; ;PS1=0; ;PS2=0;//1: ...… 查看全部问答> |
|
LaunchPad + 74595 io extender 實作 $(\'swf_eLZ\').innerHTML=AC_FL_RunContent(\'width\', \'550\', \'height\', \'400\', \'allowNetworking\', \'internal\', \'allowScriptAccess\', \'never\', \'src\', encodeURI(\'http://player.youku.com/player.php/sid/XMzkxNDU0MDAw/v.sw ...… 查看全部问答> |




