51单片机 按键长按短按效果
我现在做了按键长按短按的效果!
我是用状态标志位来做的,用定时器来计数,比如:按键按下开始计数,如果>20ms 算短按,则短按标志位置1, 如果按键大于2000ms,则打开长按标志位,关闭短按标志位。 我短按是点亮LED1 长按点亮LED2, 但我现在想在数码管上显示出来数字变化, 短按一下数码管+1,长按数码持续++直到松手(以间隔50ms速度++),不知道怎么改,请大神给点思路,在此谢谢了 展开
#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;
}
}