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

请教大家一个问题:我现在做了按键长按短按的效果!我是用状态标志位来做的,用定时器来计数,比如:按键按下开始计数,如果>20ms算短按,则短按标志位置1,如果按键大于200... 请教大家一个问题:
我现在做了按键长按短按的效果!
我是用状态标志位来做的,用定时器来计数,比如:按键按下开始计数,如果>20ms 算短按,则短按标志位置1, 如果按键大于2000ms,则打开长按标志位,关闭短按标志位。 我短按是点亮LED1 长按点亮LED2, 但我现在想在数码管上显示出来数字变化, 短按一下数码管+1,长按数码持续++直到松手(以间隔50ms速度++),不知道怎么改,请大神给点思路,在此谢谢了
展开
 我来答
zhxiufan
2017-08-03 · 知道合伙人软件行家
zhxiufan
知道合伙人软件行家
采纳数:14923 获赞数:38384
国家科技进步奖

向TA提问 私信TA
展开全部

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

推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式