⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gongcheng28.c

📁 1602显示DS1302和按键对时源程序
💻 C
字号:
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int


sbit  sck=P2^7;
sbit  io = P2^6;
sbit  res = P2^5;

sbit rs=P2^0;	 //rs1602
sbit rw=P2^1;	 //rw
sbit en=P2^2;	 //en

sbit key0=P3^0;
sbit key1=P3^1;
sbit key2=P3^2;
sbit key3=P3^3;

sbit beep=P3^5;

uchar time_date[7] ={12,4,1,7,17,55,30};//年,yue ,日,星期, 时,分,秒
uchar write_add[7] ={0x8c,0x88,0x86,0x8a,0x84,0x82,0x80};	 //写的地址
uchar read_add[7] ={0x8d,0x89,0x87,0x8b,0x85,0x83,0x81};   //读的地址
uchar disp[13],dispb[8];
uchar nian,nian1,nian2,yue,yue1,yue2,ri,ri1,ri2,zhou1,zhou2,shi,shi1,shi2,fen1,fen2;
uchar an_num;



void delay(int z)
{
	int x,y;
	for(x=z;x>0;x--)
	for(y=110;y>0;y--);
}
void write_cmd(uchar cmd)	//1602
{
 	 rs=0;
	 P0=cmd;
	 delay(5);
	 en=1;
	 delay(5);
	 en=0;
}
void write_date(uchar date)	   //1602
{
	rs=1;
	P0=date;
	delay(5);
	en=1;
	delay(5);
	en=0;
}
void init()	 			   //1602初始化
{
	rw=0 ;
	rs=0 ;
	en=0;
	write_cmd(0x38); //16X2  
	write_cmd(0x0c); //
	write_cmd(0x06); //
	write_cmd(0x01); //清屏
}

void write_ds1302_byte(uchar date);
void write_ds1302(uchar add,uchar date);
uchar read_ds1302(uchar add);	 //返回的为十六进制数
 void set_rtc(void);
 void read_rtc(void);							  
 void time_pros(void);
 void time_pros0(void);
void display1(void);


	void write_ds1302_byte(uchar date)	//单字节写
	{  
		uchar i;
		for(i=0;i<8;i++ )
		{
	 		sck=0;
			io=date&0x01;
			date=date>>1;
			sck=1;
		}
	}

	void write_ds1302(uchar add,uchar date)
			{
				res =0;
				_nop_();
				sck = 0;
				_nop_();
				res = 1;
				_nop_();
				 write_ds1302_byte(add);
				 write_ds1302_byte(date);
			   	res =0;
				_nop_();
				io = 1;
				sck = 1;
			}


	uchar read_ds1302(uchar add)
			{
				uchar i,value;
					res = 0;
					_nop_();
					sck = 0;	
					_nop_();
					res = 1;	
					_nop_();
					write_ds1302_byte(add);
					for(i = 0;i<8;i++ )
					{
					   	value = value>>1; //value是字符型
						sck = 0;
						if(io == 1)
						value = value|0x80;
						sck = 1;
					}
					res = 0;
					 _nop_();
					sck = 0;
					_nop_();
					sck = 1;
					io = 0;
					_nop_();
					return value;
			} 



		void set_rtc(void)	//设置初始时间
		{
			uchar i,j;
			for(i=0;i<7;i++)
			{
				 j=time_date[i]/10;		   //十进制转化为十六进制
				 time_date[i]=time_date[i]%10;
				 time_date[i]=time_date[i]+j*16;		
			}
			  write_ds1302(0x8e,0x00);	 //去除写保护 ,0x8e是写保护寄存器的地址
			for(i =0;i<7;i++)
			{
			write_ds1302(write_add[i],time_date[i]);
			}
			 write_ds1302(0x8e,0x80);	 //加写保护
		}
		
					
	 void read_rtc(void)	 //读出时间,存入数组中,十六进制形式
		{
			uchar i;
			for(i= 0;i<7;i++)
			{
				time_date[i]=read_ds1302(read_add[i]);
			}
		}

		void time_pros0(void)		  //把读出的时间转化十位个位
		{
			nian1=time_date[0]/16;
			nian2=time_date[0]%16;
			nian=nian1*10+nian2;
			yue1=time_date[1]/16;
			yue2=time_date[1]%16;
			yue=yue1*10+yue2;
			ri1=time_date[2]/16;
			ri2=time_date[2]%16;
			ri=ri1*10+ri2;
			zhou1=time_date[3]/16;
			zhou2=time_date[3]%16;
			shi1=time_date[4]/16;
			shi2=time_date[4]%16;
			shi=shi1*10+shi2;
			fen1=time_date[5]/16;
			fen2=time_date[5]%16;
		}

		void time_pros(void)	  //存入数组
		{
			
					 						 //年	
		    disp[0]=nian1+'0';		//十位	 
			disp[1]=nian2+'0';	 	//个位	  	
		 	disp[2]='-';	
											//月
			disp[3]=yue1+'0';   //十位
			disp[4]=yue2+'0';	 	//个位	  	
		 	disp[5]='-';	

			disp[6]=ri1+'0';	//日		 
			disp[7]=ri2+'0';	 	
		 	disp[8]='-';	

			disp[9]='D';
			disp[10]='a';
			disp[11]='y';
			//disp[12]=zhou1+'0';			//星期	
			disp[12]=zhou2+'0';
		 	//disp[11]='-';

		    dispb[0]=shi1+'0';	//时	
			dispb[1]=shi2+'0';
			dispb[2]=':';
			
			dispb[3]=fen1+'0';			//fen	
			dispb[4]=fen2+'0';
		 	dispb[5]=':';
			
		//------>	disp[6]=time_date[6]/16+'0';	//miao  这是我写程序时的错误,	
		//------>	disp[7]=time_date[6]%16+'0';	//被网友电之子发现的,太粗心了我
		//------> 	disp[8]='-';	
			
			dispb[6]=time_date[6]/16+'0';			//miao	
			dispb[7]=time_date[6]%16+'0';
		 	//dispb[8]='-';
		
		}

