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

📄 show_module1.c

📁 一个电表的程序
💻 C
📖 第 1 页 / 共 2 页
字号:
     if (Stat_Val & S1_Code)                    //D4位
       Set_Lcd_S1();
     if (Stat_Val & S6_Code)                    //D5位
       Set_Lcd_S6();
     LcdBuffer[11] =  Stat_Val & 0x0F;          //D0~D3位
   }



// -------------------------------------------------------------------------

//          处理显示的数据



void LcdDispDataApi(unsigned char  Data[],unsigned char Len,unsigned char Data_Attr)
{
  unsigned char i;

  if (Len>4)
    return;
  for (i=0;i<8;i++)                        //清数码显示缓冲区
    LcdBuffer[i+2]=0;
  if (Data_Attr== Source_Code)              //数据为显示码
   {
    for(i=0;i<Len;i++)
      LcdBuffer[i+2]= GetDispCode(Data[i]);
    return;
   }
  if (Data_Attr == BCD_Code)                   //数据为BCD码
   {
    for(i=0;i<Len;i++)
        {
         LcdBuffer[2*i+2] =GetDispCode((Data[i]) & 0x0F);                //取低位BCD码
         LcdBuffer[2*i+3] =GetDispCode(((Data[i])>>4)&0x0F);             //取高位BCD码
        }
    return;
   }
  if (Data_Attr == Hex_Code)                        //数据为十六进制码
    {
      Temp32 = 0;

      for (i=0;i<Len;i++)
        {
         TempChar[i] = Data[i];
        }

      Temp32 = Hex32BCD(Temp32);            //数进制转换      number
      for(i=0;i<4;i++)
        {
         LcdBuffer[2*i+2] =GetDispCode((TempChar[i]) & 0x0F);                //取低位BCD码
         LcdBuffer[2*i+3] =GetDispCode(((TempChar[i])>>4)&0x0F);             //取高位BCD码
        }
     }
}


//====================================================================================
//          显示error的内容

void ShowError(unsigned char err)
{
  unsigned char i;

  TempChar[0]= E_Code;
  for (i=0;i<12;i++)                        //清数码显示缓冲区
    LcdBuffer[i]=0;
  LcdBuffer[9] = E_Code;
  LcdBuffer[8] = R_Code;
  LcdBuffer[7] = R_Code;
  LcdBuffer[6] = O_Code;
  LcdBuffer[5] = R_Code;
  LcdBuffer[4] = _Code;
  LcdBuffer[3] = GetDispCode((err>>4)&0x0F);
  LcdBuffer[2] = GetDispCode( err & 0x0F);
  LcdDispStatApi(StatFlg);                             //          S---状态显示

  //         上传显示数据

  LcdUpData();                //刷新显示缓冲区的数据
}
//-----------------------------------------------------------------
//根据当前费率在LCD上显示费率级别

void ShowFQ(unsigned char FQdata)
{
  switch (FQdata)
  {
  case 1:
    LcdBuffer[1] |= 4;        //显示“尖”
    break;
  case 2:
    LcdBuffer[1] |= 2;        //显示“峰”
    break;
  case 3:
    LcdBuffer[1] |= 1;         //显示“平”
    break;
  case 4:
    LcdBuffer[1] |= 0x10;      //显示“谷”
    break;
  }
}

/* ==================================================================================================================

* 文件名称:ShowID(unsigned int id)
* 文件标识:
* 摘    要:  1、显示系统数据结构中的可显示的数据项系

*输入参数: 参数为数据结构中的ID标识
*输出参数: 在LCD上显示ID项数据内容,如ID标识错误显示错误信息

* 引用函数: I2C读函数等: I2C_Read(); id搜索函数:Search()

* 当前版本:Ver 1.0
* 作    者:罗冬生
* 修改内容:
* 修改日期:
* 完成日期:
--------------------------------------------------------------------------------------------------------------------*/



//====================================================================================
//          显示ID的内容

