单片机C语言如何实现按键按一下的时候加一,长按的时候连加。

2024-10-28 21:48:09
推荐回答(4个)
回答1:

这个可以通过定时汪备器来实现,比如当按键时间小于2秒时,按一次加轿陵1,当超过2秒时,困帆毁没50毫秒加1实现连加功能。例程如下:
#include
unsigned int a;
unsigned char times;
sbit key=P1^0;
void t0isr() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
times++;
if(times>40)
{

a++;
printf("%d",a);

}

}

main()
{
TMOD=0x21;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TH1=0xfd;
TL1=0xfd;
TR0=1;
TR1=1;
ET0=1;
EA=1;
times=0;
a=0;
while(1)
{
if(key==0)

{

a++;

printf("%d",a);

while(key==0);

times=0;

}

}

}

回答2:

你的问题还是去抖的情况,延时再长些,可以考虑下面方法,定时器中断可试
着调整看多少合适,看来你的按键应该再加上去抖帆岁虚硬件电路。
用定时器出中断,每次中断判断按键状态,如果雀明按下为高电平,那么态燃两次中断
如果有低->高变化的判断为按键按下,高->低变化的判断为按键抬起,两次都是
高则为长按。

回答3:

if (!KEY) {
DelayMS(10); // 按键搜模消抖
if (!KEY) {
/* 此处写按一次键加一的程序 */
}
while (!KEY) {
/* 此誉让处写一直按着连续加一的程庆漏局序 */
}
}

回答4:

bit bdata y; //数扰碰 定义一个标志李模位 这样试试 按键按一下 只 加薯谈一
{
if(ANK3==0 && y==0 ){ y=1;CONT2++;}
if(ANK3==1){ y=0; }
}