uvsensor.c

来自「基于pic1687x 的UVSensor 源程序,带128*64 LCD显示,以」· C语言 代码 · 共 1,665 行 · 第 1/4 页

C
1,665
字号
    NowTime[3] = P8563Data[5]%16;
    NowTime[4] = P8563Data[3]/16;//日
    NowTime[5] = P8563Data[3]%16;
    NowTime[6] = P8563Data[4]%16;//星期
    NowTime[7] = P8563Data[2]/16;//时
    NowTime[8] = P8563Data[2]%16;
    NowTime[9] = P8563Data[1]/16;//分
    NowTime[10] = P8563Data[1]%16;
    NowTime[11] = P8563Data[0]/16;//秒
    NowTime[12] = P8563Data[0]%16;
 }
/******************************************************************************/
/********************   测量Sensor的数据并保存****************************/
/******************************************************************************/
void GetSensorData(void)
  {
   unsigned char i,j;
   unsigned int Total_ADData = 0;
   unsigned char magic[5];
   union
      {
       unsigned int DataInt;
       unsigned char DataChar[2];
      }AD;
   union
      {
       unsigned int WAddInt;
       unsigned char WAddChar[2];
      }EepAdd;   


   Read_24C512(0x00,5,magic);//读标志位和地址
   if(magic[0]!=0x55)
     {
      magic[0] = 0x55;
      magic[1] = EepDataAdd;
      magic[2] = 0x00;
      magic[3] = EepDataAdd;
      magic[4] = 0x00;
      Write_24C512(0x0000,5, magic);//重新写标志位和地址
     }

   Read_24C512(0x0003,2,EepAdd.WAddChar);//读出写地址
//记录测量的时间   
   Write_24C512(EepAdd.WAddInt, 1, &P8563Data[6]);//Year
   EepAdd.WAddInt ++;
   Write_24C512(EepAdd.WAddInt, 1, &P8563Data[5]);//month
   EepAdd.WAddInt ++;
   Write_24C512(EepAdd.WAddInt, 1, &P8563Data[3]);//day
   EepAdd.WAddInt ++;
   Write_24C512(EepAdd.WAddInt, 1, &P8563Data[2]);//hour
   EepAdd.WAddInt ++;
   Write_24C512(EepAdd.WAddInt, 1, &P8563Data[1]);//minute
   EepAdd.WAddInt ++;
   
   for(i=0;i<8;i++)  ///8个Sensor
      {
       PORTE = i;//选择模拟开关的通道
       DelayMs(500);//延时,使电压稳定
       Total_ADData = 0;//清零,必须要的
       for(j=0;j<ADCount;j++)//测量多次,取平均值
         {
          ADGO=1; //启动A/D 转换  
          while(ADGO);//等待AD转换完成
          AD.DataChar[0]= ADRESL;
          AD.DataChar[1] = ADRESH;
          Total_ADData += AD.DataInt;
          DelayMs(20);
         }
       Total_ADData /= ADCount;
       AD.DataInt = Total_ADData;
       
       Write_24C512(EepAdd.WAddInt, 2, AD.DataChar);
       EepAdd.WAddInt += 2;
      }
   Write_24C512(0x0003,2,EepAdd.WAddChar);//保存写地址

//   DelayMs(1000);

  }

