#include "reg52.h"
#define uchar unsigned char
uchar code dis_7[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff}; //解码
uchar code scan_con[6]={0xff,0xff,0xf7,0xfb,0xfd,0xfe}; //列扫描控制字
uchar data timedata[6]={0x01,0x00,0x00,0x00,0x00,0x00}; //计时单元数据初值,共6个,时 分 秒
uchar data dis[8]={0x00,0x00,0x00,0x00,0x00,0x0a,0x0a,0x00}; //0x0a是全灭
uchar data conls="0x00",con04s="0x00",con="0x01";
uchar i="0";
sbit sound="P3"^3;
sbit key0=P1^4;
sbit key1=P1^5;
sbit key2=P1^6;
sbit key3=P1^7;
//
//1ms秒延时
//
delay1ms(int t)
{int i,j;
for(i="0";i for(j="0";j<120;j++)
;
}
//
//显示子函数
//
scan()
{uchar k;
for(k="2";k<6;k++) //只显示时和分,秒不显示,因为只有4位数码管
{P2=dis_7[dis[k]];P1=scan_con[k];
delay1ms(1);
P2=0xff;
}
}
//
//实现跑马灯效果,用来表示秒
//
miao()
{ i++;
if(i==1){P0=0xfe;}
else if(i==2){P0=0xfd;}
else if(i==3){P0=0xfb;}
else if(i==4){P0=0xf7;}
else if(i==5){P0=0xef;}
else if(i==6){P0=0xdf;}
else if(i==7){P0=0xbf;}
else if(i==8){P0=0x7f;i="0";}
}
//
//初始化函数
//
clearmen()
{
int i;
for(i="0";i<6;i++)
{dis=timedata;}
TH0=0X4b;TL0=0Xff; //50ms
TH1=0X4b;TL1=0Xff; //50ms
P0=0xff;
TMOD="0X11";ET0=1;TR0=1;ET1=0;TR1=0;EA="1"; //定是器1、2都工作于方式1
}
//
//键扫描子函数
//
keyscan()
{
if(key0==0)
{EA="0";sound="0";
delay1ms(10);
while(key0==0){sound="0";}
sound="1";
if(dis[con]==10)
{
dis[7]=dis[con];dis[con]=dis[6];dis[6]=dis[7];
}
con++;TR0=0;ET0=0;TR1=1;ET1=1;
if(con>=6)
{con="1";TR1=0;ET1=0;TR0=1;ET0=1;}
}
if(con!=1)
{
if(key1==0)
{sound="0";
delay1ms(10);
while(key1==0){sound="0";}
sound="1";
timedata[con]++;
if(timedata[con]>=10)
{timedata[con]=0;}
dis[con]=timedata[con];dis[6]=0x0a;
}
}
if(con!=1)
{
if(key2==0)
{ sound="0";
delay1ms(10);
while(key2==0){sound="0";}
sound="1";
if(timedata[con]==0)
{timedata[con]=0x09;}
else{timedata[con]--;}
dis[con]=timedata[con];dis[6]=0x0a;
}
}
EA="1";
}
//
//主函数
//
main()
{clearmen();
while(1)
{
scan();
keyscan();
}
}
//
//1S中断处理函数
//
void time_intt0(void) interrupt 1
{ //第一个
TR0=0;TH0=0X4b;TL0=0Xff;TR0=1; //重载初值
conls++;
if(conls==20) //一秒到了?
{
miao();
conls="0x00"; timedata[0]++; //第二个
if(timedata[0]>=10)
{ //第三个
timedata[0]=0;timedata[1]++;
if(timedata[1]>=6)
{ //第四个
timedata[1]=0;timedata[2]++;
if(timedata[2]>=10)
{timedata[2]=0;timedata[3]++; //第五个
if(timedata[3]>=6)
{ //第六个
timedata[3]=0;timedata[4]++;
if(timedata[4]>=10)
{ //第七个
timedata[4]=0;timedata[5]++;
} //第七个
if(timedata[5]==2)
{ //第八个
if(timedata[4]==4)
{timedata[4]=0;timedata[5]=0;}
} //第八个
} //第六个
} //第五个
} //第四个
} //第三个
dis[0]=timedata[0];dis[1]=timedata[1];dis[2]=timedata[2];
dis[3]=timedata[3];dis[4]=timedata[4];dis[5]=timedata[5];
} //第二个
ET0=1;
} //第一个
//
//0.4秒闪烁中断函数
//
void time_intt1(void) interrupt 3
{
TR1=0;TH1=0X3C;TL1=0XB0;TR1=1;
con04s++;
if(con04s==8)
{
con04s="0x00";
dis[7]=dis[con];dis[con]=dis[6];dis[6]=dis[7];
}
}
文章评论(0条评论)
登录后参与讨论