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

📄 ds12c887.c

📁 自己做的单片机Proteus仿真实例
💻 C
字号:
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit s1=P1^1;
sbit s2=P1^3;
sbit s3=P1^5;
sbit s4=P1^7;
sbit lcdrs=P3^0;
sbit lcden=P3^1;
sbit irq=P3^2;
sbit beep=P3^3;
sbit as=P3^4;
sbit rw=P3^5;
sbit ds=P3^6;
sbit cs=P3^7;
bit flag1,flag_alarm;
uchar s1num,flag;
char miao,shi,fen,year,month,day,week,alarm_miao,alarm_shi,alarm_fen;
uchar code table1[]="20  -  -  "; 
uchar code table2[]="  :  :  ";
//////////////////////////////////////////////////////////////////////////////
void delay(uint z)
{
     uint x,y;
	 for(x=z;x>0;x--)  
	   for(y=110;y>0;y--);
}
void di()
{
     beep=1;
	 delay(200);
	 beep=0;
}
///////////1602和ds12c887读写部分//////////////////////////////////////////
void write_ds(uchar add,uchar date)
{
	as=0;
	cs=0;
	ds=1;
	rw=1;
	as=1;
	P0=add;
	as=0;
	rw=0;
	P0=date;
	rw=1;
    as=1;
	cs=1;	
}
uchar read_ds(uchar add)
{
 	uchar ds_date;
	as=0;
	cs=0;
	ds=1;
	rw=1;
	as=1;
	P0=add;
	as=0;
	ds=0;
	P0=0xff;
	ds_date=P0;
	ds=1;
	as=1;
	cs=1;
	return ds_date;	
}                     
void write_com(uchar com)
{
     lcdrs=0;
	 P0=com;
	 delay(5);
	 lcden=1;
	 lcden=0;
}
void write_data(uchar date)
{
     lcdrs=1;
	 P0=date;
	 delay(5);
	 lcden=1;
	 lcden=0;
}
/////////读取时间和显示部分///////////////////////////////////////////////////
void gettime()
{
    year=read_ds(9);
	month=read_ds(8);
    day=read_ds(7);
    week=read_ds(6);
	shi=read_ds(4);
    fen=read_ds(2);
    miao=read_ds(0);
}   
void write_sfm(uchar add,uchar date)
{
     uchar shi,ge;
	 shi=date/10;
	 ge=date%10;
	 write_com(0x80+0x40+add);
	 write_data(0x30+shi);
	 write_data(0x30+ge);
}
void write_nyr(uchar add,uchar date)
{
     uchar shi,ge;
	 shi=date/10;
	 ge=date%10;
	 write_com(0x80+add);
	 write_data(0x30+shi);
	 write_data(0x30+ge);
}
void write_week(uchar week)
{
     write_com(0x80+12);
	 switch(week)
	 {
	      case 1: write_data('M');
		          delay(5);
				  write_data('O');
				  delay(5);
				  write_data('N');
				  break;
		  case 2: write_data('T');
		          delay(5);
				  write_data('H');
				  delay(5);
				  write_data('U');
				  break;
		  case 3: write_data('W');
		          delay(5);
				  write_data('E');
				  delay(5);
				  write_data('D');
				  break;
		  case 4: write_data('T');
		          delay(5);
				  write_data('H');
				  delay(5);
				  write_data('U');
				  break;
		  case 5: write_data('F');
		          delay(5);
				  write_data('R');
				  delay(5);
				  write_data('I');
				  break;
		  case 6: write_data('S');
		          delay(5);
				  write_data('A');
				  delay(5);
				  write_data('T');
				  break;		 
		  case 7: write_data('S');
		          delay(5);
				  write_data('U');
				  delay(5);
				  write_data('N');
				  break;
	 }
}
void display()
{
    write_sfm(10,miao);
	write_sfm(7,fen);
	write_sfm(4,shi);
    write_week(week);
	write_nyr(3,year);
	write_nyr(6,month);
    write_nyr(9,day);
}
/////////键盘扫描部分//////////////////////////////////////////
void read_alarm( )
{
	alarm_miao=read_ds(1);
	alarm_fen=read_ds(3);
	alarm_shi=read_ds(5);
}
void keyscan()
{
     if(flag_alarm==1)
	 {
	      if((s1==0)||(s2==0)||(s3==0)||(s4==0))
		  {
		        delay(5);
				if((s1==0)||(s2==0)||(s3==0)||(s4==0))
				{
				      while(!(s1&&s2&&s3&&s4));
					  di();
					  flag_alarm=0;
				}
		   }
	 }
     if(s1==0)
	 {
	       delay(5);
		   if(s1==0)
		   {   
		         s1num++;
				 if(flag1==1)
				     if(s1num==4)
					    s1num=1;
				 flag=1;
				 while(!s1);
				 switch(s1num)
				 {
				      case 1:write_com(0x80+0x40+10);
					         write_com(0x0f);
							 break;
					  case 2:write_com(0x80+0x40+7);
					    
							 break;		 
					  case 3:write_com(0x80+0x40+4);
					    
							 break;
					  case 4:write_com(0x80+12);
					      
							 break;
					  case 5:write_com(0x80+9);
					     
							 break;
					  case 6:write_com(0x80+6);
					         
							 break;
					  case 7:write_com(0x80+3);
					  
							 break;
					  case 8:s1num=0;
					         write_com(0x0c);
							 flag=0;
							 write_ds(0,miao);
							 write_ds(2,fen);
							 write_ds(4,shi);
							 write_ds(6,week);
							 write_ds(7,day);
							 write_ds(8,month);
							 write_ds(9,year);
							 break;
			       }

	         }

       }
	   if(s1num!=0)
	   {
	         if(s2==0)
			 {
			        delay(5);
					{
					     while(!s2);
						 if(s1num==1)
						 {
						      miao++;
							  if(miao==60)
							        miao=0;
							  write_sfm(10,miao);
							  write_com(0x80+0x40+10);
						 }
						 if(s1num==2)
						 {
						      fen++;
							  if(fen==60)
							        fen=0;
							  write_sfm(7,fen);
							  write_com(0x80+0x40+7);
						 }	   	   
				 		 if(s1num==3)
						 {
						      shi++;
							  if(shi==24)
							        shi=0;
							  write_sfm(4,shi);
							  write_com(0x80+0x40+4);
						 }
						 if(s1num==4)
						 {
						      week++;
							  if(week==8)
							        week=1;
							  write_week(week);
							  write_com(0x80+12);
						 }
						 if(s1num==5)
						 {
						      day++;
							  if(day==32)
							        day=1;
							  write_nyr(9,day);
							  write_com(0x80+9);
						 }
						 if(s1num==6)
						 {
						      month++;
							  if(month==13)
							        month=1;
							  write_nyr(6,month);
							  write_com(0x80+6);
						 }
						 if(s1num==7)
						 {
						      year++;
							  if(year==100)
							        day=0;
							  write_nyr(3,year);
							  write_com(0x80+3);
						 }
						 	 
				   }

			 }	   
			 if(s3==0)
			 {
			        delay(5);
					if(s3==0)
					{
					     while(!s3);
						 if(s1num==1)
						 {
						      miao--;
							  if(miao==-1)
							       miao=59;
							  write_sfm(10,miao);
							  write_com(0x80+0x40+10);
						 }
						 if(s1num==2)
						 {
						      fen--;
							  if(fen==-1)
							       fen=59;
							  write_sfm(7,fen);
							  write_com(0x80+0x40+7);
						 }	   	   
				 		 if(s1num==3)
						 {
						      shi--;
							  if(shi==-1)
							       shi=23;
							  write_sfm(4,shi);
							  write_com(0x80+0x40+4);
						 }
						 if(s1num==4)
						 {
						      week--;
							  if(week==0)
							        week=7;
							  write_week(week);
							  write_com(0x80+12);
						 }
						 if(s1num==5)
						 {
						      day--;
							  if(day==0)
							        day=31;
							  write_nyr(9,day);
							  write_com(0x80+9);
						 }
						 if(s1num==6)
						 {
						      month--;
							  if(month==0)
							        month=12;
							  write_nyr(6,month);
							  write_com(0x80+6);
						 }
						 if(s1num==7)
						 {
						      year--;
							  if(year==0)
							        day=99;
							  write_nyr(3,year);
							  write_com(0x80+3);
						 }	 
						 	 
				     }

				}	   
	   
          }
	    if(s4==0)
	    {
		      delay(5);
			  if(s4==0)
			  {
			      flag1=~flag1;
				  while(!s4);
				  if(flag1==0)
				  {
					   s1num=0;
					   write_com(0x0c);
				       flag=0;
					   write_com(0x80+0x40);
					   write_data(' ');
					   write_data(' ');
					   write_data(' ');
					  
					   write_ds(1,miao);
					   write_ds(3,fen);
					   write_ds(5,shi);
				   }
				   else
				   {
				       s1num=0;
					   write_com(0x0c);
					   read_alarm();
					   miao=alarm_miao;
					   fen=alarm_fen;
					   shi=alarm_shi;
					   write_com(0x80+0x40);
					   write_data('A');
					   write_data('L');
					   write_data('R');
					   write_sfm(4,alarm_shi);
					   write_sfm(7,alarm_fen);
					   write_sfm(10,alarm_miao);
				   }

			   }	
		 
		  }
	  

}
////////////////////////////////////////////////////////////////////
/////////初始化部分//////////////////////////////////////////////////////////////////
void set_time( )   
{
   write_ds(0x00,50);
   write_ds(0x01,10); 
   write_ds(0x02,59);  
   write_ds(0x03,1);
   write_ds(0x04,9);
   write_ds(0x05,10);
   write_ds(0x06,4);
   write_ds(0x07,26);
   write_ds(0x08,7);            
   write_ds(0x09,12);

}
void init()
{	
	 uchar num;
	 EA=1;
	 EX0=1;
	 IT0=1;
	 flag1=0;
	 s1num=0;
	 lcden=0;
     write_ds(0x0A,0x20);
	 write_ds(0x0B,0x26);
	 set_time();
     write_com(0x38);
	 write_com(0x0c);
	 write_com(0x06);
     write_com(0x01); 
	 write_com(0x81);
	 for(num=0;num<10;num++) 
		 {
	         write_data(table1[num]);
		     delay(5);
		 }
	 write_com(0x80+0x40+4);
	 for(num=0;num<8;num++) 
		 {
	         write_data(table2[num]);
		     delay(5);
		 }
}  

//////////////////////////////////////////////////////////////
void main()
{
     init();
	 gettime();
	 display();
	 while(1)
	 {
		  keyscan();
		  if(flag_alarm==1)
		  {
		      di();
			  delay(100);
			  di();
			  delay(500);
		   }
		   if(flag==0&&flag1==0)
		   {

		      gettime();
	          display(); 
	
	       }
	 }
}
void ser() interrupt 0
{
     uchar c;
	 flag_alarm=1;
	 c=read_ds(0x0c);
} 











⌨️ 快捷键说明

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