单片机源程序如下:
- #include<reg52.h>
- #define uint unsigned int
- #define uchar unsigned char //无符号型变量0-255
- //sbit dula=P2^6;
- //sbit wela=P2^7;
- sbit lcden=P3^4;
- sbit lcdrs=P3^5;
- sbit s1=P3^0;
- sbit s2=P3^1;
- sbit s3=P3^2;
- sbit s4=P3^3;
- sbit rd=P3^7;
- sbit dscs=P1^4;
- sbit dsas=P1^5;
- sbit dsrw=P1^6;
- sbit dsds=P1^7;
- sbit dsirq=P3^3;
- void keyscan();
- uchar num,count,s1num,flag,i;
- char miao,shi,fen,Year,Month,Date,Week; //char 有符号型变量-128-127
- uchar code table3[7][3]={"MON","TUE","WED","THU","FRI","STA","SUN"}; //星期的编码
- uchar code table[]=" 21-03-05 5";
- uchar code table1[]=" 00:00:00";
- void delay(uint z)
- {
- uint x,y;
- for(x=z;x>0;x--)
- for(y=110;y>0;y--);
- }
- void write_com(uchar com) //LCD 写指令
- {
- lcdrs=0; //RS 低电平写指令
- P0=com;
- delay(5);
- lcden=1;
- delay(5);
- lcden=0;
- }
- void write_data(uchar date) //LCD 写数据
- {
- lcdrs=1; //RS 高电平写数据
- P0=date;
- delay(5);
- lcden=1; //E=H给高脉冲
- delay(5); //E=H延时
- lcden=0; //关闭脉冲
- }
- //void set_time();
- void init() //初始化
- {
- uchar num;
- // dula=0;
- // wela=0;
- lcden=0;
- // set_time();
- dsds=0; dsds=0; dsds=0;
- write_com(0x38);
- write_com(0x0c);
- write_com(0x06);
- write_com(0x01);
- write_com(0x80); //指针位置
- for(num=0;num<15;num++) //LCD写第一行数据
- {
- write_data(table[num]);
- delay(5);
- }
- // write_com(0x80+11); //星期位置
- // for(i=0;i<3;i++)
- // {
- // write_data(table3[Week][i]); //写入星期
- // delay(5);
- // }
- write_com(0x80+0x40); //指针位置
- for(num=0;num<12;num++) //LCD写第二行数据
- {
- write_data(table1[num]); //lcd写入 时分秒
- delay(5);
- }
- }
- void write_sfm1(uchar add,uchar date1) // 年月日 写地址+数据
- {
- uchar shi,ge;
- shi=date1/10; // 整数
- ge=date1%10; // 余数
- write_com(add+0x80);
- write_data(0x30+shi); //写入LCD 数据
- write_data(0x30+ge);
- }
- void write_sfm(uchar add,uchar date) //十分秒 写地址+数据
- {
- uchar shi,ge;
- shi=date/10;
- ge=date%10;
- write_com(0x80+0x40+add);
- write_data(0x30+shi);
- write_data(0x30+ge);
- }
- void write_ds(uchar add,uchar date) //DS12C887 写地址+数据 接入P2口
- {
- dscs=0;
- dsds=1;
- dsrw=1;
- dsas=1;
- P2=add;
- dsas=0;
- dsrw=0;
- P2=date;
- dsrw=1;
- dsas=1;
- dscs=1;
- }
- uchar read_ds(uchar add) //DS12C887 读数据 接入P2口
- {
- uchar z;
- dscs=0;
- dsrw=1;
- dsds=1;
- dsas=1;
- P2=add;
- dsas=0;
- dsds=0;
- P2=0xff;
- z=P2;
- dsds=1;
- dsas=1;
- dscs=1;
- return z;
- }
- //void set_time()
- //{
- //// write_ds(3,10);
- //// write_ds(6,32);
- //}
- void main()
- {
- init();
- write_ds(0x0a,0x20); //DS12CR887寄存器A功能设置,开启时钟振荡器
- write_ds(0x0b,0x06); //寄存器B功能设置,不开启闹钟中断使能,数据模式为二进制,24小时模式。
- write_ds(0x0a,0x00); //开始调时,DS12CR887关闭时钟振荡器
- write_ds(0,55); // 初始化秒 写入55
- write_ds(2,59); // 初始化分 写入55
- write_ds(4,23); // 初始化时 写入23
- write_ds(6,7); //初始化星期
- write_ds(7,02); //初始化日
- write_ds(8,03); //初始化月
- write_ds(9,21); //初始化年
- while(1)
- {
- keyscan();
- if(flag==0)
- {
- miao=read_ds(0); //读秒
- fen=read_ds(2); //读分
- shi=read_ds(4); //读时
-
- write_sfm(9,miao); //LCD 写入秒
- write_sfm(6,fen); //LCD 写入分
- write_sfm(3,shi); //LCD 写入时
- Year=read_ds(9); //读年
- Month=read_ds(8); //读月
- Date=read_ds(7); //读日
- Week=read_ds(6); //读星期 取消使用字母星期
- write_sfm1(11,Week); //LCD 写入周 取消使用字母星期
- write_sfm1(8,Date); //LCD 写入日
- write_sfm1(5,Month); //LCD 写入月
- write_sfm1(2,Year); //LCD 写入年
- }
- }
- }
- void keyscan()
- {
- rd=0;
- if(s1==0)
- {
- delay(5);
- if(s1==0)
- {
- s1num++;
- flag=1; // flag=1 时钟停止 开始调时
- while(!s1);
- if(s1num==1)
- {
- // TR0=0;
- write_com(0x80+0x40+9);
- write_com(0x0f);
- }
- if(s1num==2)
- {
- write_com(0x80+0x40+6);
- }
- if(s1num==3)
- {
- write_com(0x80+0x40+3);
- }
- if(s1num==4)
- {
- write_com(0x80+11);
- }
- if(s1num==5)
- {
- write_com(0x80+8);
- }
- if(s1num==6)
- {
- write_com(0x80+5);
- }
- if(s1num==7)
- {
- write_com(0x80+2);
- }
- if(s1num==8)
- {
- s1num=0;
- write_com(0x0c);
- flag=0; //此时时钟开始启动
- }
- }
- }
- if(s1num!=0)
- {
- if(s2==0)
- {
- delay(5);
- if(s2==0)
- {
- while(!s2);
- if(s1num==1)
- {
- miao++;
- if(miao==60)
- miao=0;
- write_sfm(9,miao);
- write_com(0x80+0x40+9);
- write_ds(0,miao);
- }
- if(s1num==2)
- {
- fen++;
- if(fen==60)
- fen=0;
- write_sfm(6,fen);
- write_com(0x80+0x40+6);
- write_ds(2,fen);
- }
- if(s1num==3)
- {
- shi++;
- if(shi==24)
- shi=0;
- write_sfm(3,shi);
- write_com(0x80+0x40+3);
- write_ds(4,shi);
- }
- if(s1num==4)
- {
- Week++;
- if(Week==8)
- Week=1;
- write_sfm1(11,Week);
- write_com(0x80+11);
- write_ds(6,Week);
- }
- if(s1num==5)
- {
- Date++;
- if(Date==32)
- Date=1;
- write_sfm1(8,Date);
- write_com(0x80+8);
- write_ds(7,Date);
- }
- if(s1num==6)
- {
- Month++;
- if(Month==13)
- Month=1;
- write_sfm1(5,Month);
- write_com(0x80+5);
- write_ds(8,Month);
- }
- if(s1num==7)
- {
- Year++;
- if(Year==29)
- Year=18;
- write_sfm1(2,Year);
- write_com(0x80+2);
- write_ds(9,Year);
- }
- }
- }
- if(s3==0)
- {
- delay(5);
- if(s3==0)
- {
- while(!s3);
- if(s1num==1)
- {
- miao--;
- if(miao==-1)
- miao=59;
- write_sfm(9,miao);
- write_com(0x80+0x40+9);
- write_ds(0,miao);
- }
- if(s1num==2)
- {
- fen--;
- if(fen==-1)
- fen=59;
- write_sfm(6,fen);
- write_com(0x80+0x40+6);
- write_ds(2,fen);
- }
- if(s1num==3)
- {
- shi--;
- if(shi==-1)
- shi=23;
- write_sfm(3,shi);
- write_com(0x80+0x40+3);
- write_ds(4,shi);
- }
- if(s1num==4)
- {
- Week--;
- if(Week==0)
- Week=7;
- write_sfm1(11,Week);
- write_com(0x80+11);
- write_ds(6,Week);
- }
- if(s1num==5)
- {
- Date--;
- if(Date==0)
- Date=31;
- write_sfm1(8,Date);
- write_com(0x80+8);
- write_ds(7,Date);
- }
- if(s1num==6)
- {
- Month--;
- if(Month==0)
- Month=12;
- write_sfm1(5,Month);
- write_com(0x80+5);
- write_ds(8,Month);
- }
- if(s1num==7)
- {
- Year--;
- if(Year==18)
- Year=29;
- write_sfm1(2,Year);
- write_com(0x80+2);
- write_ds(9,Year);
- }
- }
- }
- }
- }
- //调节星期的程序
- // Week++;
- // switch(Week)
- // {
- // case 0:write_com(0x80+11);
- // for(i=0;i<3;i++) write_data(table3[Week][i]); break;
- // case 1:write_com(0x80+11);
- // for(i=0;i<3;i++) write_data(table3[Week][i]); break;
- // case 2:write_com(0x80+11);
- // for(i=0;i<3;i++) write_data(table3[Week][i]); break;
- // case 3:write_com(0x80+11);
- // for(i=0;i<3;i++) write_data(table3[Week][i]); break;
- // case 4:write_com(0x80+11);
- // for(i=0;i<3;i++) write_data(table3[Week][i]); break;
- // case 5:write_com(0x80+11);
- // for(i=0;i<3;i++) write_data(table3[Week][i]); break;
- // case 6:write_com(0x80+11);
- // for(i=0;i<3;i++) write_data(table3[Week][i]); break;
- // case 7:write_com(0x80+11); Week=0;
- // for(i=0;i<3;i++) write_data(table3[Week][i]); break;
- // }
- //DS12887 写时钟
复制代码
|