#define XZ 8
#define Ru(x) (x+XZ)>59? (x+XZ-60):(x+XZ)
#define Delay10Us {_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();}
#define Delay100Us {Delay10Us;Delay10Us;Delay10Us;Delay10Us;Delay10Us;\
Delay10Us;Delay10Us;Delay10Us;Delay10Us;Delay10Us;}
#define TIME_SECOND XBYTE[0x7f00]
#define TIME_MINUTE XBYTE[0x7f02]
#define TIME_HOUR XBYTE[0x7f04]
#define TIME_DAY XBYTE[0x7f06]
#define TIME_DATE XBYTE[0x7f07]
#define TIME_MONTH XBYTE[0x7f08]
#define TIME_YEAR XBYTE[0x7f09]
#define REGISTERA XBYTE[0x7f0A]
#define REGISTERB XBYTE[0x7f0B]
#define REGISTERC XBYTE[0x7f0C]
#define REGISTERD XBYTE[0x7f0D]
sbit P_LED_R=P3^0;
sbit P_LED_G=P3^4;
sbit P_LED_B=P3^1;
sbit Key1=P1^6;
sbit Key2=P1^7;
sbit Key0=P3^5;
sbit Put_LED=P3^3;
unsigned char code LED_COL[8][3]=
{
1,1,1, //白
1,0,0, //红
0,1,0, //绿
0,0,1, //蓝
1,1,0, //黄
1,0,1, //品红
0,1,1, //青
0,0,0, //黑
};
unsigned char code COL_MOD[3][5]=
{
4,0,3,2,1,
5,1,4,2,3,
6,2,3,4,1
};
unsigned char code CH[]={32,32,32,32,32,32,32,32,
68,73,89,32,76,69,68,32,
80,79,86,32,72,68,68,32,
67,76,79,67,75,32,32,32,
32,32,32,32,32,32
};
unsigned char code SD[5][6]={
77,73,78,85,84,69,
72,79,85,82,32,32,
68,65,84,69,32,32,
77,79,78,84,72,32,
89,69,65,82,32,32
};
unsigned char code maxnum[]={59,23,31,12,99,7};
unsigned char code minnum[]={0,0,1,1,0,1};
unsigned char Time[7];
unsigned char t1,t2,t3,M1,M2,M3;
unsigned char PT_col[60],BL_col,KD_col;
unsigned char m,n,t,co,ST,CM,TZ,BZ;
unsigned int Tn,Tn0,Ti0,Ti1,Ti2,Ti,k,p;
unsigned int RT=34100;
/*********************************************************************************************/
void intersvr0(void) interrupt 0 using 1
{
if(ST==5) {
Tn=0;
TH0=-Ti2/256;TL0=-Ti2%256;
}
else {
TH0=-Ti1/256;TL0=-Ti1%256;
m=0;
}
}
void timer0(void) interrupt 1
{
TH0=-Ti0/256;TL0=-Ti0%256;
if(ST==0){
if(p<420) p++; else {p=0; ST=1;};
P_LED_R=LED_COL[7-p/70][0];
P_LED_G=LED_COL[7-p/70][1];
P_LED_B=LED_COL[7-p/70][2];
}
if((ST>0)&&(ST<5)) {
if(m P_LED_R=LED_COL[m][0];
P_LED_G=LED_COL[m][1];
P_LED_B=LED_COL[m][2];
}
}
void timer1(void) interrupt 3 using 1
{
if(ST==5){
TH1=-3;TL1=-21;
P_LED_R=LED_COL[PT_col[Tn]][0];
P_LED_G=LED_COL[PT_col[Tn]][1];
P_LED_B=LED_COL[PT_col[Tn]][2];
Delay100Us;Delay100Us;Delay100Us;
P_LED_R=LED_COL[BL_col][0];
P_LED_G=LED_COL[BL_col][1];
P_LED_B=LED_COL[BL_col][2];
Tn++;
}
if(ST<5) {TH1=Ti/256;TL1=Ti%256;}
if(ST==0) Ti0=RT;
if(ST==1) {if(t<3) t++; else {t=0;if(k>8) k--; else ST=4; Ti0=100*k;}}
//if(ST==2) {if(t<8) t++; else {t=0;if(n>1) n--; else ST=3; Ti0=RT/n-44;}}
//if(ST==3) {if(t<40) t++; else {t=0;if(n<24) n++; else ST=4; Ti0=RT/n-44;}}
if(ST==4) {if(t<40) t++; else {t=0;if(co>1) co--; else {ST=5;Ti0=0;Ti1=160;Ti2=0;};Ti0=RT/24-44;}}
}
SetupDs12887(void)
{
REGISTERA = 0x70;
REGISTERB = 0xa2;
TIME_SECOND= NUM2BCD(Time[0]);
TIME_MINUTE= NUM2BCD(Time[1]);
TIME_HOUR = NUM2BCD(Time[2]);
TIME_DATE = NUM2BCD(Time[3]);
TIME_MONTH = NUM2BCD(Time[4]);
TIME_YEAR = NUM2BCD(Time[5]);
REGISTERA = 0x20;
REGISTERB = 0x22;
}
void ReadDs12887(void)
{
Time[0] = BCD2NUM(TIME_SECOND);
Time[1] = BCD2NUM(TIME_MINUTE);
Time[2] = BCD2NUM(TIME_HOUR);
Time[3] = BCD2NUM(TIME_DATE);
Time[4] = BCD2NUM(TIME_MONTH);
Time[5] = BCD2NUM(TIME_YEAR);
}
void Delay_100Us(unsigned int tt)
{
unsigned char ii;
for(;tt>0;tt--)
for(ii=94;ii>0;ii--);
}
/*主程序*/
void main(void)
{
unsigned char i,j;
unsigned char kdxz=3;
P3=0xff;
m=0;k=339;
n=60;
Ti0=RT/n;
Ti1=57;
Ti2=1750;
Ti=43600;
ST=0;
co=7;
CM=0;
BL_col=COL_MOD[CM][0];
KD_col=COL_MOD[CM][1];
TMOD=0x11;
TH0=0; TL0=0;
TR0=1; ET0=1;
TH1=0; TL1=0;
TR1=1; ET1=1;
IT0=1; EX0=1;
for(i=0;i<60;i++) PT_col[i]=BL_col;
PT_col[0+kdxz]=0;
PT_col[5+kdxz]=0;
PT_col[10+kdxz]=0;
PT_col[15+kdxz]=0;
PT_col[20+kdxz]=0;
PT_col[25+kdxz]=0;
PT_col[30+kdxz]=0;
PT_col[35+kdxz]=0;
PT_col[40+kdxz]=0;
PT_col[45+kdxz]=0;
PT_col[50+kdxz]=0;
PT_col[55+kdxz]=0;
Delay_100Us(9000);
Delay_100Us(9000);
Delay_100Us(9000);
EA=1;
P_LED_R=0;
P_LED_G=0;
P_LED_B=0;
for(;;){
if(TZ==0) ReadDs12887();
Delay_100Us(50);
Delay_100Us(50);
if((ST>2)&&(TZ==0)){
M1=Time[0];M2=Time[1];M3=Time[2];
DIGPORT=0xec; WORDPORT=0x30+Time[3]%10;
DIGPORT=0xed; WORDPORT=0x30+Time[3]/10;
DIGPORT=0xee; WORDPORT=0x2d;
DIGPORT=0xef; WORDPORT=0x30+Time[4]%10;
DIGPORT=0xd3; WORDPORT=0x30+Time[4]/10;
DIGPORT=0xd7; WORDPORT=0x2d;
DIGPORT=0xdb; WORDPORT=0x30+Time[5]%10;
DIGPORT=0xdf; WORDPORT=0x30+Time[5]/10;
}
if((ST<3)&&(TZ==0)){
for(j=0;j<30;j++){
DIGPORT=0xec; WORDPORT=CH[7+j];
DIGPORT=0xed; WORDPORT=CH[6+j];
DIGPORT=0xee; WORDPORT=CH[5+j];
DIGPORT=0xef; WORDPORT=CH[4+j];
DIGPORT=0xd3; WORDPORT=CH[3+j];
DIGPORT=0xd7; WORDPORT=CH[2+j];
DIGPORT=0xdb; WORDPORT=CH[1+j];
DIGPORT=0xdf; WORDPORT=CH[0+j];
Delay_100Us(2360);
}
Delay_100Us(9000);
}
if((TZ>0)&&(BZ==1))
{
DIGPORT=0xec; WORDPORT=0x30+Time[TZ]%10;
DIGPORT=0xed; WORDPORT=0x30+Time[TZ]/10;
DIGPORT=0xee; WORDPORT=SD[TZ-1][5];
DIGPORT=0xef; WORDPORT=SD[TZ-1][4];
DIGPORT=0xd3; WORDPORT=SD[TZ-1][3];
DIGPORT=0xd7; WORDPORT=SD[TZ-1][2];
DIGPORT=0xdb; WORDPORT=SD[TZ-1][1];
DIGPORT=0xdf; WORDPORT=SD[TZ-1][0];
BZ=0;
M1=Time[0];M2=Time[1];M3=Time[2];
}
Delay_100Us(50);
Delay_100Us(50);
PT_col[t1]=BL_col;
PT_col[t2]=BL_col;
PT_col[t3]=BL_col;
if(M3>12) M3=M3-12;
t1=Ru(M1);t2=Ru(M2);t3=Ru(M3*5+M2/12);
PT_col[0+kdxz]=KD_col;
PT_col[5+kdxz]=KD_col;
PT_col[10+kdxz]=KD_col;
PT_col[15+kdxz]=KD_col;
PT_col[20+kdxz]=KD_col;
PT_col[25+kdxz]=KD_col;
PT_col[30+kdxz]=KD_col;
PT_col[35+kdxz]=KD_col;
PT_col[40+kdxz]=KD_col;
PT_col[45+kdxz]=KD_col;
PT_col[50+kdxz]=KD_col;
PT_col[55+kdxz]=KD_col;
PT_col[t1]=COL_MOD[CM][2];
PT_col[t2]=COL_MOD[CM][3];
PT_col[t3]=COL_MOD[CM][4];
Delay_100Us(50);
Delay_100Us(50);
if(Key0==0){
Delay_100Us(80);
if(Key0==0) {if(TZ<5) TZ++; else {TZ=0; SetupDs12887();};BZ=1;}
}
if(Key1==0){
Delay_100Us(50);
if(Key1==0) {if(Time[TZ] }
if(Key2==0){
Delay_100Us(50);
if(Key2==0) {if(Time[TZ]>minnum[TZ-1]) Time[TZ]--; else Time[TZ]=maxnum[TZ-1];BZ=1;}
}
Delay_100Us(50);
Delay_100Us(50);
if(TZ!=0) Put_LED=~Put_LED; else Put_LED=1;
Delay_100Us(50);
Delay_100Us(50);
}
}