uvsensor.c

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

C
1,665
字号
   DataTemp = Eep_MeaData.EndTime;
   LCD_set_xy(5,3);
   if(FlashFlag&&(Pos==6))
      LCD_Write_Data(FlashPic);
   else
      LCD_Write_Data((unsigned char)((DataTemp >> 12)&0x000F) + '0');
   if(FlashFlag&&(Pos==7))
      LCD_Write_Data(FlashPic);
   else
      LCD_Write_Data((unsigned char)((DataTemp >> 8)&0x000F) + '0');
   LCD_Write_Data(':');
   if(FlashFlag&&(Pos==8))
      LCD_Write_Data(FlashPic);
   else
      LCD_Write_Data((unsigned char)((DataTemp >> 4)&0x000F) + '0');
   if(FlashFlag&&(Pos==9))
      LCD_Write_Data(FlashPic);
   else
      LCD_Write_Data((unsigned char)((DataTemp)&0x000F) + '0');
   LCD_Write_Data(' ');

  }
void Change_MeaValue(unsigned char Pos,unsigned char Direction)
  {
   switch(Pos)
      {
       case 0 :
           Eep_MeaData.Mea_Switch = !Eep_MeaData.Mea_Switch;
       break;
       case 1 :
          if(Direction)//++
            {
             Eep_MeaData.Time ++;
             if(Eep_MeaData.Time > 9)
               Eep_MeaData.Time = 1;
            }
          else//--
            {
             if(Eep_MeaData.Time == 1)
                Eep_MeaData.Time = 9;
             else
                Eep_MeaData.Time --;
            }
       break;
//Start Time
      case 2 : 
          if(Direction)//++
            {
             Eep_MeaData.StartTime += 0x1000;
             if((Eep_MeaData.StartTime & 0xF000) > 0x2000)
               Eep_MeaData.StartTime &= 0x0FFF;
            }
          else//--
            {
             if((Eep_MeaData.StartTime & 0xF000) == 0)
                Eep_MeaData.StartTime |= 0x2000;
             else
                Eep_MeaData.StartTime -= 0x1000;
            }
       break;
       case 3 :
          if(Direction)//++
            {
             Eep_MeaData.StartTime += 0x0100;
             if((Eep_MeaData.StartTime & 0x0F00) > 0x0900)
               Eep_MeaData.StartTime &= 0xF0FF;
            }
          else//--
            {
             if((Eep_MeaData.StartTime & 0x0F00) == 0)
                Eep_MeaData.StartTime |= 0x0900;
             else
                Eep_MeaData.StartTime -= 0x0100;
            }
       break;
       case 4 :
          if(Direction)//++
            {
             Eep_MeaData.StartTime += 0x0010;
             if((Eep_MeaData.StartTime & 0x00F0) > 0x0050)
               Eep_MeaData.StartTime &= 0xFF0F;
            }
          else//--
            {
             if((Eep_MeaData.StartTime & 0x00F0) == 0)
                Eep_MeaData.StartTime |= 0x0050;
             else
                Eep_MeaData.StartTime -= 0x0010;
            }
       break;
       case 5 :
          if(Direction)//++
            {
             Eep_MeaData.StartTime += 0x0001;
             if((Eep_MeaData.StartTime & 0x000F) > 0x0009)
               Eep_MeaData.StartTime &= 0xFFF0;
            }
          else//--
            {
             if((Eep_MeaData.StartTime & 0x000F) == 0)
                Eep_MeaData.StartTime |= 0x0009;
             else
                Eep_MeaData.StartTime -= 0x0001;
            }
       break;
//End Time
       case 6 :
          if(Direction)//++
            {
             Eep_MeaData.EndTime += 0x1000;
             if((Eep_MeaData.EndTime & 0xF000) > 0x2000)
               Eep_MeaData.EndTime &= 0x0FFF;
            }
          else//--
            {
             if((Eep_MeaData.EndTime & 0xF000) == 0)
                Eep_MeaData.EndTime |= 0x2000;
             else
                Eep_MeaData.EndTime -= 0x1000;
            }
       break;
       case 7 :
          if(Direction)//++
            {
             Eep_MeaData.EndTime += 0x0100;
             if((Eep_MeaData.EndTime & 0x0F00) > 0x0900)
               Eep_MeaData.EndTime &= 0xF0FF;
            }
          else//--
            {
             if((Eep_MeaData.EndTime & 0x0F00) == 0)
                Eep_MeaData.EndTime |= 0x0900;
             else
                Eep_MeaData.EndTime -= 0x0100;
            }
       break;
       case 8 :
          if(Direction)//++
            {
             Eep_MeaData.EndTime += 0x0010;
             if((Eep_MeaData.EndTime & 0x00F0) > 0x0050)
               Eep_MeaData.EndTime &= 0xFF0F;
            }
          else//--
            {
             if((Eep_MeaData.EndTime & 0x00F0) == 0)
                Eep_MeaData.EndTime |= 0x0050;
             else
                Eep_MeaData.EndTime -= 0x0010;
            }
       break;
       case 9 :
          if(Direction)//++
            {
             Eep_MeaData.EndTime += 0x0001;
             if((Eep_MeaData.EndTime & 0x000F) > 0x0009)
               Eep_MeaData.EndTime &= 0xFFF0;
            }
          else//--
            {
             if((Eep_MeaData.EndTime & 0x000F) == 0)
                Eep_MeaData.EndTime |= 0x0009;
             else
                Eep_MeaData.EndTime -= 0x0001;
            }
       break;
       default : break;
      }

  }
/******************************************************************************/
/*****************                 设置测量状态             ****************************/
/******************************************************************************/
void SetMeasureState(void)
  {
   unsigned char SetPos = 0;
   unsigned char FlashFlagTemp = 0;//初始化,一定要记住
   
   LCD_Write_Command(0x01);//清除显示

   ReadMeasureParam();
   Display_SetState(SetPos);

   while(1)
     {
      FlashFlag = RB0;
      if(FlashFlagTemp == FlashFlag)
        {
         Display_SetState(SetPos);
         FlashFlagTemp =! FlashFlag;
        }
        
      P8563_ReadData(RDADDR,P8563Data,7); //读现在的秒、分、时、日、星期、月、年
      Judge_MeaTime();
      
      if(RD0==0)//后一个
       {
        DelayMs(1);
        if(RD0==0)
         {
          while(!RD0);
          if(SetPos == 0)
            SetPos = 9;
          else
            SetPos--;
         Display_SetState(SetPos);
         }
       }
      if(RD1==0)//前一个
       {
        DelayMs(1);
        if(RD1==0)
         {
          while(!RD1);
          SetPos++;
          if(SetPos > 9)
            SetPos = 0;
         Display_SetState(SetPos);
         }
       }
      if(RD2==0)//--
       {
        DelayMs(1);
        if(RD2==0)
         {
          while(!RD2);
          Change_MeaValue(SetPos,0);
          Display_SetState(SetPos);
         }
       }
      if(RD3==0)//++
       {
        DelayMs(1);
        if(RD3==0)
         {
          while(!RD3);
          Change_MeaValue(SetPos,1);
          Display_SetState(SetPos);
         }
       }
      if(RD4==0)//确定
       {
        DelayMs(1);
        if(RD4==0)
         {
          while(!RD4);
          SaveMeasureParam();//写入新的参数
          return;
         }
       }
      if(RD5==0)//取消
       {
        DelayMs(1);
        if(RD5==0)
         {
          while(!RD5);
          ReadMeasureParam();//重新读出参数
          return;
         }
       }
     }
  }
/******************************************************************************/
/********************                   IO口初始化        **************************/
/********************    '0'表示输出;'1'表示输入。************************/
/******************************************************************************/
void IO_Init(void)
  {
   TRISB0 = 1;//input
   TRISC = 0x00;
   TRISD = 0x3F;        
   TRISE = 0x00;        
  }
/******************************************************************************/
/**************          A/D 转换初始化子程序        ****************************/
/******************************************************************************/
void AD_init(void)
  {
   TRISA0=1; //设置RA0 为输入方式
   ADCON0 = 0x81;  //选择A/D 通道为RA0,打开A/D 转换器;AD 转换时钟为32tosc
   ADCON1 = 0X85; //转换结果右移,及ADRESH 寄存器的高6 位为"0",外部基准电压
  }
/******************************************************************************/
/******************************************************************************/
/******************************************************************************/
void main(void)
 {
  unsigned char const P85636Init[14] = {0x00,0x00,0x01,0x00,0x12,0x25,0x01,0x09,0x06,0x80,0x80,0x80,0x80,0x83}; //定义初始化字
  unsigned char const MeaDataInit[6] = {0,3,0x08,0x30,0x17,0x30};
  unsigned char MenuPos = 0;
  unsigned char i,DataTemp;
//初始化
  IO_Init();
  AD_init();
  MSSP_initi();
  LCD_Init();
  MainMenuFlag = 1;

//*//test//数据清零
  if((RD0==0)&(RD1==0)&(RD2==0))
    {
     DataTemp = 0xff;
     Write_24C512(0x0000,1, &DataTemp);
    }
//endtest*/
     
  DataTemp = 0x83;///1Hz频率输出
  P8563_WriteData(0x000D,&DataTemp,1); 
  
  P8563_ReadData(RDADDR,P8563Data,7); //读现在的秒、分、时、日、星期、月、年

  if(P8563Data[6]<0x06)//时间早于06年
    {
     for(i=0;i<14;i++)
        {
         DataTemp = P85636Init[i];
         P8563_WriteData(WRADDR+i,&DataTemp,1); 
        }
    P8563_ReadData(RDADDR,P8563Data,7); //读现在的秒、分、时、日、星期、月、年
    PData_To_Time(P8563Data);
    SetSysTime();
    }
    
  Read_24C512(0x0000,1, &DataTemp);//第一次读数据
  if(DataTemp != 0x55)
    {
     for(i=0;i<6;i++)
        {
         DataTemp = MeaDataInit[i];
         Write_24C512(0x0005 + i,1, &DataTemp);
        }
     SetMeasureState();
    }

  ReadMeasureParam();//读测量参数

  while(1)
   {
    FlashFlag = RB0;
    P8563_ReadData(RDADDR,P8563Data,7); //读现在的秒、分、时、日、星期、月、年
    PData_To_Time(P8563Data);
    Display_Menu(MenuPos);
    if(Judge_MeaTime())
      {
       MainMenuFlag = 1;
      }
   
    if(RD0==0)//后一个
     {
      DelayMs(10);
      if(RD0==0)
        {
         while(!RD0);
         if(MenuPos == 0)
            MenuPos = 2;
         else
           MenuPos --;
        }
     }
    if(RD1==0)//前一个
     {
      DelayMs(10);
      if(RD1==0)
        {
         while(!RD1);
         MenuPos ++;
         if(MenuPos>2)
            MenuPos = 0;
       }
    }
    if(RD4==0)//确定
     {
      DelayMs(10);
      if(RD4==0)
        {
         while(!RD4);
         switch(MenuPos)
            {
             case 0 ://scan data
                    ScanSensorData();
                    MainMenuFlag = 1;
             break;
             case 1 ://Set time
                   SetSysTime();
                   MainMenuFlag = 1;
             break;
             case 2 ://set state
                  SetMeasureState();
                   MainMenuFlag = 1;
             break;
             default : break;
            }
         }
        }
    /*
    if(RD2==0)//--
     {
      while(!RD2);
     }
  
    if(RD3==0)//++
     {
      while(!RD3);
     }

    if(RD5==0)//取消
     {
      while(!RD5);
     }
     */
  }
 }

⌨️ 快捷键说明

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