标题: 这是一个单片机红外解码的程序,但是长按会触发一次短按命令,怎么改成长按不触发短按啊 [打印本页]

作者: RDFGRSG    时间: 2023-11-8 20:26
标题: 这是一个单片机红外解码的程序,但是长按会触发一次短按命令,怎么改成长按不触发短按啊
本帖最后由 RDFGRSG 于 2023-11-10 11:41 编辑

#include <REGX52.H>
#include "ir2.h"





作者: RDFGRSG    时间: 2023-11-8 23:04
有没有大佬指点一下
作者: man1234567    时间: 2023-11-9 08:49
一般来说,这种情况是不松手测长按和短接造成的,长按中包含短按。
通常,改成松手后察看本次按键按下时长判断是长按还是短按就可以。
作者: RDFGRSG    时间: 2023-11-9 09:16
man1234567 发表于 2023-11-9 08:49
一般来说,这种情况是不松手测长按和短接造成的,长按中包含短按。
通常,改成松手后察看本次按键按下时长 ...

怎么改啊
作者: 卡姿兰大眼睛    时间: 2023-11-9 15:44
加个接收时间长短判断,接收时间大于2秒的,可视为长按,否则为短按

作者: RDFGRSG    时间: 2023-11-9 16:13
卡姿兰大眼睛 发表于 2023-11-9 15:44
加个接收时间长短判断,接收时间大于2秒的,可视为长按,否则为短按

程序里怎么改呢?
作者: lkc8210    时间: 2023-11-9 16:17
RDFGRSG 发表于 2023-11-9 16:13
程序里怎么改呢?

代码不完整
作者: yzwzfyz    时间: 2023-11-9 16:44
即然【长按会触发一次短按命令】哪么只要有长按,就去除一次短按。
如:
产生方,长按后N秒内的首个短按不放出。
使用方,长按后N秒内的首个短按不认可。
有其一即可。

作者: RDFGRSG    时间: 2023-11-9 19:06
lkc8210 发表于 2023-11-9 16:17
代码不完整

那部分不完整
作者: RDFGRSG    时间: 2023-11-9 19:07
别说理论,上修改后代码
作者: RDFGRSG    时间: 2023-11-9 19:15
理论我也能想到,怎么实现呢?
作者: RDFGRSG    时间: 2023-11-9 19:15
卡姿兰大眼睛 发表于 2023-11-9 15:44
加个接收时间长短判断,接收时间大于2秒的,可视为长按,否则为短按

怎么实现呢?
作者: lkc8210    时间: 2023-11-9 21:12
RDFGRSG 发表于 2023-11-9 19:06
那部分不完整

main()呢?
作者: lkc8210    时间: 2023-11-9 21:13
RDFGRSG 发表于 2023-11-9 19:15
理论我也能想到,怎么实现呢?

说说你的理论
作者: lids    时间: 2023-11-10 08:31
看看我这个帖子,也许能帮到你http://www.51hei.com/bbs/dpj-194975-1.html
作者: lkc8210    时间: 2023-11-10 09:00
RDFGRSG 发表于 2023-11-9 22:57
#include
#include "Delay.h"
#include "LCD1602.h"

Duanan_staet和Repeat_Flag在哪里置1?
作者: 圣博朗西斯    时间: 2023-11-15 08:49
长按计时  松开判断
作者: tyrl800    时间: 2023-11-15 19:22
检测重复码次数,大于一定次数就作为长按
作者: 18680365301    时间: 2023-11-29 11:48
按键按下置位标志A并开始计时,如果长按时间到了,清除标志A,,,按键释放时,如果A为真,那么处理短按功能并清除标志A
作者: npn    时间: 2023-11-29 13:12
按住按键计时毫秒,松开后再判断长短按并清零计时。
作者: luking    时间: 2023-11-29 16:09
char Scanf_Key(void) {         static unsigned char sta = 0;         static unsigned int cnt = 0;         switch(sta)         {                 case 0://用来检测是否有按键按下  有的话进入消抖状态 MODE_KEY==0为按下                                         if(MODE_KEY == 0) sta = 1;break;                 case 1:                                         if(++cnt > 50)//消抖50ms  如果50ms之后按键还是按下的状态则认为真的按下  否则就是抖动                                         {                                                         cnt=0;                                                         if(MODE_KEY == 0) sta = 2;//进入到下一个状态                                                         else sta = 0;//回归检测状态                                         }                                         break;                 case 2:                                         if(MODE_KEY==0)                                         {                                                  if(++cnt>1000)//长按                                                  {                                                                 sta = 3;                                                                 return 2;                                                  }                                         }                                         else //短按                                         {                                                         if(cnt>30)                                                         {                                                                 sta = 3;                                                                 return 1;                                                         }                                         }break;                 case 3:                                         if(MODE_KEY == 1)                                         {                                                         sta = 0;                                                         cnt = 0;                                         }                                         break;         }         return 0; }
作者: luking    时间: 2023-11-29 16:10
你试一下我发这个
作者: luking    时间: 2023-11-29 16:10
换个宏定义就可以了
作者: tyrl800    时间: 2023-11-30 09:06
luking 发表于 2023-11-29 16:09
char Scanf_Key(void) {         static unsigned char sta = 0;         static unsigned int cnt = 0;         switch(sta)         {  ...

楼主要的红外遥控器按键




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1