/*********************
倒计时
*********************/
#include "STC_NEW_8051.H"
#define WORD unsigned int
char getkey(void);
code char dchr[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,00};
/* 0 1 2 3 4 5 6 7 8 9 */
/*{0x3F,0x30,0x5B,0x79,0x74,0x6D,0x6F,0x38,0x7F,0x7D,00};*/
code mon[]={0,31,28,31,30,31,30,31,31,30,31,30,31,0};
void set_date();
void r_clock();
void w_clock();
void writertc(char m,char d);
char readrtc(char m);
#define DELAYT 20
void delay(int k) ;
char Bcd_Bin(char );
char Bin_Bcd(char );
typedef struct{
char SEC;
char MIN;
char HR;
char DATE;
char MONTH;
char DAY;
char YEAR;
}CLOCK;
code char bm[]={0,6,4,3,2,1,0,7,8,9} ;
CLOCK CLOCK_BUF;
char data_y,data_m,data_d;
char yy,mm,dd,day0;
char yy1,mm1,dd1,day1;
sbit SCLK= P1^4;
sbit RST= P1^6;
sbit IO = P1^5;
sbit P20 = P2^0;
sbit P21 = P2^1;
sbit P22 = P2^2;
sbit P23 = P2^3;
sbit P24 = P2^4;
sbit P25 = P2^5;
sbit P26 = P2^6;
sbit P27 = P2^7;
WORD tian;
char ii,jj,kk;
char VBUF[4];
char getkey(void)
{
char c;
/* P0=0;
c=ACC;
return c;
*/ c = 0;
P24=0;
P26=1;
if (P26==0) c='s';
P27=1;
if (P27==0) c='+';
P24=1;
P25=0;
P26=1;
if (P26==0) c='1';
P27=1;
if (P27==0) c='2';
P25=1;
P24=0;
P25=0;
while (P26 ==0) {P26=1;}
while (P27 ==0) {P27=1;}
P24=1;
P25=1;
return c;
}
void dis(char d )
{
P0=dchr[d] ;
delay(10);
P0=0x80 ;
delay(3);
}
void dis1(void )
{
P20=1;
dis(VBUF[0]) ;
P20=0;
P21=1;
dis(VBUF[1]) ;
P21=0;
P22=1;
dis(VBUF[2]) ;
P22=0;
}
/***********************************************************/
void delay(int k)
{
WORD i;
char t;
for (i=0;i<k;i++)
for (t=0;t<DELAYT;t++) /* delay 1ms */
{ }
}
void set_date()
{
char c,*p;
p=&CLOCK_BUF.SEC;
r_clock();
for (ii=1;;)
{
for (;;)
{
VBUF[0]=ii;
VBUF[1]=p[bm[ii]] / 16;
VBUF[2]=p[bm[ii]] % 16;
dis1();
c = getkey();
if (c != 0) break;
}
delay(1000);
if (c=='s') break;
if (c=='+') {ii ++ ; if (ii==10) ii=1 ;}
if (c=='1') p[bm[ii]]=((VBUF[1]+1) % 10)*16+VBUF[2] ;
if (c=='2') p[bm[ii]]=VBUF[1]*16+(VBUF[2]+1) % 10 ;
}
w_clock();
}
void wrtc(char m)
{
char i,j,d;
d=m;
for (i=0;i<8;i++)
{
SCLK=0;
j=d & 1;
IO = j;
d=(d>>1);
SCLK=1 ;
}
}
char rrtc(void)
{
char i,j,d;
d=0;
for (i=0;i<8;i++)
{
SCLK=0;
j=IO ;
d=(d>>1);
if (j)
d=d | 0x80;
SCLK=1 ;
}
return d;
}
char readrtc(char m)
{
char i;
SCLK=0 ;
RST=1 ;
wrtc(m);
i=rrtc();
RST=0 ;
SCLK=1;
IO=1;
return i;
}
void writertc(char m,char d)
{
SCLK=0 ;
RST=1 ;
wrtc(m) ;
wrtc(d) ;
RST=0 ;
SCLK=1;
IO=1;
}
void r_clock()
{
char c,d;
char *p;
p=&CLOCK_BUF.SEC;
for (c=0x81;c<0x8e;c+=2)
{
d = readrtc(c);
if (d >100)
d = readrtc(c);
*p++ = d ;
}
data_y=readrtc(0xc1);
data_m=readrtc(0xc3);
data_d=readrtc(0xc5);
}
void w_clock()
{
char c,d;
char *p;
p=&CLOCK_BUF.MIN;
writertc(0x8e,0x00); /* Open write protection*/
writertc(0x80,0x80); /* Stop real time clock */
for (c=0x82;c<0x8e;c+=2)
{
d=*p++;
writertc(c,d); /* Start real time clock */
}
writertc(0xc0,data_y);
writertc(0xc2,data_m);
writertc(0xc4,data_d);
d=CLOCK_BUF.SEC;
writertc(0x80,d); /* Start real time clock */
writertc(0x90,0x00); /* */
writertc(0x8e,0x80); /* Set Write Protection */
}
char Bcd_Bin(char bcd )
{
return ((bcd/16)*10+bcd % 16) ;
}
signed char cmp(void)
{
if (yy >data_y) return 1; /*当天大于预制日期 返回 1 */
if (yy <data_y) return -1;
if (mm >data_m) return 1;
if (mm <data_m) return -1;
if (dd >data_d) return 1;
if (dd <data_d) return -1;
return 1;
}
main()
{
char a;
signed char b;
char c,d;
beg:
r_clock();
day0=CLOCK_BUF.DATE ;
yy=Bcd_Bin(CLOCK_BUF.YEAR) ;
mm=Bcd_Bin(CLOCK_BUF.MONTH) ;
dd=Bcd_Bin(CLOCK_BUF.DATE) ;
data_y=Bcd_Bin(data_y) ;
data_m=Bcd_Bin(data_m) ;
data_d=Bcd_Bin(data_d) ;
tian=0;
b=cmp();
if (b ==1)
{
dd1=dd;
mm1=mm;
yy1=yy;
dd=data_d;
mm=data_m;
yy=data_y;
}
else
{
dd1=data_d;
mm1=data_m;
yy1=data_y;
}
for (;;)
{
if (yy==yy1 && mm==mm1 && dd==dd1) break;
if (tian>1000) break;
dd ++;
tian ++;
d=mon[mm];
if (yy % 4 ==0 && mm==2) d++ ;
if (dd > d)
{
dd=1;
mm ++ ;
if (mm>12) { yy++;mm=1;}
}
}
a=0;
for(;;)
{
a ++ ;
if (a==0)
{CLOCK_BUF.DATE=readrtc(0x87); if (day0 != CLOCK_BUF.DATE)
{day0=CLOCK_BUF.DATE ;tian +=b ;}
}
VBUF[2]=tian % 10; /* 计时天数 */
VBUF[1]=(tian/10) % 10;
VBUF[0]=(tian/100) % 10;
dis1();
c=getkey();
if (c=='s') {set_date();goto beg;}
}
}
/******** E N D ****************/