导航:首页 > 操作系统 > 单片机按键长按

单片机按键长按

发布时间:2022-04-25 20:30:44

⑴ 51单片机,矩阵按键,长按短按判断

/*网友反映长键结束后会送出短键值,特作更改2019.03.29*/

//1,再写一个长短键判断函数,调用那个按键扫描函数
unsignedcharKEY_process(void)
{
staticunsignedcharOld_key=0;//上次按键值
staticunsignedcharKey_buf=0;//按键有效保存
staticunsignedcharPress_CNT=0;//按键按下时间,根据调用时间间隔确定
=0;//长键有效标记变量
unsignedcharNew_key=0;//当前按键值
unsignedcharKEY=0;//待返回的按键值

New_key=keyscan();

if(New_key==Old_key)
{
if(New_key!=0)//建议keyscan返回0的那个值改为其他值,方便这里判断
{
Key_buf=New_key;
if(Press_CNT<0xff)
{
Press_CNT++;
}
if(Press_CNT>=100)//调用时间间隔确定*100为长按时间,
{
KEY=Key_buf+100;//将短键+100作长键区分
Press_CNT=0;//按键时间清0
Key_buf=0;//按键缓冲清0
bPreKeyIsLong=1;//长键有效标记
}

}
else//按键弹起
{
if(Key_buf&&(bPreKeyIsLong==0))//仅在长键无效时
{
KEY=Key_buf;//将缓冲值送将返回的值
Key_buf=0;//清按键缓冲
}
Press_CNT=0;//按键弹起或按其他按键,将长按时间清0
bPreKeyIsLong=0;//长键有效标记清0
}
}
Old_key=New_key;//将新按键赋给下一次的旧按键值

returnKEY;//0代表无按键
}
//2,弹起不返回已确定的值,则在keyscan最后加一句判断
if((P3&0X0F)==0X0F)//按键已经弹起
{
keyvalue=MY_key;//使按键等于一个自定义的值
}

⑵ 单片机怎样识别按键是单机,双击还是长按,算法应该是怎样

过滤抖动的问题
第一次发生接触时,设置一个flag表明上次所有btn状态,然后定时器启动。然后在main
loop进行检测,一直检查刚才那个按下的btn,如果发现到定时器将要到时刻都还在接触状态,那么应该是长按,重置定时器。如果出现了一定间隔的断开,那么等待直到定时器中断发生时,检查flag中btn状态和现在btn状态,则可以发现是否双click---

⑶ 51单片机中如何按下按键时数码管正常显示而不闪烁,并且实现长按连续

你好,我也遇到这样的问题,经过一周的研究,问之前的前辈得出结果,希望对你有帮助
char scan_k(char k)
{
int i=0;//定义一个变量用来累计长按的时间
if((KEY1&&KEY2&&KEY3&&KEY4&&KEY5&&KEY6)==0)//如果有按键按下
{
while(!KEY1)//如果按键1按下
{
xianshi(neirong);//执行显示
delay_ms(1);//延时
i++;//每次i自加1
if(i>=1000)
{
k=11;//按键1长按
}
else
{
k=1;//按键1短按
}

}
i=0;
while(!KEY2)//如果按键2按下
{
xianshi(neirong);//执行显示
delay_ms(1);//延时
i++;//每次i自加1
if(i>=1000)
{
k=21;//按键2长按
}
else
{
k=2;//按键2短按
}

}
i=0;//在下一个按键按下之前清空i的值
while(!KEY3)//如果按键3按下
{
xianshi(neirong);//执行显示
delay_ms(1);//延时
i++;//每次i自加1
if(i>=1000)
{
k=31;//按键3长按
}
else
{
k=3;//按键3短按
}

}
i=0;
while(!KEY4)//如果按键4按下
{
xianshi(neirong);//执行显示
delay_ms(1);//延时
i++;//每次i自加1
if(i>=1000)
{
k=41;//按键4长按
}
else
{
k=4;//按键4短按
}

}
i=0;
while(!KEY5)//如果按键5按下
{
xianshi(neirong);//执行显示
delay_ms(1);//延时
i++;//每次i自加1
if(i>=1000)
{
k=51;//按键5长按
}
else
{
k=5;//按键5短按
}

}
i=0;
while(!KEY6)//如果按键6按下
{
xianshi(neirong);//执行显示
delay_ms(1);//延时
i++;//每次i自加1
if(i>=1000)
{
k=61;//按键6长按
}
else
{
k=6;//按键6短按
}

}
i=0;

}
return k;//返回按键的值
}
以上代码,不带操作系统,不包含中断,请根据实际情况调整你想要的长按时间,按键按下的时候,如果你的消抖时间太长,数码管会有明显的闪烁或者变暗,请根据自己的需求进行调整

⑷ 单片机按键短按和长按的程序

设置定时器100毫秒中断a值自家1
设置按键值位变量k
设置按键端口k1
if (!k1)按键按下

delay(20);去痘
if (!k1)确认按下
a=0;计时数清0 确保长按时间精准
while(!k1)按钮没释放 死循环检测按下时间
if(a>30)达到3000毫秒
k=!k按键值取反 没按前为0 长按3秒后为1 短案无效

⑸ 单片机按键长按键处理问题,在线请高手帮忙,解决了一定再追加积分!