/******************************************************************************/
/*****************                 判断测量时间            ****************************/
/******************************************************************************/
unsigned char Judge_MeaTime(void)
  {
   unsigned char const JudgeMenu[] = "正在测量中……";
   unsigned int TimeTemp1 = 0,TimeTemp2 = 0;
   unsigned char i,Flag;

   if(Eep_MeaData.Mea_Switch == 0)
     return 0;
    

   TimeTemp1 =  Eep_MeaData.EndTime;
   TimeTemp2 = ((TimeTemp1>>12) & 0x000F)*600 + ((TimeTemp1>>8) & 0x000F)*60 + ((TimeTemp1>> 4) & 0x000F) *10 + (TimeTemp1 & 0x000F);
   TimeTemp1 = ((P8563Data[2]>>4) & 0x0F)*600 + (P8563Data[2] & 0x0F)*60 + ((P8563Data[1]>> 4) & 0x0F) *10 + (P8563Data[1] & 0x0F);//当前的时间转换成分钟

   if(TimeTemp1 > TimeTemp2)//现在的时间大于结束的时间
      return 0;

      
   TimeTemp1 =  Eep_MeaData.StartTime;
   TimeTemp2 = ((TimeTemp1>>12) & 0x000F)*600 + ((TimeTemp1>>8) & 0x000F)*60 + ((TimeTemp1>> 4) & 0x000F) *10 + (TimeTemp1 & 0x000F);
   TimeTemp1 = ((P8563Data[2]>>4) & 0x0F)*600 + (P8563Data[2] & 0x0F)*60 + ((P8563Data[1]>> 4) & 0x0F) *10 + (P8563Data[1] & 0x0F);//当前的时间转换成分钟
   
   TimeTemp1 = (TimeTemp1 -TimeTemp2)% (Eep_MeaData.Time*10);//判断是否到时间
   Flag = TimeTemp1;

   if((Flag == 0)&&(P8563Data[0]==0))
     {
      LCD_Write_Command(0x01);//清除显示
      LCD_set_xy( 0, 1 );//第二行
      for(i=0;i<14;i++)
         {
   	    LCD_Write_Data(JudgeMenu[i]);
         }
      GetSensorData();
      return 1;
     }
   else
     {
      return 0;
     }
  }
/******************************************************************************/
/******************************************************************************/
/******************************************************************************/
void Display_Menu(unsigned char MenuPos)
  {
   unsigned char i,MenuPicTemp[2];
   unsigned char 	DateTime[] = "00-00  00:00'00\"";

   if(FlashFlag)
     {
      MenuPicTemp[0] = MenuPic[0];
      MenuPicTemp[1] = MenuPic[1];
     }
   else
     {
      MenuPicTemp[0] = MenuPic[2];
      MenuPicTemp[1] = MenuPic[3];
     }
  if(MainMenuFlag)    
    {
     MainMenuFlag = 0;
     LCD_set_xy(1,0);//第一行
     for(i=0;i<14;i++)
        {
  	LCD_Write_Data(Menu1[i]);
        }
     LCD_set_xy( 1, 1 );//第二行
     for(i=0;i<14;i++)
        {
  	LCD_Write_Data(Menu2[i]);
        }
     LCD_set_xy( 1, 2 );//第三行
     for(i=0;i<14;i++)
        {
  	LCD_Write_Data(Menu3[i]);
        }
    }
   
   switch(MenuPos)
      {
       case 0 :
            LCD_set_xy(0,0);//第一行
	      LCD_Write_Data(MenuPicTemp[0]);
	      LCD_Write_Data(MenuPicTemp[1]);
            LCD_set_xy( 0, 1 );//第二行
	      LCD_Write_Data(' ');
	      LCD_Write_Data(' ');
            LCD_set_xy( 0, 2 );//第三行
	      LCD_Write_Data(' ');
	      LCD_Write_Data(' ');
       break;
       case 1 :
            LCD_set_xy(0,0);//第一行
	      LCD_Write_Data(' ');
	      LCD_Write_Data(' ');
            LCD_set_xy( 0, 1 );//第二行
	      LCD_Write_Data(MenuPicTemp[0]);
	      LCD_Write_Data(MenuPicTemp[1]);
            LCD_set_xy( 0, 2 );//第三行
	      LCD_Write_Data(' ');
	      LCD_Write_Data(' ');
       break;
       case 2 :
            LCD_set_xy(0,0);//第一行
	      LCD_Write_Data(' ');
	      LCD_Write_Data(' ');
            LCD_set_xy( 0, 1 );//第二行
	      LCD_Write_Data(' ');
	      LCD_Write_Data(' ');
            LCD_set_xy( 0, 2 );//第三行
	      LCD_Write_Data(MenuPicTemp[0]);
	      LCD_Write_Data(MenuPicTemp[1]);
       break;
       default : break;
      }

     DateTime[0] = NowTime[2] + '0';	//月
     DateTime[1] = NowTime[3] + '0';
	 	
     DateTime[3] = NowTime[4] + '0';	//日
     DateTime[4] = NowTime[5] + '0';
	 	
     DateTime[7] = NowTime[7] + '0';	     //时
     DateTime[8] = NowTime[8] + '0';

     DateTime[10] = NowTime[9] + '0';	//分
     DateTime[11] = NowTime[10] + '0';
     
     DateTime[13] = NowTime[11] + '0';	//秒
     DateTime[14] = NowTime[12] + '0';	

     LCD_Write_string(0,3,&DateTime[0]);
  }
