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

📄 pcf8563.c

📁 本源代码是一个51单片机控制pcf8563时钟日历芯片的源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
                    else if(count==6)
					{
						rbuf[0]=rbuf[0]&0x7f;
						gw=rbuf[0]&0x0f;
                        sw=(rbuf[0]>>4)&0x0f;
						if(gw==0x0)
						{ if(sw==0x0)
						  {sw=5;
						   gw=9;
						  }
						  else
						  {gw=9;
						   sw-=1;						  
						  }
                        }
						else
						gw-=1;
						rbuf[0]=(sw<<4)+gw;
						SetPCF8563(minute,rbuf[0]);                        
					}
					else 
					break;
					break;
	 case 10:       EnterCount=0;
	 				lcd_init();
	 				switch(AlarmCount)
		 			{case 0:lcd_display(0x40,AlarmMinute);break;
					 case 1:lcd_display(0x40,AlarmHour);break;
		 			 case 2:lcd_display(0x40,AlarmDay); break;     
		 		     case 3:lcd_display(0x40,AlarmWeek);break;
		 			 default:break;	
		 			}
					AlarmCount+=1;
					if(AlarmCount>4)
					AlarmCount=0;
		 			break;
	 case 11:       EnterCount++;             //确认键,按下1次表示确定设定类型
	 				lcd_init();
	 				if(EnterCount==1)
					{
					 AlarmCount--;
					 if(AlarmCount<0)
					 AlarmCount=0;
					 if(AlarmCount==0)
					 lcd_display(0x40,TimeM);
					 else if(AlarmCount==1)
					 lcd_display(0x40,TimeH);
					 else if(AlarmCount==2)
					 lcd_display(0x40,TimeD);
					 else
					 {AlarmCount=3;
					 lcd_display(0x40,TimeW);
					 }
					 GetPCF8563(minAlarm,4,abuf);//把相应寄存器中的报警数据读出
					 alarm_display(abuf);
					}
					else if(EnterCount==2)    //按下第二次表示发送报警数据
					{
					 ddata=(data1<<4)+data2;
					 if(AlarmCount==0)
					   {if((ddata>0x59)||(ddata<0x00))
						  {
					      lcd_display(0x40,Error);
						  EnterCount=0;
						  }
					   else
					      {
					       lcd_display(0x40,TestOk);
						  }
				       }
					 else if(AlarmCount==1)
					   {if(ddata>0x23||ddata<0x00)
						  {
					      lcd_display(0x40,Error);
						  EnterCount=0;
						  }
					   else
					      {
					       lcd_display(0x40,TestOk);
						  }
					   }
					 else if(AlarmCount==2)
					   {if(ddata>0x31||ddata<0x01)
						  {
					      lcd_display(0x40,Error);
						  EnterCount=0;
						  }
					   else
					      {
					       lcd_display(0x40,TestOk);
						  }
					   }
					 else
					 { AlarmCount=3;
					   if(ddata>0x6||ddata<0x00)
						  {
					      lcd_display(0x40,Error);
						  EnterCount=0;
						  }
					   else
					      {
					       lcd_display(0x40,TestOk);
						  }
					 }
					}
					else if(EnterCount==3)    //按下第3次表示发送报警数据
					{EnterCount=0;
					 SetPCF8563(ctrl2,0x02);  //把AIE设置为1,AF设置为0
					 abuf[AlarmCount]=(ddata&0x7f);//把AE设定为0
					 SetPCF8563(minAlarm+AlarmCount,abuf[AlarmCount]);//报警设置完毕
					 lcd_display(0x40,AlarmFinish);
					 //显示闹钟符号
					}
					else
					EnterCount=0;
	 				break;
					break;
	 case 0:        if(EnterCount==1)
                    { DataCount++;
                      if(DataCount==1)
					  {data1=0x00;char_display(0x42,0x30);}
   					  else if(DataCount==2)
					  {data2=0x00;char_display(0x43,0x30);DataCount=0;}
					}
					break;
	 case 1:        if(EnterCount==1)
                    { DataCount++;
                      if(DataCount==1)
					  {data1=0x01;char_display(0x42,0x31);}
   					  else if(DataCount==2)
					  {data2=0x01;char_display(0x43,0x31);DataCount=0;}
					}
					else if(EnterCount==0)
					{ lcd_init();
					  CloseCount=1;
					}
					break;
	 case 2:        if(EnterCount==1)
                    { DataCount++;
                      if(DataCount==1)
					  {data1=0x02;char_display(0x42,0x32);}
   					  else if(DataCount==2)
					  {data2=0x02;char_display(0x43,0x32);DataCount=0;}
					}
					break;
	 case 3:        LightCount++;
                    if(EnterCount==1)
                    { DataCount++;
                      if(DataCount==1)
					  {data1=0x03;char_display(0x42,0x33);}
   					  else if(DataCount==2)
					  {data2=0x03;char_display(0x43,0x33);DataCount=0;}
					}
					if(LightCount==0)
					light=0;
                    else if(LightCount==1)
                    light=1;
                    else 
					light=0;
					break;
	 case 4:        if(EnterCount==1)
                    { DataCount++;
                      if(DataCount==1)
					  {data1=0x04;char_display(0x42,0x34);}
   					  else if(DataCount==2)
					  {data2=0x04;char_display(0x43,0x34);DataCount=0;}
					}
					else if(EnterCount==0)
					{ 
					  SetPCF8563(minAlarm,0x80);        //清除AE标志位
					  lcd_init();
					  lcd_display(0x02,CloseMinAlarm);
					  lcd_display(0x45,AlarmClosed);
					  delay(1500);
					  lcd_init();
					}
					break;
	 case 5:        if(EnterCount==1)
                    { DataCount++;
                      if(DataCount==1)
					  {data1=0x05;char_display(0x42,0x35);}
   					  else if(DataCount==2)
					  {data2=0x05;char_display(0x43,0x35);DataCount=0;}
					}
					else if(EnterCount==0)
					{ 
					  SetPCF8563(hourAlarm,0x80);        //清除AE标志位
					  lcd_init();
					  lcd_display(0x03,CloseHourAlarm);
					  lcd_display(0x45,AlarmClosed);
					  delay(1500);
					  lcd_init();
					}
					break;
     case 6:        if(EnterCount==1)
                    { DataCount++;
                      if(DataCount==1)
					  {data1=0x06;char_display(0x42,0x36);}
   					  else if(DataCount==2)
					  {data2=0x06;char_display(0x43,0x36);DataCount=0;}
					}
					else if(EnterCount==0)
					{ 
					  SetPCF8563(dayAlarm,0x80);        //清除AE标志位
					  lcd_init();
					  lcd_display(0x03,CloseDayAlarm);
					  lcd_display(0x45,AlarmClosed);
					  delay(1500);
					  lcd_init();
					}
					break;
	 case 7:        if(EnterCount==1)
                    { DataCount++;
                      if(DataCount==1)
					  {data1=0x07;char_display(0x42,0x37);}
   					  else if(DataCount==2)
					  {data2=0x07;char_display(0x43,0x37);DataCount=0;}
					}
					else if(EnterCount==0)
					{ 
					  SetPCF8563(weekAlarm,0x80);        //清除AE标志位
					  lcd_init();
					  lcd_display(0x03,CloseWeekAlarm);
					  lcd_display(0x45,AlarmClosed);
					  delay(1500);
					  lcd_init();
					}
					break;
	 case 8:        if(EnterCount==1)
                    { DataCount++;
                      if(DataCount==1)
					  {data1=0x08;char_display(0x42,0x38);}
   					  else if(DataCount==2)
					  {data2=0x08;char_display(0x43,0x38);DataCount=0;}
					}
					break;
	 case 9:        if(EnterCount==1)
                    { DataCount++;
                      if(DataCount==1)
					  {data1=0x09;char_display(0x42,0x39);}
   					  else if(DataCount==2)
					  {data2=0x09;char_display(0x43,0x39);DataCount=0;}
					}
					break;

     default:       break;

	}
}

/********************* 时钟关闭程序**********************/
void clkscan(void)
{uint key;
 key=getch();
 delay(50);
 switch(key)
 {case 2: lcd_init();
          CloseCount=0;
		  break;
  default:break;
 }
}
/********************* 中断服务程序**********************/
void ISR_int0(void) interrupt 0 using 0
{ uint t;
  lcd_init();	 
  for(t=10;t>=0;t--)
  {lcd_display(0x05,ALARM);
   beep=1;
   light=1;
   delay(100);
  }
  light=0;
  beep=0;
  lcd_init();
  SetPCF8563(ctrl2,0x02);//把AIE设置为1,AF设置为0,清空闹钟标志位
}
//定时器中断服务程序,实现1s的定时
/*void timer0(void) interrupt 1 using 1
{
    TH0 = 0x3C;     //定时器赋予初值
	TL0 = 0xAF;   
	//一秒累加 
	rSecondCount++;//秒计时+1 
	if (40 == rSecondCount) //1sec到,50ms*20 
	 { 
	   GetPCF8563(minute,6,rbuf);
	   test = 1;
	   rSecondCount = 0;
	 } 
	 else
	 {
	  test = 0;
	 }
}
*/
//---------------------------------主函数------------------------------------------
void main()
{   IT0=0;			//系统开外部0中断
	//ET0 = 1;        //允许定时器0中断
	EA=1;           //开总中断

    EX0=1;
	//TMOD = 0x01;    //定时器工作方式选择
	//TH0 = 0x3C;     //定时器赋予初值
	//TL0 = 0xAF;   
	//IE = 0x82;		// 使能timer0中断	
	//TR0 = 1;        //启动定时器
    
	lcd_init();		// 初始化LCD					
	pcf8563start(); //启动pcf8563
	SetPCF8563(ctrl2,0x02);
    setime();       //出始时间设定
      	
	while(1)
      { 
	             switch(CloseCount)
	 			 {case 0:
				         GetPCF8563(minute,6,rbuf);
                         time_display(rbuf);
	                     keyscan();
				         break;
				 case 1:				
				         lcd_display(0x01,Close);
				         clkscan();						 
				         break;
                default:break;
			  }

   }
}

⌨️ 快捷键说明

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