非常感谢24楼的评论和25楼写的程序,我有些小改动,现在可以工作了,但还有个问题,如何能实现在设置数据是相对的数码管闪烁,我用中断程序试过不能实现,希望大家能提出建议!
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
//sbit dula=P2^6; //数码管段选
//sbit wela=P2^7; //数码管位选
sbit en=P3^3; //确定要调节的位置(个、十、百、千)
sbit jia=P3^2;//加一
sbit m=P3^5; //确定。时间调好后,按这个键开始计数
sbit led=P1^0; //进入设置状态Led亮
sbit led1=P1^1;//调节个位时led1亮
sbit led2=P1^2;//调节十位时led2亮
sbit led3=P1^3;//调节百位时led3亮
sbit led4=P1^4;//调节千位时led4亮
sbit signal=P3^4; //减信号输入端
sbit signal_out=P1^7;
unsigned int i,j,n;
unsigned long num,num1,l;
uchar code table[]={0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,0x7f,0x6f};
void delay(uchar x);
void init();
void keyscan();
void display(uint num);
void delay(uchar x);
void main()
{ init();
while(1)
{ keyscan();
signal_out=0;
if(i==20)
{
i=0;
signal_out=1;
if(signal==0)
{
delay(3);
if(signal==0)
{
while(!signal);
num--;
if(num==0)
TR0=0;
signal_out= 1;
}
}
}
display(num);
}
}
void init() //定时器初始化
{ TMOD=0X01;
TH0=(65536-45872)/256;
TL0=(65536-45872)%256;
EA=1;
ET0=1;
TR0=1;
}
void time0()interrupt 1//中断函数
{ TH0=(65536-45872)/256;
TL0=(65536-45872)%256;
i++;
}
void keyscan() //按键扫描
{ if(en==0)
{delay(5);
if(en==0)
{ while(!en);
TR0=0;
j++;
if(j==4)
j=0;
switch(j)
{ case 0:{led=0;led1=1;led2=1;led3=1;};break;
case 1:{led=1;led1=0;led2=1;led3=1;};break;
case 2:{ led=1;led1=1;led2=0;led=1;};break;
case 3:{led=1;led1=1;led2=1;led3=0;};break;
}
}
}
if(jia==0)
{delay(5);
if(jia==0)
{ while(!jia);
n++;
if(n==2)
{ n=1;
l++;
}
switch(j)
{ case 1:{ num1=n*10;
if(l>10)
{ l=0;
num1=num1-100;
}
};break;
case 2:{num1=n*100;
if(l>10)
{ l=0;
num1=num1-1000;
}
};break;
case 3:{num1=n*1000;
if(l>10)
{ l=0;
num1=num1-10000;
}
};break;
}
num=num+num1;
display(num);
}
}
if(m==0)
{ delay(5);
if(m==0)
TR0=1;
while(!m);
led=1;
led1=1;
led2=1;
led3=1;
}
}
void display(uint num)//显示
{
uchar qian, bai,shi,ge;
//num=num1+num;
if(num==10000)
num=0;
qian=num/1000;
bai=num%1000/100;
shi=num%100/10;
ge=num%10;
P2=0xf7;
P0=table[qian];
delay(2);
P2=0xff;
P2=0xfb;
P0=table[bai];
delay(2);
P2=0xff;
P2=0xfd;
P0=table[shi];
delay(2);
P2=0xff;
P2=0xfe;
P0=table[ge];
delay(2);
P2=0xff;
}
void delay(uchar x)//延时
{ uchar i,j;
for(i=x;i>0;i--)
for(j=110;j>0;j--);
} |