單片機(jī)基于DS1302,1602的時(shí)間設(shè)定程序
提問者:JACK_shionpong2013-04-25 00:00
最佳答案
用Protues仿真的,看不清可以留個(gè)郵箱,我把整體發(fā)給你
#include
#define uchar unsigned char
#define uint unsigned int
sbit rs=P2^0; //數(shù)據(jù)、命令選擇端
sbit lcden=P2^2; // 使能信號
sbit lcdew=P2^1; // 讀寫選擇端
sbit s1=P1^5; //功能鍵設(shè)定
sbit s2=P1^6; // 增大鍵設(shè)定
sbit s3=P1^7; // 減小鍵設(shè)定
sbit beep=P3^3; // 蜂鳴器設(shè)定 */
sbit RST=P1^2; //ds1302 設(shè)定
sbit SCLK=P1^0;
sbit IO=P1^1;
sbit ACC0 = ACC^0;
sbit ACC7 = ACC^7;
uchar num[8],enter,shi,fen,miao,nian,yue,ri,week,shi1,fen1,flag1=0,flag2=0,flag3,choice,
time[]="20XX-XX-XX XXX ", //年月日字符數(shù)組
time1[]=" xx:xx:xx ", //時(shí)分秒字符數(shù)組
time3[]="@ NO 00:00:00"; //鬧鐘設(shè)定時(shí)顯示的時(shí)間數(shù)組
void delay(uint z) //1ms延時(shí)函數(shù)
{
uint x,y;
for(x=z;x>0;x--)
for(y=1;y>0;y--);
}
void di() //蜂鳴設(shè)定函數(shù)
{
beep=0;
delay(800);
beep=1;
}
uchar read(uchar x) //讀ds1302數(shù)據(jù)
{
uchar i;
RST=0;
SCLK=0;
RST=1;
ACC=(x|0x01);
for(i=8;i>0;i--)
{
IO=ACC0;
SCLK=1;
SCLK=0;
ACC=ACC>>1;
}
for(i=8;i>0;i--)
{
ACC=ACC>>1;
ACC7=IO;
SCLK=1;
SCLK=0;
}
SCLK=1;
RST=0;
return ACC;
}
void write (uchar addr,uchar dat) //向ds1302寫數(shù)據(jù)
{
uchar i;
RST=0;
SCLK=0;
RST=1;
ACC=addr;
for(i=8;i>0;i--)
{
IO=ACC0;
SCLK=1;
SCLK=0;
ACC=ACC>>1;
}
ACC=dat;
for(i=8;i>0;i--)
{
IO=ACC0;
SCLK=1;
SCLK=0;
ACC=ACC>>1;
}
SCLK=1;
RST=0;
}
void getnum() //接收ds1302的數(shù)據(jù)
{
uchar j;
for(j=0;j<7;j++)
{
num[j]=read(0x80+0x02*j);
}
time[2]=((num[6]&0x70)>>4)+'0';//年
time[3]=(num[6]&0x0f)+'0'; nian=((num[6]&0x70)>>4)*10+(num[6]&0x0f);
time[5]=((num[4]&0x70)>>4)+'0';//yue
time[6]=(num[4]&0x0f)+'0'; yue=((num[4]&0x70)>>4)*10+(num[4]&0x0f);
time[8]=((num[3]&0x70)>>4)+'0';//ri
time[9]=(num[3]&0x0f)+'0'; ri=((num[3]&0x70)>>4)*10+(num[3]&0x0f);
time[13]=(num[5]&0x0f)+'0';//week
week=(num[5]&0x0f);
switch(time[13]) //星期字符數(shù)組賦值
{
case '1': time[12]='S'; time[13]='u'; time[14]='n';
break;
case '2': time[12]='M'; time[13]='o'; time[14]='n';
break;
case '3': time[12]='T'; time[13]='u'; time[14]='e';
break;
case '4': time[12]='W'; time[13]='e'; time[14]='d';
break;
case '5': time[12]='T'; time[13]='h'; time[14]='u';
break;
case '6': time[12]='F'; time[13]='r'; time[14]='i';
break;
case '7': time[12]='S'; time[13]='a'; time[14]='t';
break;
}
time1[5]=((num[2]&0x70)>>4)+'0'; //shi
time1[6]=(num[2]&0x0f)+'0'; shi=((num[2]&0x70)>>4)*10+(num[2]&0x0f);
time1[8]=((num[1]&0x70)>>4)+'0'; //fen
time1[9]=(num[1]&0x0f)+'0'; fen=((num[1]&0x70)>>4)*10+(num[1]&0x0f);
time1[11]=((num[0]&0x70)>>4)+'0'; //miao
time1[12]=(num[0]&0x0f)+'0'; miao=((num[0]&0x70)>>4)*10+(num[0]&0x0f);
}
void write_com(uchar com) //寫入lcd顯示方式
{
rs=0;
P0=com;
delay(1);
lcden=1;
delay(1);
lcden=0;
}
void write_data(uchar date) //向lcd1602寫入數(shù)據(jù)
{
rs=1;
P0=date;
delay(1);
lcden=1;
delay(1);
lcden=0;
}
void display() //顯示數(shù)據(jù)
{
uchar i;
write_com(0x0c); //顯示方式設(shè)定為:無光標(biāo),且不閃爍
if(flag2==1)
time1[0]='@'; //鬧鐘圖標(biāo)設(shè)定
else
time1[0]=' ';
if(flag1==0) //flag為0時(shí)正常顯示年、月、日、時(shí)、分、秒等
{
write_com(0x80);
for(i=0;time[i]!='\0';i++)
{
write_data(time[i]);
}
write_com(0xc0);
for(i=0;time1[i]!='\0';i++)
{
write_data(time1[i]);
}
}
if(flag1==1) //flag為1時(shí)進(jìn)入時(shí)間設(shè)定界面
{
time3[8]=fen1/10+'0'; time3[9]=fen1%10+'0';
time3[5]=shi1/10+'0';time3[6]=shi1%10+'0';
if(choice==0)
{
time3[2]='N';time3[3]='O';
}
if(choice==1)
{
time3[2]='O'; time3[3]='K';
}
write_com(0xc0);
for(i=0;time3[i]!='\0';i++)
{
write_data(time3[i]);
}
} }
void keyscan() // 掃描鍵盤
{
getnum();
if(s1==0) //功能鍵被按下 write_com(0x0c);
{
delay(10);
if(s1==0)
{
enter++; //記錄摁下次數(shù)
if(flag1==1&&enter==6)
enter=2;
if(flag1==0&&enter==9)
enter=0;
while(s1==0); di(); //按鍵放下時(shí)響一下
}
}
switch(enter)
{
case 0: write_com(0x0c); break;
case 1: write_com(0xcc); write_com(0x0e); delay(7); //按秒 時(shí) 有光標(biāo)
break;
case 2: write_com(0xc9); write_com(0x0e); delay(7); //分
break;
case 3: write_com(0xc6); write_com(0x0e); delay(7); //時(shí)
break;
case 4: if(flag1==0)
{
write_com(0x8e); write_com(0x0e); delay(7); //星期
}
if(flag1==1)
{
write_com(0xc3); write_com(0x0e); delay(7); //NO、OK選項(xiàng)閃爍
}
break;
case 5: if(flag1==0)
{
write_com(0x89); write_com(0x0e); delay(7); //日閃爍
}
if(flag1==1)
{
write_com(0xc0); write_com(0x0e); delay(7); //時(shí)鐘標(biāo)志閃爍
}
break;
case 6: write_com(0x86); write_com(0x0e); delay(7); //月
break;
case 7: write_com(0x83); write_com(0x0e); delay(7); //年
break;
case 8: write_com(0x0c);write_com(0xc0); write_data('@');
if(flag1==0) write_com(0xc0);
else write_com(0xc9); write_com(0x0e); delay(7); //鬧鐘
break;
}
if(enter!=0&&s2==0)
{
delay(10);
if(enter!=0&&s2==0)
{
switch(enter)
{
case 1: miao++; if(miao==60) miao=0;
write(0x80,(miao/10*0x10+miao%10)); //秒
break;
case 2: if(flag1==0)
{
fen++; if(fen==60) fen=0;
write(0x82,((fen/10)*0x10+fen%10)); //分
}
if(flag1==1)
{
fen1++; if(fen1==60) fen1=0;
}
break;
case 3: if(flag1==0)
{
shi++; if(shi==24) shi=0;
write(0x84,(shi/10*0x10+shi%10)); //時(shí)
}
if(flag1==1)
{
shi1++; if(shi1==24) shi1=0;
}
break;
case 4: if(flag1==0)
{
week++; if(week==8) week=1;
write(0x8a,(week/10*0x10+week%10)); //星期
}
if(flag1==1)
{
choice++; if(choice==2) choice=0;
}
break;
case 5: if(flag1==0)
{
ri++; if(ri==32) ri=1;
write(0x86,(ri/10*0x10+ri%10)); //日
}
if(flag1==1)
{
if(choice==0) flag2=0;
if(choice==1) flag2=1;
enter=0; flag1=0;
}
break;
case 6: yue++; if(yue==13) yue=1;
write(0x88,(yue/10*0x10+yue%10)); //月
break;
case 7: nian++; if(nian==99)nian=0;
write(0x8c,(nian/10*0x10+nian%10)); //年
break;
case 8: flag1=1; enter=2;display(); break; //進(jìn)入鬧鐘設(shè)置界面
}
while(s2==0); di(); //按鍵放下時(shí)響一下
}
}
if(enter!=0&&s3==0)
{
delay(10);
if(enter!=0&&s3==0)
{
switch(enter)
{
case 1: miao--; if(miao==-1) miao=59;
write(0x80,(miao/10*0x10+miao%10)); //秒
break;
case 2:if(flag1==0)
{
fen--; if(fen==-1) fen=59;
write(0x82,((fen/10)*0x10+fen%10)); //分
}
if(flag1==1)
{
fen1--; if(fen1==-1) fen1=59;
}
break;
case 3: if(flag1==0)
{
shi--; if(shi==-1) shi=23;
write(0x84,(shi/10*0x10+shi%10)); //時(shí)
}
if(flag1==1)
{
shi1--; if(shi1==-1) shi1=23;
}
break;
case 4: if(flag1==0)
{
week--; if(week==0) week=7;
write(0x8a,(week/10*0x10+week%10)); //星期
}
if(flag1==1)
{
choice--; if(choice==-1) choice=1;
}
break;
case 5: if(flag1==0)
{
ri--; if(ri==0) ri=31;
write(0x86,(ri/10*0x10+ri%10)); //日
}
if(flag1==1)
{
if(choice==0) flag2=0;
if(choice==1) flag2=1;
enter=0; flag1=0;
}
break;
case 6: yue--; if(yue==0) yue=12;
write(0x88,(yue/10*0x10+yue%10)); //月
break;
case 7: nian--; if(nian==-1) nian=99;
write(0x8c,(nian/10*0x10+nian%10)); //年
break;
case 8: flag1=1; break; //進(jìn)入鬧鐘設(shè)置界面
}
while(s3==0); di(); //按鍵放下時(shí)響一下
}
}
}
void init() //初始化
{
// beep=0;
lcden=0; // lcd信號使能端設(shè)定
lcdew=0; //lcd讀寫選擇端設(shè)定
RST=0;
SCLK=1;
write_com(0x38);
write_com(0x0c);
write_com(0x06); // lcd初始化
write_com(0x01);
write_com(0x80); //顯示“20”
write_data(time[0]); write_data(time[1]);
write_com(0x84); //顯示“—”
write_data(time[4]);
write_com(0x87); //顯示“—”
write_data(time[7]);
write_com(0xc7); //顯示“:”
write_data(time1[7]);
write_com(0xca); //顯示“:”
write_data(time1[10]);
}
void main()
{
init(); //初始化
while(1)
{
if(fen1!=fen) flag3=0;
getnum();
while(flag2==1&&enter==0&&shi1==shi&&fen1==fen&&flag3==0)
{
di();delay(200);di();delay(600);
getnum();display();
if(s1==0||s2==0||s3==0)
{
delay(10);
flag3=1;
while(s1==0||s2==0||s3==0) ;
}
enter=0;
}
display();
keyscan();
}
}
回答者:zhangshouli2016-04-25 00:00
DS 6相關(guān)問題
-
顯像管壞了,去找廠家維修。
提問者:Califepuple2013-06-12
-
DS1302是個(gè)IIC協(xié)議 IIC可以對器件進(jìn)行讀寫的操作 DS1302中有寄存器 他們都可以讀寫的嘛 至于你想給他加上時(shí)間調(diào)整功能的話在主函數(shù)中用個(gè)while(1)一直查詢按鍵(或是中斷也可以的)
提問者:天天學(xué)習(xí)好努力2013-11-28
-
你在DS1302的6腳(IO)加個(gè)10K的上拉電阻就搞定了.
提問者:exwstwz1712013-05-01
-
3000公里首保,6000公里二保.以后每五千公里速度上去再下來. 再上去 再下來.反復(fù)幾次就好了. 別看時(shí)速. 看轉(zhuǎn)數(shù).
提問者:nuptwanglei2014-06-24
-
磨合2000公里以后跑高速路對車沒有傷害。超車時(shí)達(dá)到150公里也不必?fù)?dān)心.時(shí)間很短也沒有多少磨損。 高速路上跑110公里既安全也不超速.用定速巡航還省油. 如果長時(shí)間高檔低速或低檔高速對發(fā)動機(jī)有傷害。短時(shí)間讓發(fā)動機(jī)
提問者:盧灶月99582013-03-02
-
您好,感謝向企業(yè)知道提問點(diǎn)擊屏幕上的菜單按鈕,選擇日期印記,根據(jù)自己喜好點(diǎn)擊日期或日期時(shí)間即可歡迎您再次向企業(yè)知道提問.祝您工作生活愉快~
提問者:愛Android2017-01-14
- DS 6熱門車型
- DS 6同品牌車系
- 上市新車
- 即將上市新車