📄 hicj6.c.bak
字号:
/********************Copyright******************************
名称:HICJ6.C
功能:主程序
说明:
修改:2004/12/24
************************************************************/
#include "P89C60X2.h"
#include "hicj6.h"
#include "hd7279.h"
#include "fm25040.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 Relay_Station=13;
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[4]={1000000,10000000,160000000,32000000};
BYTE data Time_Counter;
BYTE idata Trs_Counter;
BYTE data Hdd_Wp,Hdd_Rp;
BYTE idata Press_Count,Rcv_Count;
BYTE data Run_Count;
BYTE data Hdd_En[5],Short_En[5],Break_En[5];
BYTE data Ms10;
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 idata 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 Change[5];
BYTE data WriteOrder;
BYTE data Keep_Flag[5];
BYTE idata Short_Old[5];
BYTE idata RelayOff[5];
BYTE xdata Hdd_New[20][5];
BYTE xdata HddVal[40];
BYTE xdata Trs_Buf[25];
BYTE xdata Rcv_Buf[30];
//BYTE xdata Hdd10s[40];
//BYTE xdata RelayOffTimes[40];
//WORD 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];
//BYTE idata Hdd_New[2][5];
union hdd_long {BYTE Hdd_B[4];DWORD Hdd_L;} Hdd_Str;
union Full_Str {BYTE Full_B[4];unsigned long Full_L;} Full;
/**********************************************************
*名 称:serial_int
*功 能:串口中断函数
*说 明:处理串口发送、接收数据,每个字节中断一次
*调 用:
*入口参数:无
*返 回 值:无
***********************************************************/
void serial_int(void) interrupt 4 //using 1
{
EA=0;
if (RI)
{
RI=0;
Rcv_Count=0;
Rcv_Wp++;
}
if (TI)
{
TI=0;
}
EA=1;
}
/**********************************************************
*名 称:timer2
*功 能:定时器2 中断函数
*说 明:完成定时采集电度端口状态(10MS)及其他一些定时处理
*调 用:无
*入口参数:无
*返 回 值:无
***********************************************************/
void timer2(void) interrupt 5 //using 2
{
BYTE data i,j;
BYTE data P1_Tmp;
TF2=0;
Ms10++;
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;
/*
for(B_i1=0;B_i1<5;B_i1++)
{
if(TrsRelayOff[B_i1])
{
for(B_i2=0;B_i2<8;B_i2++)
{
B_i3=1<<B_i2;
if(TrsRelayOff[B_i1]&B_i3)
TrsOffCount[B_i1*8+B_i2]++;
}
}
}
*/
Hdd_Wp++;
if(Hdd_Wp==20)
{
Hdd_Wp=0;
}
if(Key_Val)Key_C++;
if(!Key)
{
Key_Count++;
}
else
{
Key_Count=0;
}
if (Press_Count<250)
{
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)))
{
// Hdd_Str.Hdd_L=HddVal[House];
Read_Hdd(House);
// Hdd_Str.Hdd_L>>=5; // /3200
Led[15]=Read1B(House*3+2,1);
i=Read1B(House*3+1,1);
Led[9]=i/0x10;
Led[8]=i%0x10;
if(Led[8]>9)Led[8]=0x0f;
i=Read1B(House*3,1);
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,0);
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,0);
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,0);
if(Short_Bak&(1<<(House%8)))
{
Alarm|=0x10;
Sp_Flag=1;
}
Break_Bak=Read1B(175+House/8,0);
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数码管检测
*说 明:对数码管分别按段、位进行检测 send_byte 后的片选为什么要独立?
*调 用: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);
}
delay10ms(20);
Speaker=1;
delay10ms(80);
}
send_byte(CMD_RESET,0); // 清除显示
cs1=cs2=1;
send_byte(CMD_RESET,1);
cs1=cs2=1;
for(i=1;i<8;i++)
{
Speaker=0;
write7279(UNDECODE+7-i,0xff,1);
delay10ms(20);
Speaker=1;
delay10ms(80);
send_byte(CMD_RESET,1); // 清除显示
cs1=cs2=1;
}
Speaker=0;
write7279(UNDECODE+7,0xff,1);
delay10ms(20);
Speaker=1;
delay10ms(80);
send_byte(CMD_RESET,1); // 清除显示
cs1=cs2=1;
for(i=0;i<8;i++)
{
Speaker=0;
write7279(UNDECODE+7-i,0xff,0);
delay10ms(20);
Speaker=1;
delay10ms(80);
send_byte(CMD_RESET,0); // 清除显示
cs1=cs2=1;
}
}
void HddEn_Count_Pro(void)
{
BYTE i,j;
HddEn_Sum=0;
for (i=0;i<5;i++)
{
for(j=0;j<8;j++)
{
if((Hdd_En[i]&(1<<j))!=0)
{
HddEn_Sum++;
House_Max=i*8+j+1;
}
}
}
}
/**********************************************************
*名 称:InitFram
*功 能:从铁电存储器FM25040中读取参数,给变量赋值
*说 明:参考HICJ6.H中的地址分配表
*调 用:Write1B Read1B Write_Hdd Read_Hdd
*入口参数:无
*返 回 值:无
***********************************************************/
void InitFram()
{
BYTE data i,j;
unsigned long First_Flag;
First_Flag=Read_Hdd(40);
// if (First_Flag!=0x5555aaaa)
{
Hdd_Str.Hdd_L=0x5555aaaa;
Write_Hdd(40);
for(i=0;i<160;i++)
{
Write1B(0,i,0);
}
Write1B(1,164,0);
Write1B(0,165,0);
Write1B(40,166,0);
for(i=0;i<5;i++)
{
Write1B(0,170+i,0); // Clear Short_Bak
Write1B(0,175+i,0); // Clear Break_Bak
}
for(i=200;i<240;i++)
{
Write1B(0x21,i,0);
}
for(i=240;i<255;i++)
{
Write1B(0xff,i,0);
}
Write1B(0x00,255,0); //Start
for(i=0;i<40;i++) //House Code
{
Write1B(1,i*3,1);
j=((i+1)/10)*16+(i+1)%10;
Write1B(j,i*3+1,1);
Write1B(0,i*3+2,1);
}
for(i=120;i<160;i++)
{
Write1B(0x36,i,1);
}
for(i=200;i<240;i++)
{
Write1B(0x87,i,1);
}
}
for(i=0;i<5;i++)
{
Hdd_En[i]=Read1B(250+i,0);
Short_En[i]=Read1B(240+i,0);
Break_En[i]=Read1B(245+i,0);
}
for(i=0;i<40;i++)
{
HddVal[0]=0;
}
Station=Read1B(164,0);
Write1B(0x80,255,0);
//House=House_Max-1;
Start=Read1B(255,0);
}
/**********************************************************
*名 称:InitTimer
*功 能:定时器初始化
*说 明:
*调 用:
*入口参数:无
*返 回 值:无
***********************************************************/
void InitTimer(void)
{
TMOD=0x22; /*定时器1为模式2(8位自动重装),
定时器0为模式2(8位自动重装) */
PCON=00;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -