|
DS1302(帶校準(zhǔn)),LCD1602顯示
0.png (24.82 KB, 下載次數(shù): 33)
下載附件
2017-3-19 22:02 上傳
- #include<reg52.h>
- #define uint unsigned int
- #define uchar unsigned char
- uchar a,miao,shi,fen,ri,yue,nian,week,flag,temp,key1n;
- #define yh 0x80 //第一行的初始位置
- #define er 0x80+0x40 //第二行初始位置
- sbit dula=P2^6;
- sbit wela=P2^7;
- sbit wr=P1^1;
- sbit rs=P1^0;
- sbit en=P2^5;
- sbit SCLK=P0^1; // 6 P1.1
- sbit IO=P0^2; // 7 P1.0
- sbit RST=P0^3; //時(shí)鐘 5 P1.2
- sbit ACC0=ACC^0;
- sbit ACC7=ACC^7;
- sbit key1=P3^5;
- sbit key2=P3^6;
- sbit key3=P3^7;
- uchar code tab1[]={"2009- - THU"};
- uchar code tab2[]={" : : "};
- void delay(uint xms)//延時(shí)函數(shù)
- {
- uint x,y;
- for(x=xms;x>0;x--)
- for(y=110;y>0;y--);
- }
- /******************液晶寫入************************/
- write_1602com(uchar com)//液晶寫入指令函數(shù)
- {
- rs=0;//置為寫入命令
- P0=com;//送入數(shù)據(jù)
- delay(1);
- en=1;//拉高使能端
- delay(1);
- en=0;//完成高脈沖
- }
- write_1602dat(uchar dat)
- {
- rs=1;//置為寫入數(shù)據(jù)
- P0=dat;//送入數(shù)據(jù)
- delay(1);
- en=1;
- delay(1);
- en=0;
- }
- /*********************over***********************/
- /********************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);//允許寫
- }
-
- void write_sfm(uchar add,uchar dat)//寫時(shí)分秒
- {
- uchar gw,sw;
- gw=dat%10;
- sw=dat/10;
- write_1602com(er+add);
- write_1602dat(0x30+sw);
- write_1602dat(0x30+gw);
-
- }
- void write_nyr(uchar add,uchar dat)
- {
- uchar gw,sw;
- gw=dat%10;
- sw=dat/10;
- write_1602com(yh+add);
- write_1602dat(0x30+sw);
- write_1602dat(0x30+gw);
-
- }
- void write_week(uchar week)//寫星期函數(shù)
- {
- write_1602com(yh+0x0d);
- switch(week)
- {
- case 1:write_1602dat('M');
- write_1602dat('O');
- write_1602dat('N');
- break;
-
- case 2:write_1602dat('T');
- write_1602dat('U');
- write_1602dat('E');
- break;
-
- case 3:write_1602dat('W');
- write_1602dat('E');
- write_1602dat('D');
- break;
-
- case 4:write_1602dat('T');
- write_1602dat('H');
- write_1602dat('U');
- break;
-
- case 5:write_1602dat('F');
- write_1602dat('R');
- write_1602dat('I');
- break;
-
- case 6:write_1602dat('S');
- write_1602dat('T');
- write_1602dat('A');
- break;
-
- case 7:write_1602dat('S');
- write_1602dat('U');
- write_1602dat('N');
- break;
- }
- }
- lcd_init()//液晶初始化函數(shù)
- { wr=0;
- write_1602com(0x38);//設(shè)置液晶工作模式
- write_1602com(0x0c);//開顯示不顯示光標(biāo)
- write_1602com(0x06);//整屏不移動(dòng),指針加一
- write_1602com(0x01);
- write_1602com(yh+2);//字符寫入的位置
- for(a=0;a<14;a++)
- {
- write_1602dat(tab1[a]);
- //delay(3);
- }
- write_1602com(er+4);
- for(a=0;a<8;a++)
- {
- write_1602dat(tab2[a]);
- //delay(3);
- }
- }
- void keyscan()
- {
- if(key1==0)//key1為功能鍵
- {
- delay(5);
- if(key1==0)
- {
- while(!key1);
- key1n++;
- if(key1n==9)
- key1n=1;
- switch(key1n)
- {
-
- case 1: TR0=0;//關(guān)閉定時(shí)器
- //TR1=0;
- write_1602com(er+0x0b);//寫入光標(biāo)位置
- write_1602com(0x0f);//設(shè)置光標(biāo)為閃爍
- temp=(miao)/10*16+(miao)%10;
- write_1302(0x8e,0x00);
- write_1302(0x80,0x80|temp);//miao
- write_1302(0x8e,0x80);
- break;
- case 2: write_1602com(er+8);//fen
-
- //write_1602com(0x0f);
- break;
- case 3: write_1602com(er+5);//shi
- //write_1602com(0x0f);
- break;
- case 4: write_1602com(yh+0x0f);//week
- //write_1602com(0x0f);
- break;
- case 5: write_1602com(yh+0x0b);//ri
- //write_1602com(0x0f);
- break;
- case 6: write_1602com(yh+0x08);//yue
- //write_1602com(0x0f);
- break;
- case 7: write_1602com(yh+0x05);//nian
- //write_1602com(0x0f);
- break;
- case 8:
- write_1602com(0x0c);//設(shè)置光標(biāo)不閃爍
- TR0=1;//打開定時(shí)器
- temp=(miao)/10*16+(miao)%10;
- write_1302(0x8e,0x00);
- write_1302(0x80,0x00|temp);//miao
- write_1302(0x8e,0x80);
- break;
-
-
-
- }
-
-
- }
- }
- if(key1n!=0)//當(dāng)key1按下以下。再按以下鍵才有效
- {
-
- if(key2==0) //上調(diào)鍵
- {
- delay(5);
- if(key2==0)
- {
- while(!key2);
- switch(key1n)
- {
- case 1:miao++;
- if(miao==60)
- miao=0;
- write_sfm(0x0a,miao);//寫入新的秒數(shù)
- temp=(miao)/10*16+(miao)%10;
- write_1302(0x8e,0x00);
- write_1302(0x80,0x80|temp);
- write_1302(0x8e,0x80);
- write_1602com(er+0x0b);//因?yàn)樵O(shè)置液晶的模式是寫入數(shù)據(jù)后,指針自動(dòng)加一,在這里是寫回原來的位置
- //write_1602com(0x0b);
- break;
- case 2:fen++;
- if(fen==60)
- fen=0;
- write_sfm(0x07,fen);
- temp=(fen)/10*16+(fen)%10;
- write_1302(0x8e,0x00);
- write_1302(0x82,temp);
- write_1302(0x8e,0x80);
- write_1602com(er+8);
- break;
- case 3:shi++;
- if(shi==24)
- shi=0;
- write_sfm(4,shi);
- temp=(shi)/10*16+(shi)%10;
- write_1302(0x8e,0x00);
- write_1302(0x84,temp);
- write_1302(0x8e,0x80);
- write_1602com(er+5);
- break;
- case 4:week++;
- if(week==8)
- week=0;
- write_week(week);
- temp=(week)/10*16+(week)%10;
- write_1302(0x8e,0x00);
- write_1302(0x8a,temp);
- write_1302(0x8e,0x80);
-
- write_1602com(yh+0x0f);
- break;
- case 5:ri++;
- if(ri==31)
- ri=0;
- write_nyr(10,ri);
- temp=(ri)/10*16+(ri)%10;
- write_1302(0x8e,0x00);
- write_1302(0x86,temp);
- write_1302(0x8e,0x80);
- write_1602com(yh+11);
- break;
- case 6:yue++;
- if(yue==13)
- yue=0;
- write_nyr(7,yue);
- temp=(yue)/10*16+(yue)%10;
- write_1302(0x8e,0x00);
- write_1302(0x88,temp);
- write_1302(0x8e,0x80);
- write_1602com(yh+8);
- break;
- case 7:nian++;
- if(nian==100)
- nian=0;
- write_nyr(4,nian);
- temp=(nian)/10*16+(nian)%10;
- write_1302(0x8e,0x00);
- write_1302(0x8c,temp);
- write_1302(0x8e,0x80);
- write_1602com(yh+5);
- break;
-
- }
- }
- }
- if(key3==0)
- {
- delay(5);
- if(key3==0)
- {
- while(!key3);
- switch(key1n)
- {
- case 1:miao--;
- if(miao==-1)
- miao=59;
- write_sfm(0x0a,miao);//寫入新的秒數(shù)
- write_1602com(er+0x0b);//因?yàn)樵O(shè)置液晶的模式是寫入數(shù)據(jù)后,指針自動(dòng)加一,在這里是寫回原來的位置
- //write_1602com(0x0b);
- break;
- case 2:fen--;
- if(fen==-1)
- fen=59;
- write_sfm(7,fen);
- temp=(fen)/10*16+(fen)%10;
-
- …………余下代碼請(qǐng)下載附件…………
復(fù)制代碼
0.png (77.08 KB, 下載次數(shù): 35)
下載附件
2017-3-19 22:03 上傳
完整代碼下載:
DS1302 時(shí)鐘內(nèi)部數(shù)據(jù)校準(zhǔn) LCD1602顯示.rar
(72.29 KB, 下載次數(shù): 60)
2017-3-19 16:17 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
評(píng)分
-
查看全部評(píng)分
|