unsigned char ShowXH(unsigned int id)
{
  unsigned char ID_Numb,i;
  unsigned char  tempData[4];


  ID_Numb = Search(id);

  if   (!ID_Numb)                       //有可显示ID
     return 1;    //ErrorTrue;    // ShowError(0x02);      //显示序号库没有这序号"error-02"
 // -------------------------------------------------------------------------

//                    处理显示序号

  LcdBuffer[0] = GetDispCode(Disp_Count & 0x0F);      // 处理显示序号

// -------------------------------------------------------------------------

//                    处理显示的数据



  if   ((SysDataTree[ID_Numb].Icons1==0xff) && (SysDataTree[ID_Numb].Icons2==0xff))
        return 1;    //ErrorTrue;     // ShowError(0x03);                  //不可显示序号 "error-03"

  i= (SysDataTree[ID_Numb].Length) & 0x7f;       //除去数据读写属性

  if (i>4)                           //显示数据最大长度为4个字节
        {i=4;}
  MoveData_Api((SysDataTree[ID_Numb].Adr),  (unsigned int)(&tempData[0])+xRAM_Adr, i);

  LcdDispDataApi(tempData, i, BCD_Code);       //     处理显示的数据, BCD_Code为数据类型,可以设置其他类型
 // -----------------------------------------------------------------------------------------
            //       显示数据汉字提示

      LcdBuffer[10] = SysDataTree[ID_Numb].Icons2 ;
      i = SysDataTree[ID_Numb].Icons1  ;

      if ( i & Gu_seg)
      {
        LcdBuffer[1]=0;
        switch (i & 0x17)
        {
          case Gu_seg:
            LcdBuffer[1] = i;
            break;
          case Point_1:
            Set_Lcd_P5();                         //P5   第一位小数点
            break;
          case Point_2:
            Set_Lcd_P4();                         //P5   第二位小数点
            break;
          case Point_3:
            Set_Lcd_P3();                         //P5   第三位小数点
            break;
          case Point_4:
            Set_Lcd_P2();                         //P5   第四位小数点
            break;
        }
        if ((i & U_FH)==U_FH)                        //D4,D3=11,
        {                                  // 显示电压值
          for (i=0;i<7;i++)
             LcdBuffer[9-i] = LcdBuffer[8-i];
          LcdBuffer[2]=u_Code;                   //输出电压符号u
        }
        else  if ((i & TEMP_FH)==TEMP_FH)
        {                                        //显示温度符号'C
           LcdBuffer[7] = LcdBuffer[5];
           LcdBuffer[6] = LcdBuffer[4];
           LcdBuffer[5] = LcdBuffer[3];
           LcdBuffer[4] = LcdBuffer[2];

           LcdBuffer[3] = 0x02;                   //'
           LcdBuffer[2] = C_Code;                 //C
        }
      }
      else
      {
        LcdBuffer[1] = i ;
      }

// -------------------------------------------------------------------------

//          Pont---小数点处理

      if (LcdBuffer[1] &  DianLiang_seg)       //置电量小数点
         Set_Lcd_P4();                         //P4


      if (LcdBuffer[10] & (RiQi_seg ))
         {                                     //显示20xx年xx月xx日
     //     Set_Lcd_P4();
          LcdBuffer[9]= GetDispCode(2);
          LcdBuffer[8]= GetDispCode(0);
          Set_Lcd_P6();
         }
      if ((LcdBuffer[10] & Shi_Time) && ( LcdBuffer[10] & Jian_Time))
         {                                                               //显示时间 :xx 时xx 分xx 秒
          Set_Lcd_P6();
          Set_Lcd_P2();
          Set_Lcd_P4();
          ShowFQ(DQ_Fl);
         }

     if ((LcdBuffer[10] & Shi_Time) && ( LcdBuffer[10] & Duan_seg))
         {                                                           //显示时段 :xx 时xx 分-X
          Set_Lcd_P4();
          Set_Lcd_P2();
          LcdBuffer[3] = GetDispCode(0x17);        //显示代码序号17为 "-"
         }


// -------------------------------------------------------------------------

//          S---状态显示处理

     LcdDispStatApi(StatFlg);
     if (Key_Flg)
       LcdBuffer[6] |=0x80;    //显示编程锁符号
  //   if (DongTine_Flg)
  //     LcdBuffer[6] &=0x80;    //显示“冬”符号

 // -------------------------------------------------------------------------

 //         上传显示数据

     LcdUpData();                //刷新显示缓冲区的数据

     return 0;  // ErrorFalse;
 }





// ---------------------------------------------------------------------------------------------

