资讯详情

DS1302控制代码

两天的成果, /*************************************/#include<reg52.h>#define uint unsigned int#define uchar unsigned charuchar year,month,day,week,hours,minutes,seconds;uchar flag1302,cnt;/*************************************控制按键*************************************/sbit K1=P1^0;sbit K2=P1^2;sbit K3=P1^4;/*************************************控制LCD液晶显示*************************************/sbit lcdwrite=P2^5;sbit lcddatecommand=P2^6;sbit lcde=P2^7;/*************************************控制DS1302时钟*************************************/sbit SCK=P3^6;sbit RST=P3^5;sbit SDA=P3^4;/*************************************延时子函数*************************************/void delay(uint z){uint x,y;for(x=z;x>0;x--){	for(y=0;y<=112;y++){}}}/*************************************LCD写命令函数*************************************/void write_command(uchar command){lcddatecommand=0;	 //开启写命令lcdwrite=0;	 //只写不读P0=command;delay(1);lcde=1;	 //形成使能E高脉冲delay(1);lcde=0;	             //使能E拉低}/*************************************LCD写数据函数*************************************/void write_date(uchar date){lcddatecommand=1;	//开启写数据lcdwrite=0;	//只写不读P0=date;delay(1);lcde=1;              //形成使能E高脉冲delay(1);lcde=0;              //使能E拉低}/*************************************LCD屏幕初始化*************************************/void lcdInit(){lcde=0;write_command(0x38);//设置16*2显示,5*7点阵,8位数据接口write_command(0x0c);//设置开显示,不显示光标write_command(0x06);// 写一个字符后地址指针加1write_command(0x01);//显示清0,数据指针清0}/*************************************DS1302写字节函数*************************************/void write_1302byte(uchar date){uchar i;for(i=0;i<8;i++){SCK=0;SDA=date&0x01;date=date>>1;SCK=1;//将电平置为已知状态}	}/*************************************DS1302读字节函数*************************************/uchar read_1302byte(uchar address){uchar i,temp;temp=0x00;RST=0;delay(1);SCK=0;delay(1);RST=1;delay(1);write_1302byte(address);for(i=0;i<8;i++){if(SDA==1){temp=temp|0x80;     //每次传输低字节}temp=temp>>1;SCK=1;delay(1);SCK=0;delay(1);}return temp;}/*************************************往DS1302中写数据*************************************/void write_1302(uchar address,uchar date){RST=0;delay(1);SCK=0;delay(1);RST=1;delay(1);write_1302byte(address);write_1302byte(date);RST=0;}/*************************************往DS1302中读取数据*************************************/uchar read_1302(uchar address){	uchar date;RST=0;SCK=0;RST=1;write_1302byte(address);date=read_1302byte(address);SCK=1;RST=0;return date;}/*************************************初始化时间*************************************/void Init_1302(){write_1302(0x8e,0x00);	//写入不保护指令 write_1302(0x80,(14/10)<<4|(14%10));//14秒钟write_1302(0x82,(7/10)<<4|(7%10));	//7分钟write_1302(0x84,(3/10)<<4|(3%10));	//3小时write_1302(0x86,(6/10)<<4|(6%10));  //6日write_1302(0x88,(6/10)<<4|(6%10));	//6月write_1302(0x8A,(4/10)<<4|(4%10));	//周四write_1302(0x8C,(13/10)<<4|(13%10));//13年write_1302(0x90,0xa5);	//打开充电功能,选择2K电阻充电方式write_1302(0x8e,0x80);	//写保护}/*************************************	时钟显示*************************************/void DisplayHours(uchar hours){uchar shi,ge;shi=hours/10;ge=hours%10;write_command(0x06);write_command(0x80+0x40);write_date(shi+48);write_date(ge+48);write_date(':');}/*************************************分钟显示*************************************/void DisplayMinutes(uchar minutes){uchar shi,ge;shi=minutes/10;ge=minutes%10;write_command(0x06);write_command(0x80+0x43);write_date(shi+48);write_date(ge+48);write_date(':');}/*************************************秒钟显示*************************************/void DisplaySeconds(uchar seconds){uchar shi,ge;shi=seconds/10;ge=seconds%10;write_command(0x06);write_command(0x80+0x46);write_date(shi+48);write_date(ge+48);}/*************************************年份显示*************************************/void DisplayYear(uchar years){uchar shi,ge;shi=years/10;ge=years%10;write_command(0x06);write_command(0x80+0x00);write_date(shi+48);write_date(ge+48);write_date('-');}/*************************************月份显示*************************************/void DisplayMonth(uchar month){uchar shi,ge;shi=month/10;ge=month%10;write_command(0x06);write_command(0x80+0x03);write_date(shi+48);write_date(ge+48);write_date('-');}/*************************************日显示*************************************/void DisplayDay(uchar day){uchar shi,ge;shi=day/10;ge=day%10;write_command(0x06);write_command(0x80+0x06);write_date(shi+48);write_date(ge+48);}/*************************************礼拜显示*************************************/void DisplayWeek(uchar week){uchar i;i=week;write_command(0x06);write_command(0x80+0x09);switch(i){case 1:write_date('M');write_date('O');write_date('N');  break;case 2:write_date('T');write_date('H');write_date('E');  break;case 3:write_date('W');write_date('E');write_date('D');  break;case 4:write_date('T');write_date('H');write_date('U');  break;case 5:write_date('F');write_date('R');write_date('I');      break;case 6:write_date('S');write_date('A');write_date('T');  break;case 7:write_date('S');write_date('U');write_date('N');          break;}}/*************************************读取日期*************************************/void read_date(){uchar ReadValue;    ReadValue = read_1302(0x81);       seconds=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);    ReadValue = read_1302(0x83);      minutes=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);     ReadValue = read_1302(0x85);      hours=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);     ReadValue = read_1302(0x87);      day=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);     ReadValue = read_1302(0x89);      month=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);     ReadValue = read_1302(0x8d);      year=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); ReadValue=read_1302(0x8b);                         week=ReadValue&0x07;    DisplaySeconds(seconds);               DisplayMinutes(minutes);            DisplayHours(hours);                 DisplayDay(day);                    DisplayMonth(month);                DisplayYear(year);          DisplayWeek(week); }/*************************************修改日期*************************************/void change(){uchar temp,nian,yue,ri,zhou,shi,fen,miao;if(K1==0){delay(5);if(K1==0)//证明功能键确实按下{cnt++;//计数器,计算按下的次数write_1302(0x8e,0x00);//关闭写保护}}/*******************************************修改年份	*******************************************/if(cnt==1){temp=read_1302(0x8d);nian=((temp&0x70)>>4)*10+(temp&0x0F);if(K2==0){delay(5);if(K2==0)//K2键实现加{while(!K2);delay(5);while(!K2);//确保K2键松开nian++;if(nian>=100){nian=0;}write_1302(0x8e,0x00);write_1302(0x8c,(nian/10)<<4|(nian%10));DisplayYear(nian);write_1302(0x8e,0x80);}}if(K3==0){delay(5);if(K3==0)//K3键实现减{while(!K3);delay(5);while(!K3);//确保K3键松开nian--;if(nian==-1){nian=99;}write_1302(0x8e,0x00);write_1302(0x8c,(nian/10)<<4|(nian%10));DisplayYear(nian);write_1302(0x8e,0x80);}}}/*******************************************修改月份	*******************************************/if(cnt==2){temp=read_1302(0x89);yue=((temp&0x70)>>4)*10+(temp&0x0F);if(K2==0){delay(5);if(K2==0)//K2键实现加{while(!K2);delay(5);while(!K2);//确保K2键松开yue++;if(yue>=12){yue=1;}write_1302(0x8e,0x00);write_1302(0x88,(yue/10)<<4|(yue%10));DisplayMonth(yue);write_1302(0x8e,0x80);}}if(K3==0){delay(5);if(K3==0)//K3键实现减{while(!K3);delay(5);while(!K3);//确保K3键松开yue--;if(yue==0){yue=12;}write_1302(0x8e,0x00);write_1302(0x88,(yue/10)<<4|(yue%10));DisplayMonth(yue);write_1302(0x8e,0x80);}}}/*******************************************修改天数	*******************************************/if(cnt==3){temp=read_1302(0x87);ri=((temp&0x70)>>4)*10+(temp&0x0F);if(K2==0){
锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台