📄 function.c
字号:
//*************************************************************************
//**模 块 名:function.c
//**说 明:功能函数
//*************************************************************************
#include <AT89x55.H>
#include <INTRINS.H>
#include <STRING.H>
#include "main.h"
//位操作临时变量
volatile uchar bdata TemBit;
sbit TemBit0 = TemBit^0;
sbit TemBit1 = TemBit^1;
sbit TemBit2 = TemBit^2;
sbit TemBit3 = TemBit^3;
sbit TemBit4 = TemBit^4;
sbit TemBit5 = TemBit^5;
sbit TemBit6 = TemBit^6;
sbit TemBit7 = TemBit^7;
//输出口扩展1数据(D21,74HC237,29C040高7位地址,第八位????)
volatile uchar bdata CS_OUT1;
sbit PA0 = CS_OUT1^0; //第12位地址线
sbit PA1 = CS_OUT1^1; //第13位地址线
sbit PA2 = CS_OUT1^2; //第14位地址线
sbit PA3 = CS_OUT1^3; //第15位地址线
sbit PA4 = CS_OUT1^4; //第16位地址线
sbit PA5 = CS_OUT1^5; //第17位地址线
sbit PA6 = CS_OUT1^6; //第18位地址线
sbit DETECT_POWER = CS_OUT1^7; //探测器24V控制端
//输出口扩展2数据(D13,27HC273,送键盘检测,485发送接收设置,LED灯,自检控制)
volatile uchar bdata CS_OUT2;
sbit JP_DET = CS_OUT2^0; //键盘检测输出
sbit DE485 = CS_OUT2^1; //485发送
sbit RE485 = CS_OUT2^2; //485接收
sbit MUTE_LED = CS_OUT2^3; //消音指示灯
sbit POWER_LED = CS_OUT2^4; //主电指示灯
sbit BATT_LED = CS_OUT2^5; //备电指示灯
sbit LCD_LAMP = CS_OUT2^6; //液晶显示器背光
sbit SELF_TEST = CS_OUT2^7; //自检输出端
//输出口扩展3数据(向赛福德的YD8000报告四个区的状态)
volatile uchar bdata CS_OUT3;
sbit FIRTSTOP = CS_OUT3^0; //一区停止
sbit SECONDSTOP = CS_OUT3^1; //二区停止
sbit THREESTOP = CS_OUT3^2; //三区停止
sbit FOURSTOP = CS_OUT3^3; //四区停止
sbit FIRTSTART = CS_OUT3^4; //一区启动
sbit SECONDSTART = CS_OUT3^5; //二区启动
sbit THREESTART = CS_OUT3^6; //三区启动
sbit FOURSTART = CS_OUT3^7; //四区启动
//一区LED显示数据(一区各种状态显示)
volatile uchar bdata CS_LED1;
sbit LED1_NOALLOW = CS_LED1^0; //禁止灯
sbit LED1_ALLOW = CS_LED1^1; //允许灯
sbit LED1_MANUAL = CS_LED1^2; //手动指示灯
sbit LED1_AUTO = CS_LED1^3; //自动指示灯
sbit LDAUTOSTOP1 = CS_LED1^4; //联动设备自动停止
sbit PDAUTOSTART1 = CS_LED1^5; //喷洒灯自动启动
sbit SGAUTOSTART1 = CS_LED1^6; //声光自动启动
sbit GPAUTOSTART1 = CS_LED1^7; //钢瓶自动启动
//二区LED显示数据(二区各种状态显示)
uchar bdata CS_LED2;
sbit LED2_NOALLOW = CS_LED2^0; //禁止灯
sbit LED2_ALLOW = CS_LED2^1; //允许灯
sbit LED2_MANUAL = CS_LED2^2; //手动指示灯
sbit LED2_AUTO = CS_LED2^3; //自动指示灯
sbit LDAUTOSTOP2 = CS_LED2^4; //联动设备自动停止
sbit PDAUTOSTART2 = CS_LED2^5; //喷洒灯自动启动
sbit SGAUTOSTART2 = CS_LED2^6; //声光自动启动
sbit GPAUTOSTART2 = CS_LED2^7; //钢瓶自动启动
//三区LED显示数据(三区各种状态显示)
volatile uchar bdata CS_LED3;
sbit LED3_NOALLOW = CS_LED3^0; //禁止灯
sbit LED3_ALLOW = CS_LED3^1; //允许灯
sbit LED3_MANUAL = CS_LED3^2; //手动指示灯
sbit LED3_AUTO = CS_LED3^3; //自动指示灯
sbit LDAUTOSTOP3 = CS_LED3^4; //联动设备自动停止
sbit PDAUTOSTART3 = CS_LED3^5; //喷洒灯自动启动
sbit SGAUTOSTART3 = CS_LED3^6; //声光自动启动
sbit GPAUTOSTART3 = CS_LED3^7; //钢瓶自动启动
//四区LED显示数据(四区各种状态显示)
volatile uchar bdata CS_LED4;
sbit LED4_NOALLOW = CS_LED4^0; //禁止灯
sbit LED4_ALLOW = CS_LED4^1; //允许灯
sbit LED4_MANUAL = CS_LED4^2; //手动指示灯
sbit LED4_AUTO = CS_LED4^3; //自动指示灯
sbit LDAUTOSTOP4 = CS_LED4^4; //联动设备自动停止
sbit PDAUTOSTART4 = CS_LED4^5; //喷洒灯自动启动
sbit SGAUTOSTART4 = CS_LED4^6; //声光自动启动
sbit GPAUTOSTART4 = CS_LED4^7; //钢瓶自动启动
//输入扩展数据(读YD8000传来的启动和停止命令)
volatile uchar bdata CS_COMMAND;
sbit YDSTART1 = CS_COMMAND^0; //YD8000启动1区命令
sbit YDSTART2 = CS_COMMAND^1; //YD8000启动2区命令
sbit YDSTART3 = CS_COMMAND^2; //YD8000启动3区命令
sbit YDSTART4 = CS_COMMAND^3; //YD8000启动4区命令
sbit YDSTOP1 = CS_COMMAND^4; //YD8000停止1区命令
sbit YDSTOP2 = CS_COMMAND^5; //YD8000停止2区命令
sbit YDSTOP3 = CS_COMMAND^6; //YD8000停止3区命令
sbit YDSTOP4 = CS_COMMAND^7; //YD8000停止4区命令
//输入扩展数据(读键盘输入的数据)
volatile uchar bdata CS_KEYL;
sbit KEY_RESET = CS_KEYL^0; //复位键
sbit KEY_MUTE = CS_KEYL^1; //消音键
sbit KEY_TEST = CS_KEYL^2; //自检键
sbit KEY_SETUP = CS_KEYL^3; //设置键
sbit KEY_SURE = CS_KEYL^4; //确认键
sbit KEY_INC = CS_KEYL^5; //增加1
sbit KEY_DEC = CS_KEYL^6; //减少1
sbit TONG_DETECT = CS_KEYL^7; //与赛福德通讯故障检测
//输入扩展数据(读四个区各种状态的数据)
volatile uchar bdata CS_STATUS;
sbit GPQD_DETECT = CS_STATUS^0; //钢瓶启动检测
sbit JTAN_DETECT = CS_STATUS^1; //紧急停止检测
sbit YLKG_DETECT = CS_STATUS^2; //压力开关动作检测
sbit SDJT_DETECT = CS_STATUS^3; //手动紧急停止检测
sbit SDJQ_DETECT = CS_STATUS^4; //手动紧急启动检测
sbit JQAN_DETECT = CS_STATUS^5; //紧急启动检测
sbit ALLOW_DETECT = CS_STATUS^6; //允许禁止检测
sbit MANUAL_DETECT = CS_STATUS^7; //手动自动检测
//输入扩展数据(读四个区各路的线路故障信号)
volatile uchar bdata CS_FAULT;
sbit DCFGZ_DET = CS_FAULT^0; //电磁阀线路故障检测
sbit SGGZ_DET = CS_FAULT^1; //声光线路故障检测
sbit PSGZ_DET = CS_FAULT^2; //喷洒灯线路故障检测
sbit LDGZ_DET = CS_FAULT^3; //联动线路故障检测
sbit YLGZ_DET = CS_FAULT^4; //压力开关线路故障检测
sbit TZJGZ_DET = CS_FAULT^5; //停止键线路故障检测
sbit QDJGZ_DET = CS_FAULT^6; //启动键线路故障检测
//*************************************************************************
//**函 数 名:Setup12887
//**输 入:
//** *p:设置系统时间的时间数组
//**输 出:无
//**功能描述:
//** 1.设置系统时间
//*************************************************************************
void Setup12887(uchar *p)
{
uchar xdata i;
i=P12887d;
P12887a=0x70; P12887b=0xa2; P128870=*p++; P128871=0xff; P128872=*p++;
P128873=0xff; P128874=*p++; P128875=0xff; P128876=*p++; P128877=*p++;
P128878=*p++; P128879=*p++; P12887b=0x22; P12887a=0x20;
i=P12887c;
}
//*************************************************************************
//**函 数 名:Read12887
//**输 入:
//** *p:读取系统时间的时间数组
//**输 出:无
//**功能描述:
//** 1.读取系统时间
//*************************************************************************
void Read12887(uchar *p)
{
uchar xdata a;
do{ a=P12887a; } while((a&0x80)==0x80);
*p++=P128870; *p++=P128872; *p++=P128874; *p++=P128876;
*p++=P128877; *p++=P128878; *p++=P128879;
}
//*************************************************************************
//**函 数 名:Start12887
//**输 入:无
//**输 出:无
//**功能描述:
//** 1.启动时钟
//*************************************************************************
void Start12887(void) //启动时钟
{
uchar xdata i;
i=P12887d;
P12887a=0x70; P12887b=0xa2; P128871=0xff; P128873=0xff; P128875=0xff;
P12887b=0x22; P12887a=0x20;
i=P12887c;
}
//*************************************************************************
//**函 数 名:LCDLAMPCTRL
//**输 入:
//** trun_on_off:背光开关
//** 为1时,背光开
//** 为0时,背光关
//**输 出:无
//**功能描述:
//** 1.背光开关控制
//*************************************************************************
void LCDLAMPCTRL(bit trun_on_off) //背光开关
{
if(trun_on_off == 0)
{
//背光控制端置高,关背光
LCD_LAMP = 1;
//向指定口送数
KEYCOL_SCAN = CS_OUT2;
}
else
{
//背光控制端置低,开背光
LCD_LAMP = 0;
//向指定口送数
KEYCOL_SCAN = CS_OUT2;
}
}
//*************************************************************************
//**函 数 名:Disp_Auto_Allow
//**输 入:无
//**输 出:无
//**功能描述:
//** 1.检测四个区的手动自动状态,并送LED显示
//** 2.检测四个区的禁止允许状态,并送LED显示
//*************************************************************************
void Disp_Auto_Allow(uchar QuNumber)
{
switch(QuNumber)
{
//检测一区的状态
case 1:CS_STATUS = ONEPORTDETECT;
//判断手动自动锁的状态
if(MANUAL_DETECT)
{
//自动状态
LED1_MANUAL = 1; //自动灯亮
LED1_AUTO = 0; //手动灯灭
auto_status[QuNumber-1] = 0;
}
else
{
//手动状态
LED1_MANUAL = 0; //自动灯灭
LED1_AUTO = 1; //手动灯亮
auto_status[QuNumber-1] = 1;
}
//判断禁止允许锁的状态
if(ALLOW_DETECT)
{
//禁止状态
LED1_NOALLOW = 1; //禁止灯亮
LED1_ALLOW = 0; //允许灯灭
allow_status[QuNumber-1] = 0;
}
else
{
//允许状态
LED1_NOALLOW = 0; //禁止灯灭
LED1_ALLOW = 1; //允许灯亮
allow_status[QuNumber-1] = 1;
}
//送显示口
ONEPORTLEDDISP = CS_LED1;
break;
//检测二区状态
case 2:CS_STATUS = TWOPORTDETECT;
//判断手动自动锁的状态
if(MANUAL_DETECT)
{
//自动状态
LED2_MANUAL = 1; //自动灯亮
LED2_AUTO = 0; //手动灯灭
auto_status[QuNumber-1] = 0;
}
else
{
//手动状态
LED2_MANUAL = 0; //自动灯灭
LED2_AUTO = 1; //手动灯亮
auto_status[QuNumber-1] = 0;
}
//判断禁止允许锁的状态
if(ALLOW_DETECT)
{
//禁止状态
LED2_NOALLOW = 1; //禁止灯亮
LED2_ALLOW = 0; //允许灯灭
allow_status[QuNumber-1] = 0;
}
else
{
//允许状态
LED2_NOALLOW = 0; //禁止灯灭
LED2_ALLOW = 1; //允许灯亮
allow_status[QuNumber-1] = 1;
}
//送显示口
TWOPORTLEDDISP = CS_LED2;
break;
//检测三区状态
case 3:CS_STATUS = THREEPORTDETECT;
//判断手动自动锁的状态
if(MANUAL_DETECT)
{
//自动状态
LED3_MANUAL = 1; //自动灯亮
LED3_AUTO = 0; //手动灯灭
auto_status[QuNumber-1] = 0;
}
else
{
//手动状态
LED3_MANUAL = 0; //自动灯灭
LED3_AUTO = 1; //手动灯亮
auto_status[QuNumber-1] = 1;
}
//判断禁止允许锁的状态
if(ALLOW_DETECT)
{
//禁止状态
LED3_NOALLOW = 1; //禁止灯亮
LED3_ALLOW = 0; //允许灯灭
allow_status[QuNumber-1] = 0;
}
else
{
//允许状态
LED3_NOALLOW = 0; //禁止灯灭
LED3_ALLOW = 1; //允许灯亮
allow_status[QuNumber-1] = 1;
}
//送显示口
THREEPORTLEDDISP = CS_LED3;
break;
//检测四区状态
case 4:CS_STATUS = FOURPORTDETECT;
//判断手动自动锁的状态
if(MANUAL_DETECT)
{
//自动状态
LED4_MANUAL = 1; //自动灯亮
LED4_AUTO = 0; //手动灯灭
auto_status[QuNumber-1] = 0;
}
else
{
//手动状态
LED4_MANUAL = 0; //自动灯灭
LED4_AUTO = 1; //手动灯亮
auto_status[QuNumber-1] = 1;
}
//判断禁止允许锁的状态
if(ALLOW_DETECT)
{
//禁止状态
LED4_NOALLOW = 1; //禁止灯亮
LED4_ALLOW = 0; //允许灯灭
allow_status[QuNumber-1] = 0;
}
else
{
//允许状态
LED4_NOALLOW = 0; //禁止灯灭
LED4_ALLOW = 1; //允许灯亮
allow_status[QuNumber-1] = 1;
}
//送显示口
FOURPORTLEDDISP = CS_LED4;
break;
default:break;
}
}
//*************************************************************************
//**函 数 名:Power_TONGXU_Detect
//**输 入:无
//**输 出:无
//**功能描述:
//** 1.检测主电状态,并送LED显示
//** 2.检测备电状态,并送LED显示
//*************************************************************************
void Power_TONGXU_Detect()
{
//判断交流电是否故障,并且故障信息未上报
if((!ACOK)&&(!ac_report_ok))
{
//读取报警时间
Read12887(Clock_Time);
//存入显示缓冲区
SaveAlarmToBUFF(0x00,0x05,2);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -