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

单片机长按短按

发布时间:2022-08-24 22:51:18

单片机一键长按与短按按键实现的c程序有问题,实在不知道是哪里有问题,请帮助修改一下,谢谢!

这……也太乱了吧?你能从这一大堆的逻辑中理出头绪来,我真佩服死你了。你这长按一处理,后面短按马上也生效了,长按跟没有一样。既然都用上定时器了,就别delay了,那东西只有教材上才会出现,实际应用上很少用到的。用定时器,设个基准时间比如200us一中断,然后设个10ms的按钮扫描时间,就是50个中断,用两个连续的按钮扫描低电平来确定按钮有效性,那个delay就可以88了,教条主义害死人啊。按扭有效后马上对“中断计数”,这个会吧?按钮按下就连加,放开就清0,下次重计数,2秒就是20000次中断,能计到这个数就说明长按有效,没计到这个数就说明短按有效,这样就可以分开处理啦,就这么简单,别老拿定时器开啊关啊。理清思路,别说长按短按,就是双击都可以做出来。

⑵ 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;
}
}

⑶ 单片机一个按键实现短按 中长按 更长按 也就是三种功能 程序怎么写

按键按下和抬起之间有防抖动延时,只要把防抖动延时时间设置大小不同就可以了。短按你设ms,中按搞个1-3s,长按弄个5-10s。我觉着这么行。

⑷ 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;//使按键等于一个自定义的值
}

⑸ 51单片机如何实现按键的长按与短按功能,尝试过很多方法都不行,请高手多赐教,多谢了(想是简单,做是难)

这个真心不难,就是简单的c语言判定就行了,《C程序设计语言》,实在看不了就看谭总写的那本c语言。给你写过伪代码,
if(key=ReadKey())//读取按键,判断有无按键按下去,没按键按下,这里返回0值是不进入这个函数的
{
delay(x);//延时一段时间,写过循环就行了
if(!ReadKey())//在次读取按键值,实际上按下去按键是低电平(原理图一般都是这样做的)
{
return 已经松手了( 这里是高电平了返回0了)

⑹ 51单片机识别四个独立按键是短按还是长按

识别长按,先要确定一个时间,超过这个时间为长按,否则即为短按。
当按一下键后,开始计时,同时判断确定时间到否?到了,执行长按的程序,等待按键释放。
在判断时间的时候,如果按键释放了,说明未到长按的时间,执行短按的程序。
或者,按下时开始计时,等待按键释放,释放后,停止计时,根据计时的时间来判断是长按还是短按。

⑺ 请教51单片机定时中断检测长按与短按问题-100分悬赏

首先你的程序写的不够合理,作为按键一般会使用外部中断而不是定时中断,外部中断可以保证实时按键。
一般按键都是采用外部中断,如果是在while循环里面进行按键键值判断,那么在判断之前最好加个小延时,进行按键去抖。
像你这个wile循环耗时很长,最适合使用外部中断了,当然如果按键没有接到外部中断引脚,采用定时中断也可以达到一定的效果,但是一定要把定时时间设置的短一些。

阅读全文

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

热点内容
如何对文件夹开启共享 浏览:527
常用的磁盘调度算法 浏览:662
怎么用返利app返利 浏览:127
java代码快速 浏览:241
单片机左移右移后是补1还是0 浏览:597
湛江一号命令 浏览:333
导出命令行 浏览:274
C和php交互 浏览:600
苹果手机里的通讯录如何导入安卓手机 浏览:170
怎么在京东app里面看自己会员等级 浏览:43
emerson服务器怎么短接启动 浏览:559
工控编程人员工资 浏览:397
速成意大利语pdf 浏览:250
连续加减乘除法的算法 浏览:654
用mfc编程实现dda算法 浏览:43
linux命令打开应用 浏览:147
改造后的程序员 浏览:271
数控编程变量 浏览:785
江门哪里有plc编程系统 浏览:379
安卓手机如何下载外服b站 浏览:702