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

📄 hicj6.c

📁 这是一个
💻 C
📖 第 1 页 / 共 3 页
字号:
/********************Copyright******************************

名称:HICJ6.C
功能:主程序
说明:
修改:2004/12/24

************************************************************/
#include "P89C60X2.h"
#include "hicj6.h"
#include "hd7279.h"
#include "fram.h"

extern void Trs_Edit(void);
extern void Rcv_Pro(void);
extern void PSendChar(unsigned char);
void Hdd_Check(void);
void Disp_Pro(void);
void Key_Pro(void);
void TrsRelay(BYTE,BYTE);
void Init();

BYTE code LedCode[6]={0x40,0x30,0x08,0x06,0x01,0x80};
BYTE code Bat_Val[5]={0x40,0x60,0x70,0x78,0x7c};
BYTE code  A8_A10[8]={2,1,0,3,4,6,7,5};
DWORD code Full_Val[5]={1000000,10000000,160000000,32000000,320000000};

BYTE data Time_Counter;
BYTE data Trs_Counter;
BYTE data Hdd_Wp,Hdd_Rp;
BYTE data Rcv_Count;
BYTE data  Run_Count;
BYTE data Hdd_En[5],Short_En[5],Break_En[5];
BYTE data ms500;

BYTE data Hdd_New_Bak[5];
BYTE data Hdd_Old[5],Hdd_Old_Bak[5];
extern BYTE data Short_New[5],Break_New[5];
BYTE data Short_Bak,Break_Bak;
BYTE data Key_Count,Pulse,Type;
BYTE data Key_New,Key_Old,Key_Val,Key_Press;
BYTE data Alarm;
extern BYTE data Trs_Wp,Trs_Rp,Rcv_Wp,Rcv_Rp;
extern BYTE data Station,House_Max;
BYTE data Start,House;
BYTE data HddEn_Sum,Key_C,Flash;
BYTE idata TrsRelayOff[5];
BYTE data WriteOrder;
BYTE data Keep_Flag[5];
BYTE idata Short_Old[5];
BYTE idata RelayOff[5];

BYTE xdata Hdd_New[10][5];
BYTE xdata HddVal[40];
BYTE xdata Trs_Buf[25];
BYTE xdata Rcv_Buf[30];
BYTE xdata Hdd10s[40];
BYTE xdata TrsOffCount[40];



bit Trs_Flag,Rcv_Flag,Alarm_Flag;
bit Sp_Flag,Alarm_Check,HddEn_Count;
bit  Ac_New,Ac_Old,Ac_Tmp;
bit  Bat_New,Bat_Old,Bat_Tmp;
BYTE idata Keep_Count[40]=0;
WORD  idata Press_Count;

union hdd_long {BYTE Hdd_B[4];DWORD Hdd_L;} Hdd_Str;

/**********************************************************
*名	   称:serial_int
*功	   能:串口中断函数
*说	   明:处理串口发送、接收数据,每个字节中断一次
*调	   用:
*入口参数:无
*返 回 值:无
***********************************************************/

void serial_int(void) interrupt 4 //using 1
{
 EA=0;
 if (RI)
  {
   RI=0;
   Rcv_Count=0;
    if(Rcv_Wp==29)
    {
     Rcv_Wp=0;
    }
   Rcv_Buf[Rcv_Wp]=SBUF;
   if(
       Rcv_Buf[Rcv_Wp-2]==0xeb && Rcv_Buf[Rcv_Wp-1]==0x90
      &&Rcv_Wp<8)
      {
      	Rcv_Flag=1;
      	Rcv_Rp=Rcv_Wp;
      }
   Rcv_Wp++;
  }
 if (TI)
  {
   TI=0;
   if(Trs_Wp!=Trs_Rp)
    {
    	SBUF=Trs_Buf[Trs_Rp];
    	Trs_Rp++;
    }
    else  DIR485=1;

  }
 EA=1;
 }