void display1(void)
{
	uchar i;
	//init();
	write_cmd(0x80);
	for(i=0;i<13;i++)
	{
		write_date(disp[i]);
		delay(5);
	}
	write_cmd(0x80+0x40);
	for(i=0;i<8;i++)
	{
		write_date(dispb[i]);
		delay(5);
	}
    delay(210);

		
}


//按键检测
void keyscan()
{
	if(key0==0)
	{
		delay(10);
		if(key0==0)
		{
			beep=0;
			delay(40);
			beep=1;
			an_num++;
			if(an_num==1)					// fen
			{
				write_cmd(0x80+0x40+4);	
				write_cmd(0x0f);
			}
			if(an_num==2)					  // shi
			{
				write_cmd(0x80+0x40+1);
				write_cmd(0x0f);
			}
			if(an_num==3)					  //zhou
			{
				write_cmd(0x80+12);
				write_cmd(0x0f);
			}
			if(an_num==4)					  //ri
			{
				write_cmd(0x80+7);
				write_cmd(0x0f);
			}
			if(an_num==5)					   //yue
			{
				write_cmd(0x80+4);
				write_cmd(0x0f);
			}
			if(an_num==6)						//nian
			{
				write_cmd(0x80+1);
				write_cmd(0x0f);
			}
			if(an_num==7)
			{
				an_num=0;
				write_cmd(0x0c);
			}
			while(!key0);
			write_cmd(0x0c);		

		}
	}//第一个if结束
	if(an_num!=0)
	{
		if(key1==0)	 //增判断
		{
			delay(10);
			if(key1==0)
			{	
				beep=0;
				delay(40);
				beep=1;
				while(!key1);
				switch(an_num)
				{
					case 1:{	 write_cmd(0x80+0x40+4);
								 write_cmd(0x0f);
									fen2++;
									if(fen2>9)
									{
										fen2=0;
										fen1++;
										if(fen1>5)
										fen1=0;
									}
									time_date[5]=fen2+fen1*16;
									write_ds1302(0x8e,0x00);	 //去除写保护
									write_ds1302(write_add[5],time_date[5]);
									write_ds1302(0x8e,0x80);	 //加写保护
							}
 
						   break;
					case 2:{write_cmd(0x80+0x40+1);		//时
					       write_cmd(0x0f);
						   shi++;
						   if(shi>23)
						   {
						   		shi=0;	
						   }
						   shi1=shi/10;
						   shi2=shi%10;
						   time_date[4]=shi2+shi1*16;
						   	write_ds1302(0x8e,0x00);	 //去除写保护
							write_ds1302(write_add[4],time_date[4]);
							write_ds1302(0x8e,0x80);	 //加写保护
							}
							break;
					case 3:{write_cmd(0x80+12);	  //周
							write_cmd(0x0f);
							zhou2++;
							if(zhou2>7)
							{
								zhou2=1;
							}
							time_date[3]=zhou2+zhou1*16;
							write_ds1302(0x8e,0x00);	 //去除写保护
							write_ds1302(write_add[3],time_date[3]);
							write_ds1302(0x8e,0x80);	 //加写保护
					
							}
						break;
					case 4:{write_cmd(0x80+7);	//日
							write_cmd(0x0f);
							ri++;
							if(ri>31)
							{
								ri=1;
							}
							ri1=ri/10;
							ri2=ri%10;
							time_date[2]=ri2+ri1*16;
							write_ds1302(0x8e,0x00);	 //去除写保护
							write_ds1302(write_add[2],time_date[2]);
							write_ds1302(0x8e,0x80);	 //加写保护
							}
						break;
					case 5:{write_cmd(0x80+4);	  //月
							write_cmd(0x0f);
							yue++;
							if(yue>12)
							{
								yue=1;
							}
							yue1=yue/10;
							yue2=yue%10;
							time_date[1]=yue2+yue1*16;
							write_ds1302(0x8e,0x00);	 //去除写保护
							write_ds1302(write_add[1],time_date[1]);
							write_ds1302(0x8e,0x80);	 //加写保护
							}
						break;
					case 6:{write_cmd(0x80+1);
							write_cmd(0x0f);
							nian++;
							if(nian>99)
							{
								nian=0;
							}
							nian1=nian/10;
							nian2=nian%10;
							time_date[0]=nian2+nian1*16;
							write_ds1302(0x8e,0x00);	 //去除写保护
							write_ds1302(write_add[0],time_date[0]);
							write_ds1302(0x8e,0x80);	 //加写保护
					
							}
						break;
					default: break;
					}
					delay(200);
					write_cmd(0x0c);
			}
	   	}//增判断结束

		if(key2==0)	   //减判断
		{
			delay(10);
			if(key2==0)
			{	
				beep=0;		//短暂声音提示
				delay(40);
				beep=1;
				while(!key1);
				switch(an_num)
				{
					case 1:{	 write_cmd(0x80+0x40+4);
								 write_cmd(0x0f);
									fen2--;
									if(fen2<0)
									{
										fen2=9;
										fen1--;
										if(fen1<0)
										fen1=5;
									}
									time_date[5]=fen2+fen1*16;
									write_ds1302(0x8e,0x00);	 //去除写保护
									write_ds1302(write_add[5],time_date[5]);
									write_ds1302(0x8e,0x80);	 //加写保护
							}
						   break;
					case 2:{write_cmd(0x80+0x40+1);		//时
					       write_cmd(0x0f);
						   shi--;
						   if(shi<0)
						   {
						   		shi=23;	
						   }
						   shi1=shi/10;
						   shi2=shi%10;
						   time_date[4]=shi2+shi1*16;
						   	write_ds1302(0x8e,0x00);	 //去除写保护
							write_ds1302(write_add[4],time_date[4]);
							write_ds1302(0x8e,0x80);	 //加写保护
							}
							break;
					case 3:{write_cmd(0x80+12);	  //周
							write_cmd(0x0f);
							zhou2--;
							if(zhou2<1)
							{
								zhou2=7;
							}
							time_date[3]=zhou2+zhou1*16;
							write_ds1302(0x8e,0x00);	 //去除写保护
							write_ds1302(write_add[3],time_date[3]);
							write_ds1302(0x8e,0x80);	 //加写保护
					
							}
						break;
					case 4:{write_cmd(0x80+7);	//日
							write_cmd(0x0f);
							ri--;
							if(ri<1)
							{
								ri=31;
							}
							ri1=ri/10;
							ri2=ri%10;
							time_date[2]=ri2+ri1*16;
							write_ds1302(0x8e,0x00);	 //去除写保护
							write_ds1302(write_add[2],time_date[2]);
							write_ds1302(0x8e,0x80);	 //加写保护
							}
						break;
					case 5:{write_cmd(0x80+4);	  //月
							write_cmd(0x0f);
							yue--;
							if(yue<1)
							{
								yue=12;
							}
							yue1=yue/10;
							yue2=yue%10;
							time_date[1]=yue2+yue1*16;
							write_ds1302(0x8e,0x00);	 //去除写保护
							write_ds1302(write_add[1],time_date[1]);
							write_ds1302(0x8e,0x80);	 //加写保护
							}
						break;
					case 6:{write_cmd(0x80+1);
							write_cmd(0x0f);
							nian--;
							if(nian<0)
							{
								nian=99;
							}
							nian1=nian/10;
							nian2=nian%10;
							time_date[0]=nian2+nian1*16;
							write_ds1302(0x8e,0x00);	 //去除写保护
							write_ds1302(write_add[0],time_date[0]);
							write_ds1302(0x8e,0x80);	 //加写保护
					
							}
						break;
					default: break;
					}
					delay(200);
					write_cmd(0x0c);
			}
	   	}//减判断结束			   	
	}
}


void main()
	{	
		beep=1;
		init();	//1602初始化
		 //set_rtc();
			 while(1)
				 {
				 
				 	read_rtc();
					time_pros0();
					keyscan();
					time_pros();
					display1();
				 }
	}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -