#include<reg52.h>#define uchar unsigned char#define uint unsigned intuchar code table[]=" 2011-10-03 MON"; uchar code table1[]=" 00:00:00"; sbit lcden=P2^7;sbit lcdrs=P2^6;sbit lcdrw=P2^5;sbit dscs=P1^0;sbit dsas=P1^1;sbit dsrw=P1^2;sbit dsds=P1^3;sbit dsirq=P3^3;sbit s1=P3^0;sbit s2=P3^1;sbit s3=P3^2;sbit rd=P3^7;uchar num,nian,yue,ri,zhou,s1num,flag; char miao,fen,shi;void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void write_com(uchar com){lcdrs=0;P0=com;delay(5);lcden=1;delay(5);lcden=0;}void write_date(uchar date){lcdrs=1;P0=date;delay(5);lcden=1;delay(5);lcden=0;}void write_ds(uchar add,uchar date) {dscs=0;dsas=1;dsds=1;dsrw=1;P0=add;dsas=0;dsrw=0;P0=date;dsrw=1;dsas=1;dscs=1;}uchar read_ds(uchar add){uchar ds_date;dsas=1;dsds=1;dsrw=1;dscs=0;P0=add;dsas=0;dsds=0;P0=0xff;ds_date=P0;dsds=1;dsas=1;dscs=1;return ds_date;}void write_sfm(uchar add,uchar date) {uchar shi,ge;shi=date/10;ge=date%10;write_com(0x80+0x40+add);write_date(0x30+shi);write_date(0x30+ge);}void write_nyr(uchar add,uchar date) {uchar shi,ge;shi=date/10;ge=date%10;write_com(0x80+add);write_date(0x30+shi);write_date(0x30+ge);}/*void set_time(){write_ds(0,0);write_ds(1,0);write_ds(2,0);write_ds(3,0);write_ds(4,0);write_ds(5,0);write_ds(6,0);write_ds(7,0);write_ds(8,0);write_ds(9,0);} */void write_week(char date){write_com(0x80+13);switch(date){case 1: write_date('M');delay(5);write_date('O');delay(5);write_date('N');break;case 2: write_date('T');delay(5);write_date('U');delay(5);write_date('S');break;case 3: write_date('W');delay(5);write_date('E');delay(5);write_date('D');break;case 4: write_date('T');delay(5);write_date('H');delay(5);write_date('U');break;case 5: write_date('F');delay(5);write_date('R');delay(5);write_date('I');break;case 6: write_date('S');delay(5);write_date('A');delay(5);write_date('T');break;case 7: write_date('S');delay(5);write_date('U');delay(5);write_date('N');break;}}void set_time(){//write_ds(2,30);//write_ds(4,12);//write_ds(9,11);write_ds(8,10);write_ds(7,4);write_ds(6,2);}void keyscan(){rd=0;//s1=0;if(s1==0){delay(5);if(s1==0);{flag=1;s1num++;while(!s1);if(s1num==1){write_com(0x80+0x40+10);write_com(0x0f);} //delay(1000);}if(s1num==2){write_com(0x80+0x40+7);write_com(0x0f);//delay(1000);}if(s1num==3){write_com(0x80+0x40+4);write_com(0x0f);//delay(1000);}if(s1num==4){ flag=0;s1num=0;write_com(0x0c);}}if(s1num!=0){if(s2==0){delay(5);if(s2==0){while(!s2);if(s1num==1){miao++;if(miao==60)miao=0;write_sfm(10,miao);write_com(0x80+0x40+10);write_ds(0,miao);}if(s1num==2){fen++;if(fen==60)fen=0;write_sfm(7,fen);write_com(0x80+0x40+7);write_ds(2,fen);}{shi++;if(shi==24)shi=0;write_sfm(4,shi);write_com(0x80+0x40+4);write_ds(4,shi);}}}if(s3==0){delay(5);if(s3==0){while(!s3);if(s1num==1){/* if(miao==0){miao=59;write_sfm(10,miao);write_com(0x80+0x40+10);}*/miao--;if(miao==-1)miao=59;write_sfm(10,miao);write_com(0x80+0x40+10);write_ds(0,miao);}if(s1num==2){fen--;if(fen==-1)fen=59;write_sfm(7,fen);write_com(0x80+0x40+7);write_ds(2,fen);}if(s1num==3){shi--;shi=23;write_sfm(4,shi);write_com(0x80+0x40+4);write_ds(4,shi);}}}}}void init(){lcdrw=0;lcden=0;// write_ds(0x0A,0x20); //// write_ds(0x0B,0x26); //// set_time(); //这三句话为初始化DS12C887,首次使用时调用这三句话,此后不必调用set_time();write_com(0x38);write_com(0x0e);write_com(0x06);write_com(0x01);write_com(0x80);for(num=0;num<15;num++){write_date(table[num]);delay(5);}write_com(0x80+0x40);for(num=0;num<12;num++){write_date(table1[num]);delay(5);}// EA=1;// EX0=1;// IT0=1;}void main(){init();while(1){keyscan();if(flag==0){miao=read_ds(0);fen=read_ds(2);shi=read_ds(4);nian=read_ds(9);yue=read_ds(8);ri=read_ds(7);zhou=read_ds(6);write_sfm(10,miao);write_sfm(7,fen);write_sfm(4,shi);write_nyr(4,nian);write_nyr(7,yue);write_nyr(10,ri);write_week(zhou);}}}。