/**********************************************************
*名	   称:timer2
*功	   能:定时器2 中断函数
*说	   明:完成定时采集电度端口状态(20MS)及其他一些定时处理
*调	   用:无
*入口参数:无
*返 回 值:无
***********************************************************/
void timer2(void) interrupt 5 //using 2
{
  BYTE data i,j;
  BYTE data P1_Tmp;
  TF2=0;
  Time_Counter++;
  Trs_Counter++;
  Rcv_Count++;
 // Run=~Run;
//  Run=1;

    for (i=0;i<5;i++)
    {
     P1_Tmp=1<<(i+3);
     P1_Tmp=~P1_Tmp&0xf8;
     for(j=0;j<8;j++)
      {
       P1=P1_Tmp|A8_A10[j];
       long_delay();
       if(Hdd==0)
        {
          Hdd_New[Hdd_Wp][i]|=1<<j;
        }
         else
         {
          Hdd_New[Hdd_Wp][i]&=~(1<<j);
         }

      }
    }

// Run=0;

  Hdd_Wp++;
  if(Hdd_Wp==10)
   {
    Hdd_Wp=0;

   }
  if(Key_Val)Key_C++;
  if(!Key)
   {
    Key_Count++;
   }
   else
   {
    Key_Count=0;
   }
  if (Press_Count<1000)
   {
     Press_Count++;
    }
}

/**********************************************************
*名	   称:Disp_Pro
*功	   能:显示处理
*说	   明:将要显示的内容传送给HD7279
*调	   用:write7279
*入口参数:无
*返 回 值:无
***********************************************************/
void Disp_Pro(void)
{
/*
LED 定义
LED[7]-LED[0]  Hdd
LED[9]-LED[8]  House_Code
LED[11]-LED[10] Station-Code

LED[12]         Battery  Red
LED[13]         BAttery  Green
LED[14]         8 @3 LED
LED[15]         One LED
0x80  0x40  0x20  0x10  0x08  0x04  0x02  0x01
A4    B4    B3    B2    B1    A1    A2    A3
A1-Water   0x32
A2-Power   0x31
A3-Gass    0x30
A4-Warm    0x37
B1-heat    0x36
B2-Break   0x35
B3-Short   0x34
B4-Pulse   0x33
从上至下排列,表类型为A,报警类型为B

*/
  BYTE data i,Led[16];

  BYTE Constant_Range;

  Key_Press=0;
  Flash=0;
  i=House%8;
  if((Hdd_En[i]&(1<<i)))
   {
    Read_Hdd(House);
    Hdd_Str.Hdd_L+=HddVal[House];
  
    Constant_Range=Read1B(120+House+0x100);
    Constant_Range>>=4;
     switch (Constant_Range)
                  {
                    case (1):
                             Hdd_Str.Hdd_L*=100; 
                             break;
                    case (2):

                             Hdd_Str.Hdd_L*=10;
                             break;
                  
                    case (4):
                             Hdd_Str.Hdd_L/=10;
                             break;
                    case (5):
                             Hdd_Str.Hdd_L>>=4;
                             break;
                    case (6):
                            Hdd_Str.Hdd_L*=10;
                             Hdd_Str.Hdd_L>>=4;
                             break;
                    case (7):
                             Hdd_Str.Hdd_L*=10;
                             Hdd_Str.Hdd_L>>=5;
                             break;
                    case (8):
                             Hdd_Str.Hdd_L>>=5;
                             break;                                                    
                    default:
                             break;
                  }
  
    
    Led[15]=Read1B(House*3+2+0x100);
    i=Read1B(House*3+1+0x100);
    Led[9]=i/0x10;
    Led[8]=i%0x10;
    if(Led[8]>9)Led[8]=0x0f;
    i=Read1B(House*3+0x100);
    Led[11]=i/0x10;
    Led[10]=i%0x10;
    for(i=8;i<12;i++)
     {
      if(Led[i]>9)Led[i]=0x0f;
     }

    Led[7]=Hdd_Str.Hdd_L/10000000;
    Led[6]= (Hdd_Str.Hdd_L%10000000)/1000000;
    Led[5]=(Hdd_Str.Hdd_L%1000000 )/100000;
    Led[4]=(Hdd_Str.Hdd_L%100000  )/10000;
    Led[3]=(Hdd_Str.Hdd_L%10000   )/1000;
    Led[2]=(Hdd_Str.Hdd_L%1000    )/100;
    Led[1]=(Hdd_Str.Hdd_L%100     )/10;
    Led[0]= Hdd_Str.Hdd_L%10;

    if (Led[7]==0)
    {
      Led[7]=0x0f;
      if(Led[6]==0)
       {
         Led[6]=0x0f;
         if(Led[5]==0)
          {
            Led[5]=0x0f;
           if(Led[4]==0)
            {
              Led[4]=0x0f;
              if(Led[3]==0)
               {
                Led[3]=0x0f;

               }

            }
          }
       }

    }
    i=Read1B(200+House);
    i=(i>>4)&7;
    if(i) Led[i]|=0x80; //Point
    for(i=0;i<8;i++)
     {
       write7279(DECODE0+i,Led[i],0);        //Hdd
     }
    for(i=0;i<4;i++)
     {
       write7279(DECODE0+i,Led[i+8],1);      //House Code
     }

      if(Led[15]>0)
      write7279(DECODE1+7,Led[15],1);
      else
      write7279(DECODE0+7,0x0f,1);
     i=Read1B(200+House);
     i&=0x0f;
      switch (i)
                  {
                    case (0x01):
                             Type=0x04;
                             break;
                    case (0x02):
                             Type=0x02;
                             break;
                    case (0x04):
                             Type=0x01;
                             break;
                    case (0x08):
                             Type=0x80;
                             break;
                    default:
                             Type=0;
                             break;
                  }
      Sp_Flag=0;
      Alarm=0;
      if(Pulse%2) Alarm=0x08;
      Short_Bak=Read1B(170+House/8);
      if(Short_Bak&(1<<(House%8)))
       {
        Alarm|=0x10;
        Sp_Flag=1;
       }
       Break_Bak=Read1B(175+House/8);
      if(Break_Bak&(1<<(House%8)))
       {
        Alarm|=0x20;
        Sp_Flag=1;
       }
       Alarm|=Type;
       Alarm_Flag=1;

       if(Short_New[House/8]&(1<<(House%8)))
         Flash|=1;
       if(Break_New[House/8]&(1<<(House%8)))
         Flash|=2;

   }
   else
   {
      for(i=0;i<8;i++)
     {
       write7279(UNDECODE+i,1,0);
     }
      for(i=0;i<2;i++)
     {
       write7279(UNDECODE+i,1,1);
     }
      write7279(UNDECODE+7,1,1);      //One Led
      Led[11]=(House+1)/10;
      Led[10]=(House+1)%10;
      write7279(DECODE0+2,Led[10],1);
      write7279(DECODE0+3,Led[11],1);
      write7279(UNDECODE+6,0x00,1);           //Type Alarm
      Sp_Flag=0;
   }






 }
 /*
 void Key_Pro(void)
{
  //Key_New=read7279(CMD_READ);
  if(Key_New==0xff) Key_New=0;
  Key_Val=Key_New^Key_Old & Key_New;
  Key_Old=Key_New;
  if (Key_Val==0x3a)
    {
      Key_Press=1;
      House++;
      House=House%House_Sum;
      Press_Count=0;
     }


 }
   */
