單片機源程序如下:
- #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 寫時鐘
復制代碼
|