/******************************************************************************/
/******************************************************************************/
/******************************************************************************/
void Display_SetTime(unsigned char Pos)
  {
    unsigned char const	SetTimeMenu[] = "请重新设置时间…";
    unsigned char  const DateDis[] = "日期: 20";
    unsigned char  const  WeekDis[] = "星期";
    unsigned char  const  TimeDis[] = "时间: ";
    
    unsigned char const WeekData[] = "日一二三四五六";

    unsigned char i;
    
     LCD_set_xy(0,0);
     for(i=0;i<16;i++)
         LCD_Write_Data(SetTimeMenu[i]);

     LCD_set_xy(0,1);
     for(i=0;i<8;i++)
         LCD_Write_Data(DateDis[i]);
         
     LCD_set_xy(0,2);
     for(i=0;i<4;i++)
         LCD_Write_Data(WeekDis[i]);
         
     LCD_set_xy(0,3);
     for(i=0;i<6;i++)
         LCD_Write_Data(TimeDis[i]);

     LCD_set_xy(4,1);//年
     if(FlashFlag&&(Pos==0))
        LCD_Write_Data(FlashPic);
     else
        LCD_Write_Data(NowTime[0] + '0');
     if(FlashFlag&&(Pos==1))
        LCD_Write_Data(FlashPic);
     else
        LCD_Write_Data(NowTime[1] + '0');
//     LCD_set_xy(5,1);//月
     LCD_Write_Data('-');
     if(FlashFlag&&(Pos==2))
        LCD_Write_Data(FlashPic);
     else
       LCD_Write_Data(NowTime[2] + '0');
     if(FlashFlag&&(Pos==3))
        LCD_Write_Data(FlashPic);
     else
        LCD_Write_Data(NowTime[3] + '0');
     LCD_Write_Data('-');
//     LCD_set_xy(7,1);//日
     if(FlashFlag&&(Pos==4))
        LCD_Write_Data(FlashPic);
     else
        LCD_Write_Data(NowTime[4] + '0');
     if(FlashFlag&&(Pos==5))
        LCD_Write_Data(FlashPic);
     else
       LCD_Write_Data(NowTime[5] + '0');
     
     LCD_set_xy(2,2);//星期
     if(FlashFlag&&(Pos==6))
        {
        LCD_Write_Data(FlashPic);
        LCD_Write_Data(FlashPic);
        }
     else
        {
         LCD_Write_Data(WeekData[NowTime[6]*2]);
         LCD_Write_Data(WeekData[NowTime[6]*2+1]);
        }

     LCD_set_xy(3,3);//时
     if(FlashFlag&&(Pos==7))
        LCD_Write_Data(FlashPic);
     else
        LCD_Write_Data(NowTime[7] + '0');
     if(FlashFlag&&(Pos==8))
        LCD_Write_Data(FlashPic);
     else
        LCD_Write_Data(NowTime[8] + '0');
     
//     LCD_set_xy(4,3);//分
     LCD_Write_Data(':');
     if(FlashFlag&&(Pos==9))
        LCD_Write_Data(FlashPic);
     else
        LCD_Write_Data(NowTime[9] + '0');
     if(FlashFlag&&(Pos==10))
        LCD_Write_Data(FlashPic);
     else
       LCD_Write_Data(NowTime[10] + '0');
     LCD_Write_Data('\'');
     
//     LCD_set_xy(6,3);//秒
     if(FlashFlag&&(Pos==11))
        LCD_Write_Data(FlashPic);
     else
        LCD_Write_Data(NowTime[11] + '0');
     if(FlashFlag&&(Pos==12))
        LCD_Write_Data(FlashPic);
     else
        LCD_Write_Data(NowTime[12] + '0');
     LCD_Write_Data('\"');
     LCD_Write_Data(' ');

  }
/******************************************************************************/
/******************************************************************************/
void Save_NewTime(void)
{
  unsigned char NewTime[14]={0x00,0x00,0x39,0x31,0x21,0x20,0x03,0x09,0x06,0x80,0x80,0x80,0x80,0x83};
  unsigned char TimeTemp=0;

  TimeTemp = NowTime[0];
  TimeTemp <<= 4;
  NewTime[8] = TimeTemp|NowTime[1];
  
  TimeTemp = NowTime[2];
  TimeTemp <<= 4;
  NewTime[7] = TimeTemp|NowTime[3];
  
  TimeTemp = NowTime[4];
  TimeTemp <<= 4;
  NewTime[5] = TimeTemp|NowTime[5];
  
  NewTime[6] = TimeTemp|NowTime[6];
  
  TimeTemp = NowTime[7];
  TimeTemp <<= 4;
  NewTime[4] = TimeTemp|NowTime[8];
  
  TimeTemp = NowTime[9];
  TimeTemp <<= 4;
  NewTime[3] = TimeTemp|NowTime[10];
  
  TimeTemp = NowTime[11];
  TimeTemp <<= 4;
  NewTime[2] = TimeTemp|NowTime[12];
  
  P8563_WriteData(WRADDR,NewTime,14); //初始化PCF8563,如果需要的话可以不去掉
}
/******************************************************************************/
/********************           设置系统时间    *********************************/
/******************************************************************************/
void AdjustTime(void)
  {
   unsigned char const MaxMonthDay[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};//每月的最大天数
   unsigned char LeapyearFlag = 0;
   
   if((NowTime[2]*10 + NowTime[3]) > 12)//Month
     {
      NowTime[2] = 1;
      NowTime[3] = 2;
     }
   if(((NowTime[0]*10 + NowTime[1])%4 == 0) & ((NowTime[2]*10 + NowTime[3]) == 2))//Leapyear
     LeapyearFlag = 1;//是闰年
   else
     LeapyearFlag = 0;
   if((NowTime[4]*10 + NowTime[5]) > (MaxMonthDay[NowTime[2]*10 + NowTime[3]] + LeapyearFlag))//day
     {
      NowTime[4] = MaxMonthDay[NowTime[2]*10 + NowTime[3]]/10;
      NowTime[5] = MaxMonthDay[NowTime[2]*10 + NowTime[3]]%10 + LeapyearFlag;
     }
   if((NowTime[7]*10 + NowTime[8]) > 23)//Hour
     {
      NowTime[7] = 2;
      NowTime[8] = 3;
     }
  }
/******************************************************************************/
/******************************************************************************/
/********************           设置系统时间    *********************************/
/******************************************************************************/
void SetSysTime(void)
  {
    unsigned char  SetTimePos = 0;//设置时间的位置
    unsigned char FlashFlagTemp = 0;
    unsigned char const MaxData[13] = {9,9,1,9,3,9,6,2,9,5,9,5,9};

    LCD_Write_Command(0x01);//清除显示

    while(1)
       {
        FlashFlag = RB0;
        if(FlashFlagTemp == FlashFlag)
          {
           Display_SetTime(SetTimePos);
           FlashFlagTemp =! FlashFlag;
          }
        
         P8563_ReadData(RDADDR,P8563Data,7); //读现在的秒、分、时、日、星期、月、年
         Judge_MeaTime();
         
         if(RD0==0)//后一个
          {
           DelayMs(1);
           if(RD0==0)
             {

⌨️ 快捷键说明

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