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

📄 main.c

📁 PIC18系列下的DS1302时钟程序 源吗哦 测试通过可以用
💻 C
📖 第 1 页 / 共 3 页
字号:
					  case 3://日期设置的日
					    RealClock.Day--;//日变量减1
					    if(0==RealClock.Day)RealClock.Day=1;//到0归1
						//将其转换成16进制,以方便写入Ds1302的日寄存器单元
					    i=((RealClock.Day/10)<<4)|(RealClock.Day%10);
					    Write_Ds1302_RTC(0x8e,0x00);//Ds1302的允许写打开
					    Write_Ds1302_RTC(0x86,i);//写入Ds1302的天寄存器单元
					    Write_Ds1302_RTC(0x8e,0x80);//Ds1302的禁止写禁止
					    break;
					  case 4://日期设置的星期
					    RealClock.Week--;//星期减1
					    if(0==RealClock.Week)RealClock.Week=1;//到0归1
						//将其转换成16进制,以方便写入Ds1302的星期寄存器单元
					    i=RealClock.Week%10;
					    Write_Ds1302_RTC(0x8e,0x00);//Ds1302的允许写打开
					    Write_Ds1302_RTC(0x8a,i);//写入Ds1302的星期寄存器单元
					    Write_Ds1302_RTC(0x8e,0x80);//Ds1302的禁止写禁止
					    break;
			        }
		        }
			  //在设置状态下将所调节的内容装入显示缓冲区
			  if(((DateKeyID>0)||(TimeKeyID>0))&&(0==AlarmKeyID))
			    {
			      //将调整的结果送到LED显示缓冲区
			      LEDBuffer[0]=RealClock.second%10;	//秒的个位
			      LEDBuffer[1]=RealClock.second/10;	//秒的十位
			      LEDBuffer[2]=RealClock.Minute%10;	//分的个位
			      LEDBuffer[3]=RealClock.Minute/10;	//分的十位
			      LEDBuffer[4]=RealClock.Hour%10;	//时的个位
			      LEDBuffer[5]=RealClock.Hour/10;	//时的十位
			      LEDBuffer[6]=RealClock.Week;		//星期
			      LEDBuffer[7]=RealClock.Day%10;	//日的个位
			      LEDBuffer[8]=RealClock.Day/10;	//日的十位
			      LEDBuffer[9]=RealClock.Month%10;	//月的个位
			      LEDBuffer[10]=RealClock.Month/10;	//月的十位
			      LEDBuffer[11]=RealClock.Year%10;	//年的个位
			      LEDBuffer[12]=RealClock.Year/10;	//年的十位
			    }
	        }
	      while(0==NUMBERsUBKEY);//等待数字减调节释放
        }
      //-------------------------------------------------------
      
      //-------------------------------------------------------
      //---温度数据采集和滤波完毕,将结果送到显示缓冲区
	  if(TRUE==TemperatureDisplayFlag)
	    {
		  TemperatureDisplayFlag=FALsE;
		  temp=RealClock.Temp;
		  temp*=500;
		  temp/=256;
		  temp-=273;//将A/D转换的数据根据AD590计算公式转换成温度值
		  LEDBuffer[15]=16;//数码管灭
		  if(0x80000000==(temp & 0x80000000))//测量温度为负
		    {
		      temp=~temp;//取反
			  temp++;//加1
			}
		  LEDBuffer[15]=17;//数码管显示负号
		  LEDBuffer[14]=temp/10;//将温度值存储到缓冲区
		  LEDBuffer[13]=temp%10;
		}
	  //-------------------------------------------------------
	  
	  //-------------------------------------------------------
	  //---定时半秒时间到,读取Ds1302日历和闪烁现象产生
	  if(TRUE==second_Halfs.Enable)
	    {
		  second_Halfs.Enable=FALsE;
		  if((0==DateKeyID)&&(0==TimeKeyID)&&(0==AlarmKeyID))
		    {
		      i=Read_Ds1302_RTC(0x81);//读取Ds1302的秒
		      RealClock.second=(i/16)*10+(i%16);
              i=Read_Ds1302_RTC(0x83);//读取Ds1302的分
              RealClock.Minute=(i/16)*10+(i%16);
		      i=Read_Ds1302_RTC(0x85);//读取Ds1302的时
		      RealClock.Hour=(i/16)*10+(i%16);
              i=Read_Ds1302_RTC(0x87);//读Ds1302的日
              RealClock.Day=(i/16)*10+(i%16);
              i=Read_Ds1302_RTC(0x89);//读Ds1302的月
              RealClock.Month=(i/16)*10+(i%16);
              i=Read_Ds1302_RTC(0x8b);//读Ds1302的星期
              RealClock.Week=i%16;
              i=Read_Ds1302_RTC(0x8d);//读Ds1302的年
              RealClock.Year=(i/16)*10+(i%16);
            }
		  //---------------------------------------------------
		  if(AlarmKeyID>0)
		    {
			  switch(AlarmKeyID)
			    {
				  case 1:
				    if(0==AlarmClock.status)
				      {
					    LEDBuffer[12]=10;//"A"
					    LEDBuffer[11]=18;//"L"
					    LEDBuffer[10]=19;//"r"
					    LEDBuffer[9] =20;//"O"
					    LEDBuffer[8] =15;//"F"
					    LEDBuffer[7] =15;//"F"
					  }
					  else
					    {
					      LEDBuffer[12]=10;//"A"
					      LEDBuffer[11]=18;//"L"
					      LEDBuffer[10]=19;//"r"
					      LEDBuffer[9] =16;//" "
					      LEDBuffer[8] =20;//"O"
					      LEDBuffer[7] =21;//"N"	
						}
				    break;
				  case 2:
				    if((16==LEDBuffer[4])&&(16==LEDBuffer[5]))//灭状态
				      {
					    LEDBuffer[4]=AlarmClock.Hour%10;//装入闹铃时钟内容
					    LEDBuffer[5]=AlarmClock.Hour/10; 
					  }
					  else
					    {
						  LEDBuffer[4]=16;//装入LED灭的内容
						  LEDBuffer[5]=16;
						}				    
				    break;
				  case 3:
				    if((16==LEDBuffer[2])&&(16==LEDBuffer[3]))//灭状态
				      {
					    LEDBuffer[2]=AlarmClock.Minute%10;//装入闹铃分钟内容
					    LEDBuffer[3]=AlarmClock.Minute/10; 
					  }
					  else
					    {
						  LEDBuffer[2]=16;//装入LED灭的内容
						  LEDBuffer[3]=16;
						}				  
				    break;
				  case 4:
				    if((16==LEDBuffer[0])&&(16==LEDBuffer[1]))//灭状态
				      {
					    LEDBuffer[0]=AlarmClock.Day%10;//装入闹铃秒钟内容
					    LEDBuffer[1]=AlarmClock.Day/10; 
					  }
					  else
					    {
						  LEDBuffer[0]=16;//装入LED灭的内容
						  LEDBuffer[1]=16;
						}				  
				    break;    
				}
			}
		  //---------------------------------------------------
		  
		  //---------------------------------------------------
		  //---校准日期和星期时,以闪烁现象提示
		  if(DateKeyID>0)
		    {
			  switch(DateKeyID)
			    {
				  case 1:
				    if((16==LEDBuffer[11])&&(16==LEDBuffer[12]))//灭状态
				      {
					    LEDBuffer[11]=RealClock.Year%10;//装入年份内容
					    LEDBuffer[12]=RealClock.Year/10; 
					  }
					  else
					    {
						  LEDBuffer[11]=16;//装入LED灭的内容
						  LEDBuffer[12]=16;
						}
				    break;
				  case 2:
				    if((16==LEDBuffer[9])&&(16==LEDBuffer[10]))//灭状态
				      {
					    LEDBuffer[9]=RealClock.Month%10;//装入月份内容
					    LEDBuffer[10]=RealClock.Month/10; 
					  }
					  else
					    {
						  LEDBuffer[9]=16;//装入LED灭的内容
						  LEDBuffer[10]=16;
						}				  
				    break;
				  case 3:
				    if((16==LEDBuffer[7])&&(16==LEDBuffer[8]))//灭状态
				      {
					    LEDBuffer[7]=RealClock.Day%10;//装入年份内容
					    LEDBuffer[8]=RealClock.Day/10; 
					  }
					  else
					    {
						  LEDBuffer[7]=16;//装入LED灭的内容
						  LEDBuffer[8]=16;
						}				  
				    break;
				  case 4:
				    if(16==LEDBuffer[6])LEDBuffer[6]=RealClock.Week; 
					  else LEDBuffer[6]=16;
				    break;    
				}
			}
		  //---------------------------------------------------
		  
		  //---------------------------------------------------
		  //---校准时间时,以闪烁现象提示
	      if(TimeKeyID>0)
	        {
		      switch(TimeKeyID)
		        {
			      case 1:
				    if((16==LEDBuffer[4])&&(16==LEDBuffer[5]))//灭状态
				      {
					    LEDBuffer[4]=RealClock.Hour%10;//装入时钟内容
					    LEDBuffer[5]=RealClock.Hour/10; 
					  }
					  else
					    {
						  LEDBuffer[4]=16;//装入LED灭的内容
						  LEDBuffer[5]=16;
						}			      
			        break;
			      case 2:
				    if((16==LEDBuffer[2])&&(16==LEDBuffer[3]))//灭状态
				      {
					    LEDBuffer[2]=RealClock.Minute%10;//装入分钟内容
					    LEDBuffer[3]=RealClock.Minute/10; 
					  }
					  else
					    {
						  LEDBuffer[2]=16;//装入LED灭的内容
						  LEDBuffer[3]=16;
						}				  			      
			        break;
			      case 3:
				    if((16==LEDBuffer[0])&&(16==LEDBuffer[1]))//灭状态
				      {
					    LEDBuffer[0]=RealClock.Day%10;//装入秒钟内容
					    LEDBuffer[1]=RealClock.Day/10; 
					  }
					  else
					    {
						  LEDBuffer[0]=16;//装入LED灭的内容
						  LEDBuffer[1]=16;
						}			      
			        break;    
			    }
		    }
		  //---------------------------------------------------
		  
		  //---------------------------------------------------
		  //---将闪烁现象送到LED数码管显示
		  if((DateKeyID>0)||(TimeKeyID>0)||(AlarmKeyID>0))
		    sendDataToLED(LEDBuffer,sizeof(LEDBuffer));
		  //---------------------------------------------------
		}
	  
	  //-------------------------------------------------------
	  //---定时1s时间到,送出显示
	  if(TRUE==second_1s.Enable)
	    {
		  second_1s.Enable=FALsE;
		  if((0==DateKeyID)&&(0==TimeKeyID)&&(0==AlarmKeyID))
		    sendDataToLED(LEDBuffer,sizeof(LEDBuffer));
		}
	  //-------------------------------------------------------
    }

}

