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

📄 systemfun.c

📁 该程序用msp430单片机开发了一款单相电子式多费率电能表
💻 C
字号:
unsigned char Byte2BCD(unsigned char Data)
{
   unsigned char Rslt=0;
   if (Data>=99) return 0x99;
   while(Data>9)
   {
      Data-=10;
      Rslt+=0x10;
   }
   return(Rslt+Data);
}

//*************Flash补充*************************/
void MemFill( unsigned char *Data_Ptr, unsigned int Len, unsigned char byte )
{
   while ( Len>0 )
   {
      *Data_Ptr = byte;
      Data_Ptr++;
      Len--;
   }
}



void Word2BCD2(unsigned char *Ptr, unsigned long Data)
{  
   *(Ptr+2)= 0;
   *(Ptr+1)= 0;
   *Ptr= 0;
   while(Data>=100000)
   {
      Data-=100000;
      *(Ptr+2) += 0x10;
   } 
   while(Data>=10000)
   {
      Data-=10000;
      *(Ptr+2) += 0x01;
   }
    while(Data>=1000)
   {
      Data-=1000;
      *(Ptr+1) += 0x10;
   }
   while(Data>=100)
   {
      Data-=100;
      *(Ptr+1) += 0x1;
   }
   *Ptr = Byte2BCD( (char)Data );
}

//看门狗检测
void WatchdogFun(void)
{
  	WDTCTL = WDT_ARST_1000;
	BtCycle++;
  	if(BtCycle>1)
  	{
  	  BtCycle = 0;
  	  SystemFlag |= BT_Flag;
  	}
  	SystemFlag &= ~WatchDog_Flag;
}
//基本时钟
void BT_Process(void)
{
	_NOP();
  	SystemFlag &= ~BT_Flag;
  	if(((POWER_TEST_IN & POWER_TEST_BIT) == 0) && ((ESPCTL & ESPEN) == ESPEN))
  	{
  	  MBOUT1= modeIDLE; // ESP_IDLE;
  	  MBOUT0= mSET_MODE;
   	  while ((ESP430_STAT0 & ACTIVEME) == ACTIVEME); // Wait for Idle mode
	  TACCTL0 = 0;
	  if ((ESP430_STAT0 & ACTIVEME) == 0)
      	  {
      	    ESPCTL = 0;
      	    _NOP();_NOP();_NOP();_NOP();_NOP();
      	    _NOP();_NOP();_NOP();_NOP();_NOP();
      	    ulActP1 = 0;
            ulReActP = 0;
      	    ulAppP = 0;
      	    uiV1Rms = 0;
      	    ulIRms = 0;
      	    iPf = 0;
      	    uiMainsFrequency = 0;
      	  //MetParConv();
      	    SCFI0 = FLLD_1;  			    // Freq = 1.024MHz
      	    SCFQCTL = 32 - 1;
      	    FLL_CTL0 &= ~DCOPLUS;
     	    MeterRunState &= ~Voltage_Flag;
      	    SystemFlag |= DataSave_Flag;
    	  }
  	}
  	else if(((POWER_TEST_IN & POWER_TEST_BIT) == POWER_TEST_BIT) && ((ESPCTL & ESPEN) == 0))
  	{
    	  Goto_High_Freq();
    	  Init_Analog_Front_End_ESP();
    	  Init_ESP_Parameter();  //初始化ESP参数寄存器
    	  Start_Measurement();  // 进入测量模式
    	  MeterRunState |= Voltage_Flag;
  	}
  	if(MeterRunState&Skip_Second)
  	{
    	  MeterRunState &= ~Skip_Second;
  	}
  	else
  	{
    	  Clk_Sys();
          Ms_1--;
          if(Ms_1== 0)
          { 
            Ms_1=5;
            Pages++;
            if(Pages>6)
              Pages=0;
          }
  	}
  	SystemFlag |= LCD_Flag;
}

void ESP_ENRDYFG_Process(void)
{
  SystemFlag &= ~ESP_ENRDYFG;
  uiV1Rms = ((unsigned long)uiV1Rms*Esp.uiV1Gain)/POW_2_15;
  Word2BCD2(ubV1Rms,uiV1Rms);
  ulIRms = ulIRms>>14;
  ulIRms = (unsigned long long)ulIRms*Esp.ulIGain/POW_2_18;
  
  Word2BCD2(ubIRms,ulIRms);
  iPf = (unsigned long)uiPowerFct*10000/POW_2_14;
  Word2BCD2(iPowerFct,iPf);
  if(ullMainsCntBak==0)
  {
    uiMainsFrequency = 0;
  }
  else
  {
    ullMainsCntBak = ullMainsCntBak*104857600;
    uiMainsFrequency = ullMainsCntBak/ulMainsPeriodBak;
  }
  //MetParConv();
  SystemFlag |= LCD_Flag;
}

void LCD_Process(void)
{
  SystemFlag &= ~LCD_Flag;
  UpdataDisplay();
}
void KeyPage(void)
{
  if(P1IFG & KEY_BIT)
  {
    P1IFG &= ~KEY_BIT;
    bgbzh = 0x01;
    bgtimer = 0x00;
    BG_OUT |= BG_BIT;
    Pages++;
    SystemFlag |= LCD_Flag;
    Ms_1 = 30;
    if(Pages >6)
      Pages = 0;
  }
  UpdataDisplay();
}



⌨️ 快捷键说明

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