后来修改成这个样子,但还是两个同时计时,而且按下按键1不可以从0开始,而是从1开始,而且为什么从一到二需要的时间比二到三时间更多
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar code seg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf}; //段码
uchar code seg_scan[]={10,10,10,10};//位选码
uchar seg_buf[2]={0x01,0x02};//数码管显示缓冲区
void t0();//t0初始化
void ex();//外部中断初始化
void display(uchar date,uchar get);//数码管显示函数
void delayme(uint xms);//延时函数
uchar a=0,count=0;
uchar flags=0;//定时标志
void main()
{ t0();
ex();
while(1)
{if(flags==0)
{
flags=1;
a++;
if(a>=60)
{
a=0;
}
seg_buf[0]=seg[a%10]; //低位
seg_buf[1]=seg[a/10]; //高位
}
}
}
void display(uchar date,uchar get)
{ P2 = (P2&0x1f)|0xc0;
P0=0X01<<get;
P2 = (P2&0x1f)|0xf9;
P0=date;
}
void t0()
{ TMOD=0X01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
ET0=1; //打开t0中断开关
PT0=0;
EA=1; //打开中断总开关
}
void ex()
{ IT0=1;
EX0=1;
PX0=1;
IT1=1;
EX1=1;
PX1=1;
EA=1;
}
void t0_int() interrupt 1
{ uchar i=0;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
count++;
if(count>=20)
{count=0;
flags=0;
}
P0=0XFF;
switch(i)
{ case 0:i++;display(seg_buf[0],1);break;
case 1:i++;display(seg_buf[1],0);break;
default:break;
}
}
void key1()interrupt 0
{
TR0=1;//启动t0
a=0x00;
IE0=0;//清int0中断标志位
}
void key2()interrupt 2
{
TR0=0;//启动t0
IE1=0;//清int1中断标志位
}
|