?? hicj6.c
字號:
void InitTimer(void)
{
TMOD=0x22; /*定時器1為模式2(8位自動重裝),
定時器0為模式2(8位自動重裝) */
PCON=00;
TR0=0; //在發送或接收才開始使用
TF0=0;
TH0=(256-192); //4800bps 就是 1000000/4800=208.333微秒 執行的
//timer是 208.333*11.0592/12= 192
TL0=TH0;
TH1=0xfa; //9600-FD 4800-FA 2400-F4 1200-E8 300-A0
TL1=0xfa;
SCON=0x50;
T2CON = 0x04; //定時器2為16位自動重裝,遞增計數
T2MOD = 0x00;
TH2 = 0xb8; //dc 10ms
TL2 = 0x00;
RCAP2H = 0xb8; //20ms定時
RCAP2L = 0x00; //11.0592M晶振,
//20000*11.0592/12=0x4800 0x100-0x48=0xb8
ET2=1;
ET0=1;
// EX1=1;
ES=1;
TR1=1;
// ET1=1;
EA=1;
TI=0;
}
/**********************************************************
*名 稱:InitDD
*功 能:電度口狀態初始化
*說 明:
*調 用:
*入口參數:無
*返 回 值:無
***********************************************************/
void InitDD(void)
{
BYTE data i,j,P1_Tmp;
for (i=0;i<5;i++) //初始化電度狀態 Hdd_New[10][5]
{
for(j=0;j<8;j++)
{
P1_Tmp=1<<(i+3);
P1_Tmp=~P1_Tmp&0xf8;
P1=P1_Tmp|A8_A10[j];
long_delay();
if(Hdd==0)
{
Hdd_Old[i]|=(1<<j);
}
else
{
Hdd_Old[i]&=~(1<<j);
}
}
Hdd_New_Bak[i]=Hdd_Old[i];
Hdd_Old_Bak[i]=Hdd_Old[i];
}
}
/**********************************************************
*名 稱:Init
*功 能:初始化
*說 明:
*調 用:
*入口參數:無
*返 回 值:無
***********************************************************/
void Init()
{
BYTE data i,j;
/*
for(i=0;i<40;i++)
{
Hdd10s[i]=0;
RelayOffTimes[i]=0;
TrsOffCount[i]=0;
}
for(i=0;i<5;i++)
{
RelayOff[i]=0;
TrsRelayOff[i]=0;
Keep_Flag[i]=0;
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++)
{
Hdd_Str.Hdd_L=Read_Hdd(i);
} */
Sp_Flag=0;
Key_Count=0;
Key_New=Key_Old=Key;
Ac_Old=~Ac_Check;
Press_Count=1000;
Rcv_Wp=0;
Rcv_Rp=0;
Run_Count=0;
HddEn_Count=1;
Ms20=0;
Hdd_Wp=0;
WriteOrder=0;
InitFram();
InitDD();
LedTest();
InitTimer();
}
/**********************************************************
*名 稱:Hdd_Check
*功 能:電度采集處理
*說 明:
*調 用:
*入口參數:無
*返 回 值:無
***********************************************************/
void Hdd_Check(void)
{
BYTE i,j;
BYTE Hdd_Tmp[5];
// BYTE Constant_Range,Range;
for (i=0;i<5;i++)
{
/* if(Press_Count==101)
{
if(Short_New[i]^Short_Old[i]) Alarm_Check=1;
Short_Old[i]=Short_New[i];
}
*/
// Run=1;
Hdd_Tmp[i]=Hdd_New[Hdd_Rp][i]^Hdd_Old[i];
Hdd_Old[i]=Hdd_New[Hdd_Rp][i];
if(Hdd_Tmp[i]) //有變位
{
for(j=0;j<8;j++)
{
if(Hdd_Tmp[i]&(1<<j))
{
Keep_Count[i*8+j]=0;
Keep_Flag[i]|=(1<<j);
//Ac_Count[i*8+j]++;
}
}
}
else //無變位
{
if(Keep_Flag[i])
{
for(j=0;j<8;j++)
{
if(Keep_Flag[i]&(1<<j))
{
Keep_Count[i*8+j]++;
if(Keep_Count[i*8+j]>Smooth)
{
Keep_Count[i*8+j]=0;
Keep_Flag[i]&=~(1<<j);
Hdd_New_Bak[i]&=~(1<<j);
if (Hdd_New[Hdd_Rp][i]&(1<<j))
{
Hdd_New_Bak[i]|=(1<<j);
}
}
}
}
}
}
}
for(i=0;i<5;i++)
{
Hdd_Tmp[i]=Hdd_New_Bak[i]^Hdd_Old_Bak[i]&Hdd_New_Bak[i];
Hdd_Old_Bak[i]=Hdd_New_Bak[i];
if(Hdd_Tmp[i])
{
for(j=0;j<8;j++)
{
if(Hdd_Tmp[i]&(1<<j))
{
//Change[i]|=1<<j;
HddVal[i*8+j]++;
/*
Constant_Range=Read1B(120+i*8+j,1);
switch (Constant_Range)
{
case (0x26):
Range=0;
break;
case (0x36):
Range=1;
break;
case (0x56):
Range=2;
break;
case (0x76):
Range=3;
break;
default:
Range=0;
break;
}
Full.Full_L=Full_Val[Range];
Full.Full_L=320000000;
Read_Hdd(i*8+j);
Hdd_Str.Hdd_L++;
Hdd10s[i*8+j]++;
if(Hdd_Str.Hdd_L>Full.Full_L)
{
Hdd_Str.Hdd_L=0;
}
Write_Hdd(i*8+j);
Pulse++;
if(Pulse%2)
write7279(SEGON,0x33,1);
else
write7279(SEGOFF,0x33,1); */
if(Press_Count<1000) Key_Press=1;
}
}
}
}
// Run=0;
Hdd_Rp++;
if(Hdd_Rp==10) Hdd_Rp=0;
}
/**********************************************************
*名 稱:Bat_Check
*功 能:電池剩余電量顯示
*說 明:
*調 用:
*入口參數:無
*返 回 值:無
***********************************************************/
void Bat_Check(void)
{
BYTE data i,Battery;
Ac_Check=1;
Ac_New=Ac_Check;
Ac_Tmp=Ac_New^Ac_Old;
Ac_Old=Ac_New;
//if (Ac_Tmp)
{
if(Ac_New)
{
write7279(UNDECODE+4,0,1); // DIG(7+4)=11 Battery Red
write7279(UNDECODE+5,Bat_Val[4],1); // DIG(7+5)=12 Battery Green
}
else
{
Cs_Bat=0;
P1=0;
short_delay();
Bat_New=Bat_Old=Bat;
if(Bat_New){Battery=Bat_Val[0]; }
else{Battery=Bat_Val[4];}
for(i=0;i<5;i++)
{
P1=i;
short_delay();
Bat_New=Bat;
Bat_Tmp=Bat_New^Bat_Old;
Bat_Old=Bat_New;
if(Bat_Tmp)
{
Battery=Bat_Val[i];
}
}
write7279(UNDECODE+5,0,1);
write7279(UNDECODE+4,Battery,1);
}
}
}
/**********************************************************
*名 稱:Alarm_Pro
*功 能:短路、斷線報價處理
*說 明:
*調 用:
*入口參數:無
*返 回 值:無
***********************************************************/
void Alarm_Pro(void)
{
BYTE i;
Alarm_Check=0;
Type=0;
Alarm=0;
Flash=0;
for(i=0;i<5;i++)
{
Short_Bak=Read1B(170+i,0);
Break_Bak=Read1B(175+i,0);
if((Short_New[i]|Short_Bak)&Short_En[i]&Hdd_En[i]) Alarm|=0x10;
if((Break_New[i]|Break_Bak)&Break_En[i]&Hdd_En[i]) Alarm|=0x20;
if(Short_New[i]&Short_En[i]) Flash|=1;
if(Break_New[i]&Break_En[i]) Flash|=2;
}
for(i=0;i<40;i++)
{
Type=Read1B(200+i,0);
if((Hdd_En[i%8]&(1<<(i%8))))
{
if(Type&0x01) Alarm|=0x04;
if(Type&0x02) Alarm|=0x02;
if(Type&0x04) Alarm|=0x01;
if(Type&0x08) Alarm|=0x80;
}
}
Alarm_Flag=1;
}
/**********************************************************
*名 稱:TrsRelay
*功 能:通過口線模擬的串口給控制器發送合分指令
*說 明:
*調 用:
*入口參數:無
*返 回 值:無
***********************************************************/
/*
void TrsRelay(BYTE YkNo,BYTE YkHf)
{
BYTE Check;
DIR2=0;
long_delay();
PSendChar(0xfe);
PSendChar(0xeb);
PSendChar(0x90);
PSendChar(0x00);
PSendChar(0x00);
PSendChar(0x00);
PSendChar(0x00);
PSendChar(0x06); //Length
PSendChar(0x00); //0
PSendChar(0x37);//Function
PSendChar(Relay_Station);//Station L
PSendChar(0x00);//0 H
PSendChar(YkNo);
PSendChar(YkHf);
Check=YkNo+YkHf+0x37+Relay_Station;
PSendChar(Check);
DIR2=1;
}
*/
/**********************************************************
*名 稱:main
*功 能:主程序
*說 明:
*調 用:
*入口參數:無
*返 回 值:無
***********************************************************/
void WriteHddPro(void)
{
// Run=1;
if(HddVal[WriteOrder])
{
Hdd_Str.Hdd_L=Read_Hdd(WriteOrder);
Hdd_Str.Hdd_L+=HddVal[WriteOrder];
HddVal[WriteOrder]=0;
Write_Hdd(WriteOrder);
}
WriteOrder++;
if(WriteOrder==40) WriteOrder=0;
// Run=0;
}
/**********************************************************
*名 稱:main
*功 能:主程序
*說 明:
*調 用:
*入口參數:無
*返 回 值:無
***********************************************************/
main()
{
BYTE data i,j,Tmp1,YkNo;
Init();
loop:
if(Press_Count<3) Speaker=0;
if(Press_Count==3 || Press_Count==4) Speaker=1;
if(Time_Counter>Run_Count)
{
// TrsRelay(1,0xcc); //////
if(HddEn_Count)
{
HddEn_Count_Pro();
}
WriteHddPro();
if((Start&0x80)==0x80) Run_Count=25;
else Run_Count=5;
Run=~Run;
//if(Run) TrsRelay(1,0x33);
// else TrsRelay(1,0xcc);
Time_Counter=0;
Bat_Check();
if(Flash&0x01)
{ if(Run)
write7279(SEGON,0x34,1);
else
write7279(SEGOFF,0x34,1);
}
if(Flash&0x02)
{ if(Run)
write7279(SEGON,0x35,1);
else
write7279(SEGOFF,0x35,1);
}
}
if (Press_Count<1000 && Sp_Flag)
{
Speaker=Run;
}
else
Speaker=Key;
if(((Start&0x80)==0x80) && (Hdd_Rp!=Hdd_Wp))
Hdd_Check();
if (Key_Press==1) Disp_Pro();
if (Press_Count==1000)
{
Press_Count=1001;
EA=0;
send_byte(CMD_RESET,0); // 清除顯示
send_byte(CMD_RESET,1);
cs1=cs2=1;
EA=1;
House=House_Max-1;
Speaker=1;
Alarm_Check=1;
}
if(Alarm_Check) Alarm_Pro();
Key_Pro();
if(Rcv_Flag)
{
Rcv_Pro();
}
if(Trs_Flag==1 && Trs_Wp==Trs_Rp)
{
Trs_Edit();
}
if(Rcv_Count>10) Rcv_Wp=0;
if(Key_Count>100)
{
Key_Count=0;
Speaker=0;
delay10ms(100);
for(i=0;i<5;i++)
{
Short_New[i]=0;
Write1B(0,170+i,0);
Break_New[i]=0;
Write1B(0,175+i,0);
}
Speaker=1;
Start=0x80;
Write1B(0x80,255,0);
Alarm_Flag=1;
}
//Key_Number=read7279(CMD_READ);
if(Alarm_Flag)
{
Alarm_Flag=0;
write7279(UNDECODE+6,Alarm,1);
}
/*
if(Ms20>140)
{
Ms20=0;
for(i=0;i<40;i++)
{
Tmp1=Read1B(200+i,1);
if(Tmp1&0x80)
{
Tmp1&=0x7f;
if(Hdd10s[i]>Tmp1)
{
RelayOff[i/8]|=1<<(i%8);
}
Hdd10s[i]=0;
}
}
}
if(Trs_Counter>15)
{
Trs_Counter=0;
for(i=0;i<5;i++)
{
if(RelayOff[i])
{
for(j=0;j<8;j++)
{
Tmp1=1<<j;
if(RelayOff[i]&Tmp1)
{
RelayOff[i]&=~Tmp1;
YkNo=i*8+j+1;
//TrsRelay(YkNo,0x33);
TrsRelayOff[i]|=Tmp1;
RelayOffTimes[YkNo-1]++;
i=5;
break;
}
}
}
}
for(i=0;i<5;i++)
{
if(TrsRelayOff[i])
{
for(j=0;j<8;j++)
{
Tmp1=1<<j;
if(TrsRelayOff[i]&Tmp1)
{
if(TrsOffCount[i*8+j]>4225)
// if(RelayOffTimes[i*8+j]<6)
{
TrsOffCount[i*8+j]=0;
YkNo=i*8+j+1;
TrsRelayOff[i]&=~Tmp1;
TrsRelay(YkNo,0xcc);
i=5;
break;
}
}
}
}
}
}
*/
goto loop;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -