单片机C语言如何实现按键按一下的时候加一,长按的时候连加。
展开全部
这个可以通过定时器来实现,比如当按键时间小于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;
}
}
}
#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;
}
}
}
展开全部
你的问题还是去抖的情况,延时再长些,可以考虑下面方法,定时器中断可试
着调整看多少合适,看来你的按键应该再加上去抖硬件电路。
用定时器出中断,每次中断判断按键状态,如果按下为高电平,那么两次中断
如果有低->高变化的判断为按键按下,高->低变化的判断为按键抬起,两次都是
高则为长按。
着调整看多少合适,看来你的按键应该再加上去抖硬件电路。
用定时器出中断,每次中断判断按键状态,如果按下为高电平,那么两次中断
如果有低->高变化的判断为按键按下,高->低变化的判断为按键抬起,两次都是
高则为长按。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
if (!KEY) {
DelayMS(10); // 按键消抖
if (!KEY) {
/* 此处写按一次键加一的程序 */
}
while (!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();
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
bit bdata y; // 定义一个标志位 这样试试 按键按一下 只 加一
{
if(ANK3==0 && y==0 ){ y=1;CONT2++;}
if(ANK3==1){ y=0; }
}
{
if(ANK3==0 && y==0 ){ y=1;CONT2++;}
if(ANK3==1){ y=0; }
}
追问
谢谢
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询