把S4设置为独立按键,循环扫描S4按键,按下时间小于1秒为短按,数码管上的数字加1,超过最大值99后恢复00,继续计数;S4按键按下的时间大于1秒为长按,数码管上的计数清除为00。
#include <reg52.h>
unsigned char code smg_nodot[10]={0xC0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
unsigned char code smg_dot[10]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};
unsigned char num=0;//短按键计数
unsigned char count=0;//长按键计时
bit key_s4=0;//长按键计时标志
sbit s4=P3^3;
void delaysmg(unsigned int t)//延时函数
{
while(t--);
}
void displaysmg_byte(unsigned char pos,unsigned char value)
{
P2=0XE0;P0=0XFF;
P2=0XC0;P0=0X01<<pos;
P2=0XE0;P0=value;
}
void display()
{
if(num>9)
{
displaysmg_byte(6,smg_nodot[num/10]);
delaysmg(100);
}
displaysmg_byte(7,smg_nodot[num%10]);
delaysmg(100);
}
void init_T0()
{
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;//定时50ms
TMOD=0X01;
EA=1;TR0=1;ET0=1;
}
void service_t0() interrupt 1
{
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
if(key_s4==1)//s4按键按下开始计时
{
count++;
}
}
void key()
{
if(s4==0)
{
delaysmg(100);
if(s4==0)
{
key_s4=1; //s4按键按下
while(s4==0)
{
display();
}
key_s4=0; //s4按键松开
if(count>20)//计时大于1s
{
num=0;count=0;
}
else
{
num++;count=0;
if(num==100) num=0;
}
}
}
}
void main()
{
P2=0XA0;P0=0X00;P2=0X80;P0=0XFF;
init_T0();
while(1)
{
key();
display();
}
}