void Key_Pro(void)
{
  BYTE Key_Tmp;
  Key_New =Key;
  Key_Tmp=(Key_New^Key_Old)&(~Key_New);
  if(Key_Tmp)
   {
    Key_Val=1;
    Key_C=0;
   }
  if(Key_Val)Key_C++;
  Key_Old=Key_New;
  if (Key_C>1)
    {
      Key_Val=0;
      Key_C=0;
      Key_Press=1;
      House++;
      if(House_Max>1)
       {
        House=House%House_Max;
       }
       else House=0;
      Press_Count=0;
     }


 }

 /**********************************************************
*名	   称:LedTest
*功	   能:LED数码管检测
*说	   明:对数码管分别按段、位进行检测
*调	   用:write7279 send_byte
*入口参数:无
*返 回 值:无
***********************************************************/

void LedTest(void)
{
BYTE data i,j;
 send_byte(CMD_RESET,0);     // 清除显示
 cs1=cs2=1;
 send_byte(CMD_RESET,1);
 cs1=cs2=1;
 /*
 send_byte(CMD_TEST,0);
 cs1=cs2=1;
 send_byte(CMD_TEST,1);
 cs1=cs2=1;
 send_byte(CMD_RESET,0);     // 清除显示
 cs1=cs2=1;
 send_byte(CMD_RESET,1);
 cs1=cs2=1;   */
 for(i=0;i<6;i++)
 {
   Speaker=0;
   for(j=0;j<8;j++)
    {
     write7279(UNDECODE+j,LedCode[i],0);
     write7279(UNDECODE+j,LedCode[i],1);

⌨️ 快捷键说明

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