#include "reg932.h"
#include <stdio.h>
#include <stdarg.h>
OUTA=0;OUTB=0;jma=1; pro(P0si_1,color_R);
pyo_1=1; pyo_2=pyo_0=0;pyoy=0; // keypa=0;
luma=2;//yoyma(ma,luma);
if(yomp!=luma) {yomp=luma;ma1=1;}
} //lu=2 报警标志
if((INA_2==1)&&(INA_1==1))
{
pro(P0si_1,color_D);
in1=0; dj=0;
yomp=0; // 无报警1关灯
if(((INA_2==1)&&(INA_1==1))&&((INB_2==1)&&(INB_1==1))) //if((in1==0)&&(in2==0))
{
FA=0;b=0;pyo_0=pyo_1=pyo_2=0;inkp1=0;
pyo_0a=pyo_1a=pyo_2a=0;sk0=sk1=sk2=0;
if(jmb==0) OUTA=1;OUTB=1;
jma=0;
} //无动作 S1=S2=S3 keypa=0;
clrwdt() ; }
/*********************第二路**********************************/
if((INB_2==0)&&(INB_1==1)) //预报警动作&&((INA_2==1)&&(INA_1==1))
{
pro(P0si_3,color_G); //绿灯,警声指示 S2=S3=0;S1=1;
if(jma==0) OUTA=1;OUTB=0;
jmb=0;
if(pyoy==1) {{pyoy=0;}}
pyo_0=1; pyo_1=pyo_2=0;
in2=1; //in1=0; // 进入报警1
if(inkp2==1){inkp2=0;keypa=0;}
lumb=5;//yoyma(ma,lumb);
if(yompb!=lumb) {yompb=lumb;ma1=0;}
}
if((INB_1==0)&&(INB_2==0)&&(keypa==1) ) //报警动作解除
{ pyoy=1; inkp2=1;
if(jma==0) OUTA=1;OUTB=0;
jmb=0;
pro(P0si_3,color_B); //蓝灯
pyo_2=1; pyo_1=pyo_0=0;
lumb=7; //yoyma(ma,lumb);
if(yompb!=lumb) {yompb=lumb;ma1=0;}
}
if((INB_1==0)&&(INB_2==0)&&(keypa==0) ) //报警
{
OUTA=0;OUTB=0;jmb=1;
pro(P0si_3,color_R);
pyo_1=1; pyo_2=pyo_0=0;pyoy=0; // keypa=0;
lumb=6;//yoyma(ma,lumb);
if(yompb!=lumb) {yompb=lumb;ma1=0;}
}
if((INB_2==1)&&(INB_1==1)) // 无报警1关灯
{
pro(P0si_3,color_D);
in2=0; dj2=0;
yompb=0;
if(((INA_2==1)&&(INA_1==1))&&((INB_2==1)&&(INB_1==1))) //无动作 S1=S2=S3 keypa=0;
{
FA=0;b=0;pyo_0a=pyo_1a=pyo_2a=0;
pyo_0=pyo_1=pyo_2=0;inkp2=0;
sk0=sk1=sk2=0;
if(jma==0) OUTA=1;OUTB=1;
jmb=0;
}
}
if(ma1==1) lu=luma;
else {lu=lumb;}
dj=2 ;yoy (lu,dj);
if(FA==1)
{
if(++b==zma)
{tp=1;b=0;FA=0;dj=0; }
else {tp=0;FA=1;}
}
clrwdt() ;
goto moa;
}
/***************************
* 系统初始化
*
****************************/
void SysInit()
{
uchar data duanma[4]={0X20,0X40,0X80,0 } ; //20-蓝色 40-绿色 20-红色
uchar dong[5];
uchar sd[1]={0x04};
uchar DpBuf[5];
uchar i,j,dj;
P0M1=0xCF; // P0口设置P0.0,0.1,0.2,0.3,为输入; P0.6,P0.7 为输出开漏 11001111,
P0M2=0xC0; //11000000
P1M1 = 0x0C; //P1口设置P1.2,P1.3,P1.4,P1.6,P1.7 为输出开漏 11011100 0C
P1M2 = 0x0C; //110111000C
P2M1 = 0xCF; //P2设置口P2.0,P2.1,P2.2,P2.3为输入; P2.6,P2.7 为输出开漏 11001111
P2M2 = 0xC0; //11000000
sk0=sk1=sk2=0;
OUTA= OUTB= OUTC= OUTD=1;
keyp9= keypa=keypb=0;
pyo_0=pyo_1=pyo_2= pyo_0a=pyo_1a=pyo_2a=tp=0;
pyo_0a=pyo_1a=pyo_2a=0; //zn=0;
in1=in2=in3=in4=0;
zma=b=0; dj=0;
ISendStr(ZLG7290, 0x0d, sd, 1);
for (i=0;i<4;i++)
{
DpBuf[i]=0;
}
ISendStr(ZLG7290, 0x10, DpBuf, 5);
DelayNS(10);
j=0;
for (i=0;i<4;i++)
{
dong[0]=duanma[j]; //百位显示
dong[1]=duanma[j]; //十位显示
dong[2]=duanma[j]; //个位
dong[3]=duanma[j];
dong[4]=duanma[j];
ISendStr(ZLG7290, 0x10, dong, 5);
DelayNS(25);
j++;
}
init_wdt();
}
/*********************************************************
*名称:DelayNS()
*功能:延时一段时间
*入口参数:no
*出口参数:无
*********************************************************/
void DelayNS(uchar no)
{ uchar i,j;
for(; no>0; no--)
{ for(i=0; i<200; i++)
// clrwdt() ;
for(j=0; j<250; j++);
clrwdt() ;
}
}
/*******************************************************************
* 报警位数函数
*功能 根据输入参数一决定报警位数,颜色,继电器开关
*入口参数 sla 报警位数
* ys 颜色
jou 继电器开关
* 出口参数 函数返回1表示操作成功 否则操作有误
********************************************************************/
bit pro(uchar wa, uchar ys)
{
uchar data duanma[4]={0X20,0X40,0X80,0 } ;
uchar dong[1]; //先位,后颜色。
dong[0]=duanma[ys];
ISendStr(ZLG7290, 0x10+wa, dong, 1);
return(1);
}
/*******************************************************************
* 报警声音函数
*功能 根据输入参数一决定报警声音,预报警声音,报警声音,解除报警声音.延时计数
三路调用同一函数,根据pyo决定输出级别。每一路只能调用一次。
*入口参数 pyo 报警声 预报警声音,报警声音,解除报警声音.
* ysa 延时 标志位
* 出口参数 函数返回1,表示延时计数结束, 否则延时计数未结束
********************************************************************/
void yoy(uchar lu,uchar py1)
{ uchar pyo;
pyo=lu;
if((pyo==3)||((pyo==7))) //解除报警声音
{
if (pyo_2a!=1)
{pyo_2a=1;FA=1;tp=tp2=0;b=0; pyo_0a=0; } // 第一次进入标志位
if(tp==1)
{sk2=0;
FA=0;b=0;pyo_0a=0;
}
else {sk2=1;sk0=sk1=0;FA=1; }
}
if((pyo==2)||((pyo==6))) //报警声音
{
if (pyo_1a!=1)
{pyo_1a=1;FA=1;tp=0;b=0;pyo_0a=pyo_2a=0; } // 第一次进入标志位 pyo_0a=pyo_2a=0;
if(tp==1)
{sk1=0;
FA=0;b=0; //pyo_0a=0;
}
else {sk1=1;sk0=sk2=0;FA=1;} // pyo_0a=0;
}
if((pyo==1)||((pyo==5))) //预报警
{
if (pyo_0a!=1)
{pyo_0a=1;FA=1;tp=0;b=0;pyo_1a=pyo_2a=0; } // 第一次进入标志位 pyo_0a=pyo_2a=0;
if(tp==1)
{sk0=0;
FA=0;b=0; //pyo_0a=0;
}
else {sk0=1;sk1=sk2=0;FA=1;} //
}
if(((INA_2==1)&&(INA_1==1))&&((INB_2==1)&&(INB_1==1)))
//if((pyo==4)||((pyo==8)))
{
sk0=sk1=sk2=0 ;
FA=0;tp=0;b=0;pyo_0a=pyo_1a=pyo_2a=0;lu=0;ma=0;
}
}
/*******************************************************************
* 报警声音函数
*功能 根据输入参数一决定报警声音,预报警声音,报警声音,解除报警声音.延时计数
三路调用同一函数,根据pyo决定输出级别。每一路只能调用一次。
*入口参数 pyo 报警声 预报警声音,报警声音,解除报警声音.
* ysa 延时 标志位
* 出口参数 函数返回1,表示延时计数结束, 否则延时计数未结束
********************************************************************/
/*
void yoyma(uchar ma,uchar luma)
{
;
//if(ma1==1)lu==luma;
// else {lu==lu;}
/*
if(ma==0){
ma=1;
lu=luma;
}
else{
if(lu==luma)ma=1;
else ma=0;
}
}
*/
/*******************************************************************
* 申请总线
* 功能:进行I2C总线的初始化--包括时钟选择,I2C使能,发送起始信号等等。
* I2EN为1,设置为主机;CRSEL位为0,使用内部SCL发生器。
*******************************************************************/
void GetBus()
{ I2SCLH = 15; /* 设置SCL高电平的PCLK周期数 */
I2SCLL = 15; /* 设置SCL低电平的PCLK周期数,6MHz时为100Kbit/S */
/* 申请成为主机,起动总线。使用内部SCL发生器,I2EN和AA置位。 */
I2CON = RELEASE_BUS_STA;
while( SI==0 ); /* 等待起始位的发送 */
}
/*******************************************************************
* 发送数据函数
* 功能:用于向总线发送数据
* 入口参数:ACC 待发送的数据
*******************************************************************/
void SendByte(uchar c)
{ I2DAT = c;
I2CON = RELEASE_BUS_ACK; /* 清除SI位等等 */
while( SI==0 ); /* 等待数据的发送 */
}
/*******************************************************************
* 向有子地址器件发送多字节数据函数
* 功能:从启动总线到发送地址,子地址,数据,结束总线的全过程。
* 入口参数;sla 从器件地址
* suba 子地址
* s 发送内容的指针
* no 发送字节数
* 出口参数:返回1表示操作成功,否则操作有误。
********************************************************************/
bit ISendStr(uchar sla, uchar suba, uchar *s, uchar no)
{ uchar i;
GetBus(); /* 启动总线 */
SendByte(sla); /* 发送器件地址 */
if( I2STAT!=0X18 )
{ I2CON = GENERATE_STOP;
return(0);
}
SendByte(suba); /* 发送器件子地址 */
if( I2STAT!=0X28 )
{ I2CON = GENERATE_STOP;
return(0);
}
for(i=0; i<no; i++)
{ SendByte(*s); /* 发送数据 */
if( I2STAT!=0X28 )
{ I2CON = GENERATE_STOP;
return(0);
}
s++;
}
I2CON = GENERATE_STOP; /* 结束总线 */
return(1);
}
/*******************************************************************
* 向无子地址器件发送字节数据函数
* 功能 从启动总线到发送地址 数据 结束总线的全过程
* 入口参数 sla 从器件地址
* c 待发送的数据
* 出口参数 返回1表示操作成功 否则操作有误
********************************************************************/
bit ISendByte(uchar sla, uchar c)
{ GetBus(); /* 启动总线 */
SendByte(sla); /* 发送器件地址 并接收应答位 */
if( I2STAT!=0X18 ) /* 无从机应答则退出操作 */
{ I2CON = GENERATE_STOP;
return(0);
}
SendByte(c); /* 发送数据 */
if( I2STAT!=0X28 )
{ I2CON = GENERATE_STOP;
return(0);
}
I2CON = GENERATE_STOP; /* 结束总线 */
return(1);
}
/*******************************************************************
* 向有子地址器件读取多字节数据函数
*功能:从启动总线到发送地址,子地址,读数据,结束总线的全过程。
*入口参数:sla 从器件地址
* suba 子地址
* s 读出的内容存储区的指针
* no 读no个字节。
*出口参数:函数返回1表示操作成功,否则操作有误。
********************************************************************/
bit IRcvStr(uchar sla,uchar suba,uchar *s,uchar no)
{ uchar i;
GetBus(); /* 启动总线 */
SendByte(sla); /* 发送器件地址 */
if( I2STAT!=0X18)
{ I2CON = GENERATE_STOP;
return(0);
}
SendByte(suba); /* 发送器件子地址 */
if( I2STAT!=0X28 )
{ I2CON = GENERATE_STOP;
return(0);
}
I2CON = RELEASE_BUS_STA; /* 重新启动总线 */
while( SI==0 );
SendByte(sla+1);
if( I2STAT!=0X40 )
{ I2CON = GENERATE_STOP;
return(0);
}
for(i=0; i<no-1; i++)
{ I2CON = RELEASE_BUS_ACK; /* 接收一字节数据并发送应答位 */
while( SI==0 ); /* 等待接收数据 */
if( I2STAT!=0X50 )
{ I2CON = GENERATE_STOP;
return(0);
}
*s = I2DAT; /* 读取数据 */
s++;
}
I2CON = RELEASE_BUS_NOACK; /* 接收最后一字节数据并发送非应答位 */
while( SI==0 );
*s = I2DAT;
I2CON = GENERATE_STOP; /* 结束总线 */
return(1);
}
/*****************************
;看门狗初始化子程序
;注意初始化后启动看门狗
*****************************/
void init_wdt()
{
ACC = WDCON; //读取 WDT 控制寄存器
ACC = ACC|0x04; //置位 ACC.2 准备启动
WDL = 0x80; //设置 8 位倒计时器初值
WDCON = ACC; //启动 WDT
WFEED1 = 0xA5; //清零第一部分
WFEED2 = 0x5A; //清零第二部分
}
void clrwdt()
{
// EA = 0; //关闭中断
WFEED1 = 0xA5; //执行清零第一部分
WFEED2 = 0x5A; //执行清零第二部分
// EA = 1; //开中断
}
/*
void UART_Init() //6M频率
{
P1M1&=0xfc; //把TXD和RXD设置
P1M2&=0xfc;
SSTAT=0; //双缓冲禁止,中断禁
SCON=0x50; //串口模式1,接收使
BRGCON=0;
BRGR1=0x02; //波特率9600bit/s
BRGR0=0x61;
BRGCON=3; //启动UART的波特率
}
*/