#include<reg52.h> //12864显示
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
uchar code table[]="shidu:"; //把你要显示的东西写成数组
uchar code table1[]="wendu:";
sbit out = P1^0;
uchar a,miao,shi,fen,ri,yue,nian,week,temp;
sbit SCLK=P2^1; // 6 P1.1
sbit IO=P2^0; // 7 P1.0
sbit RST=P2^4; //时钟 5 P1.2
sbit ACC0=ACC^0;
sbit ACC7=ACC^7;
sbit shinen=P2^7; //使能
sbit RS=P2^6; //数据命令选择端
sbit RW=P2^5; //读或写的选择
uchar num;
bit flag=0;
uchar code tab1[]={"2019-12-06"};
uchar code tab2[]={"17:17:00"};
uchar code tab3[]={"5"};
/*********************over***********************/
void delay30us(void) //误差 0us
{
unsigned char a,b;
for(b=3;b>0;b--)
for(a=3;a>0;a--);
}
void delay20ms(void) //误差 0us
{
unsigned char a,b;
for(b=215;b>0;b--)
for(a=45;a>0;a--);
_nop_(); //if Keil,require use intrins.h
_nop_(); //if Keil,require use intrins.h
}
void delay40us(void) //误差 0us
{
unsigned char a,b;
for(b=1;b>0;b--)
for(a=17;a>0;a--);
}
void delay(uint xms) //xms等于几就延迟几毫秒
{
uint i,j;
for(i=xms;i>0;i--)
for(j=112;j>0;j--);
}
void xieminglin(uchar com) //写命令
{
RS=0;
RW=0;
P0=com;
delay(5);
shinen=1;
delay(5);
shinen=0;
}
void xieshuju(uchar date) //写数据
{
RS=1;
RW=0;
P0=date;
delay(5);
shinen=1;
delay(5);
shinen=0;
}
void chushihua() //初始化
{
shinen=0;
delay(15);
xieminglin(0x30); //初始化操作
xieminglin(0x0c);
xieminglin(0x01);
}
/********************dht11****************************/
void t11chushihua()
{
out=0;
delay20ms();
out=1;
delay40us();
}
uchar dushuju()
{
uchar num=0;
uchar i;
for(i=0;i<8;i++)
{
while(out==0);
flag=0;
delay30us();
if(out==1)
flag=1;
num=num<<1;
num=num|flag;
while(out==1);
}
return num;
}
/********************ds1302****************************/
void write_byte(uchar dat)
{
ACC=dat;
RST=1;
for(a=8;a>0;a--)
{
IO=ACC0;
SCLK=0;
SCLK=1;
ACC=ACC>>1;
}
}
uchar read_byte()
{
RST=1;
for(a=8;a>0;a--)
{
ACC7=IO;
SCLK=1;
SCLK=0;
ACC=ACC>>1;
}
return (ACC);
}
void write_1302(uchar add,uchar dat)
{
RST=0;
SCLK=0;
RST=1;
write_byte(add);
write_byte(dat);
SCLK=1;
RST=0;
}
uchar read_1302(uchar add)
{
uchar temp;
RST=0;
SCLK=0;
RST=1;
write_byte(add);
temp=read_byte();
SCLK=1;
RST=0;
return(temp);
}
uchar BCD_Decimal(uchar bcd)
{
uchar Decimal;
Decimal=bcd>>4;
return(Decimal=Decimal*10+(bcd&=0x0F));
}
void ds1302_init()
{
RST=0;
SCLK=0;
write_1302(0x80,miao|0x00);//允许写
write_1302(0x8e,0x00);
miao= (tab2[6]-0x30)*10+(tab2[7]-0x30);
temp=(miao)/10*16+(miao)%10;
write_1302(0x80,0x00|temp);
fen= (tab2[3]-0x30)*10+(tab2[4]-0x30);
temp=(fen)/10*16+(fen)%10;
write_1302(0x82,0x00|temp);
shi= (tab2[0]-0x30)*10+(tab2[1]-0x30);
temp=(shi)/10*16+(shi)%10;
write_1302(0x84,0x00|temp);
ri= (tab1[8]-0x30)*10+(tab1[9]-0x30);
temp=(ri)/10*16+(ri)%10;
write_1302(0x86,0x00|temp);
yue= (tab1[5]-0x30)*10+(tab1[6]-0x30);
temp=(yue)/10*16+(yue)%10;
write_1302(0x88,0x00|temp);
week= (tab3[0]-0x30);
temp=week;
write_1302(0x8A,0x00|temp);
nian= (tab1[2]-0x30)*10+(tab1[3]-0x30);
temp=(nian)/10*16+(nian)%10;
write_1302(0x8C,0x00|temp);
write_1302(0x8e,0x80);
}
void ds1302readtime() //读取ds1302的时间
{
miao = BCD_Decimal(read_1302(0x81));
fen = BCD_Decimal(read_1302(0x83));
shi = BCD_Decimal(read_1302(0x85));
ri = BCD_Decimal(read_1302(0x87));
yue = BCD_Decimal(read_1302(0x89));
nian=BCD_Decimal(read_1302(0x8d));
week=BCD_Decimal(read_1302(0x8b));
xieminglin(0x80);
xieshuju(2+0x30);
xieshuju(0+0x30);
xieshuju(nian/10+0x30);
xieshuju(nian%10+0x30);
xieshuju('-');
xieshuju(yue/10+0x30);
xieshuju(yue%10+0x30);
xieshuju('-');
xieshuju(ri/10+0x30);
xieshuju(ri%10+0x30);
xieshuju(' ');
xieshuju(week+0x30);
xieminglin(0x90);
xieshuju(shi/10+0x30);
xieshuju(shi%10+0x30);
xieshuju(':');
xieshuju(fen/10+0x30);
xieshuju(fen%10+0x30);
xieshuju(':');
xieshuju(miao/10+0x30);
xieshuju(miao%10+0x30);
}
void lcdshow1(uchar wendu)
{
xieminglin(0x88); //写入命令,第一行
for(num=0;num<6;num++) //写入数据,每一位数据之间有延时
{
xieshuju(table[num]);
delay(5);
}
xieshuju(wendu/10+0x30);
delay(5);
xieshuju(wendu%10+0x30);
delay(5);
}
void lcdshow2(shidu)
{
xieminglin(0x98); //写入命令,第二行
for(num=0;num<6;num++) //写入数据
{
xieshuju(table1[num]);
delay(5);
}
xieshuju(shidu/10+0x30);
delay(5);
xieshuju(shidu%10+0x30);
delay(5);
}
void main()
{
uchar wendu1=0;
uchar wendu2=0;
uchar shidu1=0;
uchar shidu2=0;
uchar jiaoyan=0;
uchar ture=0;
chushihua();
ds1302_init();
while(1)
{
t11chushihua();
if(out==0)
{
while(out==0);
while(out==1);
wendu1=dushuju();
wendu2=dushuju();
shidu1=dushuju();
shidu2=dushuju();
jiaoyan=dushuju();
ture=wendu1+wendu2+shidu1+shidu2;
if(jiaoyan==ture)
{
ds1302readtime();
lcdshow1(wendu1);
lcdshow2(shidu1);
}
else
{
ds1302readtime();
}
}
}
}