问答

单片机基于DS1302,1602的时间设定程序

提问者:JACK_shionpong2013-04-25 00:00

最佳答案

用Protues仿真的,看不清可以留个邮箱,我把整体发给你 #include #define uchar unsigned char #define uint unsigned int sbit rs=P2^0; //数据、命令选择端 sbit lcden=P2^2; // 使能信号 sbit lcdew=P2^1; // 读写选择端 sbit s1=P1^5; //功能键设定 sbit s2=P1^6; // 增大键设定 sbit s3=P1^7; // 减小键设定 sbit beep=P3^3; // 蜂鸣器设定 */ sbit RST=P1^2; //ds1302 设定 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 ", //年月日字符数组 time1[]=" xx:xx:xx ", //时分秒字符数组 time3[]="@ NO 00:00:00"; //闹钟设定时显示的时间数组 void delay(uint z) //1ms延时函数 { uint x,y; for(x=z;x>0;x--) for(y=1;y>0;y--); } void di() //蜂鸣设定函数 { beep=0; delay(800); beep=1; } uchar read(uchar x) //读ds1302数据 { 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写数据 { 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的数据 { 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]) //星期字符数组赋值 { 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写入数据 { rs=1; P0=date; delay(1); lcden=1; delay(1); lcden=0; } void display() //显示数据 { uchar i; write_com(0x0c); //显示方式设定为:无光标,且不闪烁 if(flag2==1) time1[0]='@'; //闹钟图标设定 else time1[0]=' '; if(flag1==0) //flag为0时正常显示年、月、日、时、分、秒等 { 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时进入时间设定界面 { 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++; //记录摁下次数 if(flag1==1&&enter==6) enter=2; if(flag1==0&&enter==9) enter=0; while(s1==0); di(); //按键放下时响一下 } } switch(enter) { case 0: write_com(0x0c); break; case 1: write_com(0xcc); write_com(0x0e); delay(7); //按秒 时 有光标 break; case 2: write_com(0xc9); write_com(0x0e); delay(7); //分 break; case 3: write_com(0xc6); write_com(0x0e); delay(7); //时 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选项闪烁 } 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); //时钟标志闪烁 } 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)); //时 } 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; //进入闹钟设置界面 } while(s2==0); di(); //按键放下时响一下 } } 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)); //时 } 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; //进入闹钟设置界面 } while(s3==0); di(); //按键放下时响一下 } } } void init() //初始化 { // beep=0; lcden=0; // lcd信号使能端设定 lcdew=0; //lcd读写选择端设定 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相关问题

相关阅读

DS 6频道

报价:19.39-30.19
级别:SUV
排量:1.6T 1.8T 
变速箱:-

车友关注

最新标签

按字母分类:
ABCDEFGHIJKLMNOPQRSTWXYZ0-9