//-------------------------------------------------------------
//---低优先中断服务程序
#pragma interruptlow TMR0_TMR1_IsR
void TMR0_TMR1_IsR(void)
{
  unsigned char i,j,temp;
  
  if(TRUE==INTCONbits.TMR0IF)//定时100ms溢出
    {
	  INTCONbits.TMR0IF=FALsE;//清TMR0溢出中断标志
	  TMR0L=256-25;//装入新的初值
	  
	  second_Halfs.Interval++;
	  if(5==second_Halfs.Interval)//每0.5秒读Ds1302和闪烁
	    {
		  second_Halfs.Interval=0;
		  second_Halfs.Enable=TRUE;
		}
	  	  
	  second_1s.Interval++;
	  if(10==second_1s.Interval)
	    {
		  second_1s.Interval=0;
		  second_1s.Enable=TRUE;    
		}
		
	  if(0==ADCON0bits.DONE)//判断A/D转换是否完毕
	    {
	      ADCBuffer[ADCBufferPointer]=ADRESH;//装入当前缓冲区
	      ADCON0bits.GO=1;//重新启动A/D开始转换
	      ADCBufferPointer++;//指针加1
	      if(ADCBufferPointer==sizeof(ADCBuffer))//缓冲区装满否
	        {
	          ADCBufferPointer=0;//指针初始化
	          //将缓冲区的内容按从大到小排序
	          for(i=0;i<sizeof(ADCBuffer);i++)
	            for(j=i;j<sizeof(ADCBuffer);j++)
	              {
		            if(ADCBuffer[i]<ADCBuffer[j])
		              {
			            temp=ADCBuffer[i];
			            ADCBuffer[i]=ADCBuffer[j];
			            ADCBuffer[j]=temp;
			          }    
		          }
		      //取缓冲区中间的数值作为当前测量到的温度值数据
		      RealClock.Temp=ADCBuffer[sizeof(ADCBuffer)/2];
		      TemperatureDisplayFlag=TRUE;
		    }
	    }
	}
}

⌨️ 快捷键说明

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