下面是我寫的,不對啊(讀不出),如果哪位有通過DS1302,將時間顯示在1602LCD上的代碼,貼出來感激不盡。
問題已解決,代碼在2樓,感謝51黑電子論壇
- #include<reg52.h>
- #define uint unsigned int
- #define uchar unsigned char
- sbit wela=P1^4;
- sbit dula=P3^6;
- sbit lcdrs=P1^7;
- sbit lcdrw=P1^6;
- sbit lcden=P1^5;
- sbit ds_sclk=P3^0;
- sbit ds_io=P3^1;
- sbit ds_rst=P3^2;
- sbit ACC0=ACC^0;
- sbit ACC7=ACC^7;
- //sbit s1=P3^3;
- //sbit s2=P3^4;
- uchar a[7]={0x05,0x00,0x06,0x11,0x02,0x06,0x06};
- uchar b[7]={0x01,0x01,0x01,0x00,0x01,0x01,0x01};
- uchar code table[]=" 2013-12-31 0";
- uchar code table1[]=" 23:59:54";
- uint num;//tt,shi,fen,miao,year,mon,day,week,s1num,monnum,daynum;
- void delay(uchar z) //延遲1ms
- {
- uchar x,y;
- for(x=0;x<z;x++)
- for(y=124;y>0;y--);
- }
- void write_comment(uchar com) //液晶寫地址
- {
- lcdrs=0;
- delay(5);
- P2=com;
- lcden=1;
- delay(5);
- lcden=0;
- }
- void write_date(uchar date) //液晶寫數據
- {
- lcdrs=1;
- delay(5);
- P2=date;
- lcden=1;
- delay(5);
- lcden=0;
- }
- void T_year(uchar pos,uint date) //年份轉化寫入液晶
- {
- uchar m,n,p,q;
- m=date/1000;
- n=(date%1000)/100;
- p=((date%1000)%100)/10;
- q=((date%1000)%100)%10;
- write_comment(0x80+pos);
- write_date(0x30+m);
- write_date(0x30+n);
- write_date(0x30+p);
- write_date(0x30+q);
- }
- void T_mon(uchar pos,uchar date) //月份轉化寫入液晶
- {
- uchar m,n;
- m=date/10;
- n=date%10;
- write_comment(0x80+pos);
- write_date(0x30+m);
- write_date(0x30+n);
- }
- void T_week(uchar date) //星期轉化寫入液晶
- {
- write_comment(0x80+12);
- write_date(date);
- }
- void T_day(uchar pos,uchar date) //日期轉化寫入液晶
- {
- uchar m,n;
- m=date/10;
- n=date%10;
- write_comment(0x80+pos);
- write_date(0x30+m);
- write_date(0x30+n);
- }
- void T_sfm(uchar pos,uchar date) //時分秒轉化寫入液晶
- {
- uchar m,n;
- m=date/10;
- n=date%10;
- write_comment(0x80+0x40+pos);
- write_date(0x30+m);
- write_date(0x30+n);
- }
- void inputbyte(uchar ds_date) //按位寫入
- {
- uchar i;
- ACC=ds_date;
- for(i=0;i<8;i++)
- {
- ds_io=ACC0;
- ds_sclk=1;
- ds_sclk=0;
- ACC=ACC>>1;
- }
- }
- uchar outputbyte() //按位讀出
- {
- uchar i;
- for(i=0;i<8;i++)
- {
- ACC=ACC>>1;
- ACC7=ds_io;
- ds_sclk=1;
- ds_sclk=0;
- }
- return ACC;
- }
- void w1302(uchar ds_pos,uchar ds_date) //寫時鐘
- {
- ds_rst=0;
- ds_sclk=0;
- ds_rst=1;
- inputbyte(ds_pos);
- inputbyte(ds_date);
- ds_sclk=1;
- ds_rst=0;
- }
- uchar r1302(uchar ds_pos) //讀時鐘
- {
- uchar ds_date;
- ds_rst=0;
- ds_sclk=0;
- ds_rst=1;
- inputbyte(ds_pos);
- ds_date=outputbyte();
- ds_sclk=1;
- ds_rst=0;
-
- return ds_date;
- }
- void init() //初始化寫液晶
- {
- wela=0;
- dula=0;
- lcdrw=0;
- lcden=0;
- write_comment(0x38);
- write_comment(0x01);
- write_comment(0x06);
- write_comment(0x0c);
- for(num=0;num<13;num++)
- {
- write_date(table[num]);
- delay(5);
- }
- write_comment(0x80+0x40);
- for(num=0;num<12;num++)
- {
- write_date(table1[num]);
- delay(5);
- }
- }
- void main()
- {
- uchar i;
- uchar address1,address2;
- init();
- address1=0x80;
- w1302(0x8e,0x00);
- for(i=0;i<7;i++) //寫入時鐘
- {
- w1302(address1,a[i]);
- address1+=2;
- }
- w1302(0x8e,0x80);
- while(1)
- {
- address2=0x81;
- for(i=0;i<7;i++) //讀時鐘
- {
- b[i]=r1302(address2);
- address2+=2;
- T_sfm(10,b[0]);
- delay(1);
- }
- for(i=0;i<25;i++)//寫入液晶
- {
- T_sfm(10,b[0]);
- delay(1);
- T_sfm(7,b[1]);
- delay(1);
- T_sfm(4,b[2]);
- delay(1);
- T_week(b[5]);
- delay(1);
- T_day(9,b[3]);
- delay(1);
- T_mon(6,b[4]);
- delay(1);
- T_year(1,b[6]);
- delay(1);
- }
- }
- }
復制代碼 |