📄 hicj6.c
字号:
/********************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 + -