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

 我来答
zhxiufan
推荐于2017-09-17 · 知道合伙人软件行家
zhxiufan
知道合伙人软件行家
采纳数:14923 获赞数:38385
国家科技进步奖

向TA提问 私信TA
展开全部
这个可以通过定时器来实现,比如当按键时间小于2秒时,按一次加1,当超过2秒时,没50毫秒加1实现连加功能。例程如下:
#include<reg51.h>
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;

}

}

}
cdyzxy
2013-02-21 · TA获得超过2.1万个赞
知道大有可为答主
回答量:1.4万
采纳率:85%
帮助的人:3722万
展开全部
你的问题还是去抖的情况,延时再长些,可以考虑下面方法,定时器中断可试
着调整看多少合适,看来你的按键应该再加上去抖硬件电路。
用定时器出中断,每次中断判断按键状态,如果按下为高电平,那么两次中断
如果有低->高变化的判断为按键按下,高->低变化的判断为按键抬起,两次都是
高则为长按。
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
灼眼的Fate
2013-02-20 · TA获得超过214个赞
知道答主
回答量:83
采纳率:100%
帮助的人:18.7万
展开全部
if (!KEY) {
DelayMS(10); // 按键消抖
if (!KEY) {
/* 此处写按一次键加一的程序 */
}
while (!KEY) {
/* 此处写一直按着连续加一的程序 */
}
}
追问
谢谢,我试过了,一直按着连续加一的程序没问题了,可是按一次键加一的程序有问题,数字会间隔2或者三,我加了中断延时也不行,

if(!ANK3)
{
DELAYMS(10);
if(!ANK3)
{
if(AN_DA_DL2 ==1)
{
AN_DA_DL2 =0;
CONT2++;
}
while(!ANK3)
{
LIANJIA();
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
GUEL86
2013-02-21 · TA获得超过5855个赞
知道大有可为答主
回答量:5538
采纳率:86%
帮助的人:2723万
展开全部
bit bdata y; // 定义一个标志位 这样试试 按键按一下 只 加一
{
if(ANK3==0 && y==0 ){ y=1;CONT2++;}
if(ANK3==1){ y=0; }
}
追问
谢谢
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式