void DisplayCount(void)
{
  unsigned char i;
  i=0;
  if (Disp_Count >= Disp_idLen)
     Disp_Count=0;
  while (ShowXH(rRttDspNo_Dtr[Disp_Count]))
  {
    if (rRttDspNo_Dtr[Disp_Count]==0xC33F)    //费率显示
    {
       FlDispModule(&Disp_Count);
       break;
    }

    Disp_Count++;
    if (Disp_Count >= Disp_idLen)
       Disp_Count=0;
    i++;
    if (i > Disp_idLen)
    {
       ShowXH(0x9010);
       break;
    }
  }
}



//===============================================================================================
//          固定循环显示 ,显示序号在:Disp_Count 中
//          每一秒钟调用一次



   void LcdDispModule(void)
   {
     if (Disp_Flg)                               //显示标志
     {
        if (Disp_Time)
        {
          DisplayCount();       //刷新显示缓冲区的数据
        }
        else
        {
          if (rStpDspTm_Dtr[0])            //判断停显时间
          {
            Disp_Time = rStpDspTm_Dtr[0];
            Disp_Flg = 0;                         // 置停显标志
            LcdSetDisplay(0);                     // 清显示屏  (也可以置lcd不使能)
          }
          else
          {
            Disp_Time = rShftDspTm_Dtr[0];
            Disp_Count++;
            DisplayCount();       //刷新显示缓冲区的数据
          }
        }
     }
     else if (!Disp_Time)
     {
        Disp_Flg = 1;                         // 置显标志
        Disp_Time = rShftDspTm_Dtr[0];
        Disp_Count++;
        DisplayCount();       //刷新显示缓冲区的数据
      }
   }

 //********************************************************************************

//函数名称:   按键显示模块:KeyDispModule

//函数描述:   将显示缓冲区"DispDataBuff"(显示数据结构体)的数据送液晶屏显示

//输入参数:  1、 "DispDataBuff"(显示数据结构体)的数据,见结构体;2、输入数据属性。

//输出参数:  无

//********************************************************************************



 //===========================================================================================

 __idata unsigned char KeyDispCount;

 void  KeyDispModule(void)
 {
   unsigned char i;
   unsigned int temp,Id;
   if (!Key_Disp)
   {
      LcdBuffer[11] |= 0x08;    //显示按键符号
      LcdUpData();              //刷新显示
      DelayMs(5);
      if  (Key_Disp)
        return;
      while (!Key_Disp)
      {
        ClearWatchDog();
      }

      KeyDispCount++;
      for (i=0;i<Disp_idLen;i++)
      {
         if (KeyDispCount>=Disp_idLen)
            KeyDispCount=0;
         temp = 2*KeyDispCount + eKeyDspNo_Dtr + e2RAM_Adr;
         MoveData_Api(temp,(unsigned int)(&Id)+xRAM_Adr,2);     //读出要显示ID
         if (Id==0xC33F)
         {
            FlDispModule(&KeyDispCount);
            break;
         }
         if (ShowXH(Id))
         {
            KeyDispCount++;
         }
         else
         {
            Disp_Time = rShftDspTm_Dtr[0];
            Disp_Flg = 0;                         // 置停显标志
            break;
         }
      }
   }
}


//--------------------------------------------------------------------------------------
//       显示费率程序



unsigned char FlDispCount;

void  FlDispModule(unsigned char __idata *count)
{
  unsigned char tempData[6];

  if (FlDispCount>=10)                //10个日时段
     FlDispCount=0;


  MoveData_Api(3*FlDispCount + eFlTbl_Dtr+e2RAM_Adr,(unsigned int)(&tempData[0])+xRAM_Adr ,6);
  LcdDispDataApi(tempData, 3, BCD_Code);       //     处理显示的数据, BCD_Code为数据类型,可以设置其他类型
  LcdBuffer[3] = _Code;
  Set_Lcd_P6();
  Set_Lcd_P2();
  LcdBuffer[0]=0;
  LcdBuffer[10]=7;
  LcdBuffer[1]=0;

  ShowFQ(tempData[0]);

  if (tempData[3]==0)
     FlDispCount=0;
  else
  {
   FlDispCount++;
   if (FlDispCount>=10)
     FlDispCount=0;
   else
     (*count)--;
  }

  Disp_Time = rShftDspTm_Dtr[0];        //显示15秒
  Disp_Flg = 0;                         // 置停显标志

  LcdDispStatApi(StatFlg);
  if (Key_Flg)
     LcdBuffer[6] |=0x80;    //显示编程锁符号
  LcdUpData();                //刷新显示缓冲区的数据

}

//--------------------------------------------------------------------------------

#endif

⌨️ 快捷键说明

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