#include<reg52.h>
#include<INTRINS.H>
/************************************************************/
#define uchar unsigned char
#define uint unsigned int
#define write_second 0x80 //秒開始數(shù)存儲,修改用(下同)
#define write_minute 0x82 //分開始數(shù)存儲
#define write_hour 0x84 //時開始數(shù)存儲,12小時計時,從0開始要寫入0x80(12小時要判斷上下午)。
#define read_second 0x81 //秒,顯示要讀這個存儲器
#define read_minute 0x83 //分,顯示要讀這個存儲器
#define read_hour 0x85 //時,顯示要讀這個存儲器
#define write_day 0x86
#define read_day 0x87
#define write_month 0x88
#define read_month 0x89
#define write_week 0x8A
#define read_week 0x8B
#define write_year 0x8C
#define read_year 0x8D
#define write_protect 0x8E
/************************************************************/
sbit ACC_7=ACC^7;
sbit SCLK =P1^2;
sbit DIO =P1^3;
sbit CE =P1^4; //protus軟件中的RST腳
/********************************/
uchar dd[]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f
};
void delay(char us)
{
char m,n;
while(us--)
{
for(m=0;m<40;m++)
for(n=0;n<50;n++);
}
}
/**********/
void write1302(unsigned char addr,dat)
{
unsigned char i,temp;
CE=0;
SCLK=0;
CE=1;
for(i=0;i<8;i++) //寫入地址
{
SCLK=0;
temp=addr;
if(temp&0x01==0x01)
DIO=1;
else
DIO=0;
addr>>=1;
SCLK=1;
}
for(i=0;i<8;i++) //寫入數(shù)據(jù)
{
SCLK=0;
temp=dat;
if(temp&0x01==0x01)
DIO=1;
else
DIO=0;
dat>>=1;
SCLK=1;
}
}
unsigned char read1302(unsigned char addr)
{
unsigned char i,temp,dat1,dat2;
CE=0;
SCLK=0;
CE=1;
for(i=8;i>0;i--)//寫入讀存儲單元地址
{
SCLK =0;
temp =addr;
if(temp&0x01==0x01)
DIO=1;
else
DIO=0;
addr>>=1;
SCLK=1;
}
for(i=8;i>0;i--)//讀數(shù)據(jù)
{
ACC_7=DIO;
SCLK=1;
ACC>>=1;
SCLK=0; //下降沿讀出數(shù)據(jù)
}
CE=0;
dat1=ACC;
dat2=dat1/16;
dat1=dat1%16;
dat1=dat1+dat2*10;
return(ACC);
}
/////////////////////////////////////
void Initial(void)
{
write1302(write_protect,0x00);
write1302(write_second,0x56);
write1302(write_minute,0x34);
write1302(write_hour,0x12);
write1302(write_protect,0x80);
}
/////////////////////
void main(void)
{
unsigned char tt1,tt2,hour;
Initial();
write1302(write_second,0x55); //秒從55開始
write1302(write_minute,0x59); //分從59開始
write1302(write_hour,0x8B); //賦值0x80,為12小時計時,但低五位為計時為,所以,顯示只顯示低五位,小時從11開始
write1302(write_year,0x0f); //15年
write1302(write_week,0x03);//周三
write1302(write_month,0x0a);//10月
while(1)
{
tt1=read1302(read_second);
tt2=read1302(read_hour) & 0x1f; //取出低五位
if(read1302(read_hour) & 0x20==0x20) //12小時計時判斷上下午
hour="pm "; // afternoon
else
hour="am ";//morning
P0=dd[tt1/10];
P2=0xfe;
delay(2);
P2=0xff;
P0=dd[tt1%10];
P2=0xfd;
delay(2);
P2=0xff;
P0=dd[tt2/10];
P2=0xf7;
delay(2);
P2=0xff;
P0=dd[tt2%10];
P2=0xfb;
delay(2);
P2=0xff;
}
}
|