呵呵,你好,更改的代码如下,希望你能够自己理解啦
key()
{
{
if(s1==0)
{
delayms(10);
if(s1==0)
{
num++;
if(num==100)
num=0;
count[0]=num/10;
count[1]=num%10;
}
delayms(200);//个人感觉while(!s1)不能一直按着计数比较麻烦;
}
if(s2==0)
{
delayms(10);
{
if(s2==0)
{
num--;
if(num==-1)
num=100;
count[0]=num/10;
count[1]=num%10;
delayms(200);
}
}
}
}
}

⑹ 51单片机C语言编程如何实现长按按键实现数值的累加

这个可以用定时器来做,比如检查某键,按键时间超过2秒后一个变量开始累加知道键释放为止。实现方法如下:
#include<reg51.h>
#define
uint
unsigned
int
#define
uchar
unsigned
char
uint
v=0,time=0;
sbit
key=P1^0;
void
t0isr()
interrupt
1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
time++;
if((key==0)&&(time>40)v++;
//如果按键时间超过2秒且键未释放,变量+1
if(key==1)time=0;
//如果键释放,时间复位
}
main()
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TR0=1;
ET0=1;
EA=1;
while(1);
}

⑺ 怎么用C语言/C51程序实现单片机按键长按开机与长按关机

1.
首先需要硬件支持,也就是单片机某个引脚可以控制断电和维持上电
2.
按键的的作用也可以给单片机供电,并且还要有个专门的引脚检测按键状态。
3.
软件:首先是长按判断。这个最好用按键扫描。就是检测按键按下时候,定时器计时,如果松开就立即清零。在设置一个功能函数检测定时值,大于两秒后,就表示长按。
4.
按键按下单片机供电开始计时,如果达到长按标准,就输出引脚控制持续供电,这时候按键松了也不会断电。
5.
运行期间,按键再次按下并符合长按,那木引脚输出停止供电,这时候如果按键松开,那就彻底没电关机。

⑻ 51单片机 按键长按短按效果

#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int

sbit key=P1^0;
sbit LED1=P1^4;
sbit LED2=P1^5;

uchar code ledtab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};
uint dat,cnt;
uchar dis[4],disscan=0;
bit flags,flagl;

void t0isr() interrupt 1
{
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
cnt++;
if(cnt>=200)
{
flagl=1;
flags=0;
if((cnt%5)==0)dat++;
}
}
void t1isr() interrupt 3
{
TH1=(65536-5000)/256;
TL1=(65536-5000)%256;
P2=1<<disscan;
P0=ledtab[dis[disscan]];
disscan++;
disscan%=4;
}
main()
{
TMOD=0x11;
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
TH1=(65536-5000)/256;
TL1=(65536-5000)%256;
TR1=1;
ET0=1;
ET1=1;
PT1=1;
EA=1;
P1=0xff;
while(1)
{
if(key==0)TR0=1;
if(key)
{
if(cnt<200 && TR0==1){flags=1;flagl=0;dat++;}
if(cnt>=200){flagl=1;flags=0;}
cnt=0;
TR0=0;
}
if(flags){LED1=0;LED2=1;}
if(flagl){LED1=1;LED2=0;}
if(flags==0 && flagl==0) {LED1=1;LED2=1;}
dis[0]=dat/1000;
dis[1]=(dat%1000)/100;
dis[2]=(dat%100)/10;
dis[3]=dat%10;
}
}

⑼ 单片机C语言,红外线遥控器,长按按键一直按下程序该怎样区分呢

每种协议都是不一样的,比如是日立的协议吧,就是通常说的一种,长按时发的第一个32位是对应的地址码,命令码及其反码,但是按键一直按下时,则每隔固定时间发送的是重复码,这个重复是固定一组编码,与你按键对应的的地址和命令没有任何关系,也就是说任何长按的重复码都是一样的;
而连续按则不同,按键松开后再按,则再次发送对应地址码,命令码及其反码,不发送重复码。
程序可以根据具体的编码时序分支处理,若是连续按,则跳入一个分支,否则跳入长按处理,长按里面判断很简单,则将上一次的结果重复一次即可。

⑽ 单片机按键怎么实现长按和短按和组合键功能

是在实物开发板上实现吗?
长按和短按很好实现,当检测到有按键按下了,就开始计时,用定时器,检测到按键松开了,停止计时,然后根据计时的时间长短,确定是长按还是短按,比如,时间小于0.5秒为短按,超过3秒为长按,其余时间为无效,不够长按时间,就为无效按键,也不算是短按的。这样可以排除是随意按键的可能。
组合键就好办了,检测到同时按两个,三个,就为组合键,至于是什么功能,那由你自己定义了。

阅读全文

与单片机按键长按相关的资料

热点内容
海康摄像萤石云服务器 浏览:814
安卓手机怎么改安卓版名 浏览:147
雅思听力807词汇pdf 浏览:897
黄豆私人加密 浏览:192
java分钟转换小时 浏览:245
易语言服务器如何提高 浏览:591
网站主机服务器地址查看 浏览:859
算法学不会能当程序员吗 浏览:119
程序员技术交流研究 浏览:814
javaresponse文件 浏览:734
linuxrar压缩文件夹 浏览:218
魅蓝手机连接不上服务器怎么回事 浏览:379
工行app怎么改已绑定银行卡 浏览:533
oppo芯片程序员 浏览:602
oppok3应用怎么加密 浏览:327
电脑软盘怎么加密码 浏览:815
服务器光交换机有什么用 浏览:708
app上怎么拍蛙小侠 浏览:217
志高聊天app怎么下载 浏览:635
邮政app怎么不能扫付款码 浏览:559