📄 host.c
字号:
//清除锁存信号
STCLK_Lo();
//输出1
DataOut(nLed[1]);
//给锁存信号,显示数据
STCLK_Hi();
//判断分机是否短路
nBit5 = (P1IN & BIT5) >> 5;
nBit6 = (P1IN & BIT6) >> 6;
if((nBit6 == 1) && (nBit5 == 1))
{
//分机短路
//提示音三次
Ring();
P4OUT &= ~(BIT2);
Delay_1s();
Ring();
P4OUT &= ~(BIT2);
Delay_1s();
Ring();
Delay_1s();
P4OUT &= ~(BIT2);
}//分机短路
else
{
//分机不短路
//发出振铃信号
//初始化摘机标志,为0代表没有摘机
ZhaijiFlag = 0;
//定时器中断允许
TBCTL |= TBCLR;
TBCCTL0 |= CCIE;
//在振铃时间30s内
while(RingFlag)
{
//发出振铃信号
Ring();
Delay_1s();
P4OUT &= ~(BIT2);
//判断分机是否摘机
nBit5 = (P1IN & BIT5) >> 5;
nBit6 = (P1IN & BIT6) >> 6;
if((nBit6 == 0) && (nBit5 == 0))
{
//分机摘机
//摘机标志为1,代表摘机
ZhaijiFlag = 1;
}//分机摘机
if(ZhaijiFlag == 1) break;
}//振铃时间内
//定时器中断禁止
TBCCTL0 &= ~(CCIE);
//假如分机摘机
if(ZhaijiFlag == 1)
{
//分机摘机
//对话
//定时器中断允许
TBCTL |= TBCLR;
TBCCTL0 |= CCIE;
P4OUT &= ~(BIT2);
DialogFlag = 1;
//在对话时间60s内
while( DialogFlag)
{
//打开对讲
P4OUT |= BIT0;
P4OUT |= BIT1;
P4OUT &= ~(BIT2);
P4OUT &= ~(BIT4);
//判断分机是否挂机
nBit5 = (P1IN & BIT5) >> 5;
nBit6 = (P1IN & BIT6) >> 6;
if((nBit6 == 0) && (nBit5 == 0))
{
//分机挂机
//关闭对讲
P4OUT &= ~(BIT0);
P4OUT &= ~(BIT3);
}//分机挂机,返回
else
{
//分机没有挂机
//判断是否开锁
nBit5 = (P1IN & BIT5) >> 5;
nBit6 = (P1IN & BIT6) >> 6;
if((nBit6 == 1) && (nBit5 == 1))
{
//分机开锁
for(i = 0;i < 10;i++)
{
//开电锁命令
P4OUT &= ~(BIT1);
}
break;
}//分机开锁
else//不开锁
{
;
}//不开锁
}//分机没有挂机
}//对话时间内
//定时器中断禁止
TBCCTL0 &= ~(CCIE);
}//分机摘机
}//分机不短路
}//分机存在
else //分机不存在
{
//清除锁存信号
STCLK_Lo();
//输出0
DataOut(nLed[0]);
//给锁存信号,显示数据
STCLK_Hi();
//提示音两次
Ring();
Delay_1s();
Ring();
}
nidle = 1; //重新开始扫描键盘
}
int Process_Data(char nIn[],int nLen,char nRoom_Mode)
{
unsigned int nTemp = 0;
int i;
// 第一,进行编码,获得编码数据
switch(nRoom_Mode)
{
case 1://房间范围在011-994,每层4户。
{
nTemp = nIn[0] * 256 + nIn[1] * 16 + nIn[2];
if(nIn[2] == 3) nTemp += 1;
else if(nIn[2] == 4) nTemp += 4;
break;
}
case 2:
{
break;
}
case 3:
{
break;
}
case 4:
{
break;
}
case 5:
{
break;
}
case 6:
{
break;
}
case 7:
{
break;
}
case 8:
{
break;
}
case 9:
{
break;
}
default:break;
}
// 第二,进行编码数据传送
for(i = 0;i < 5;i++) Send_data(nTemp);
// 第三,进行拨号以及相应处理
for(i = 0;i < 5;i++) DialAndProcess();
return 0;
}
char Sub_Process(char nTemp,char nIn[],int nLen,char nRoom_Mode)
{
char chrTemp = 0;
nIn[nLen] = nTemp;
switch(nRoom_Mode)
{
case 1:
{
if(nLen >= 2) chrTemp = 1;
else chrTemp = 0;
break;
}
case 2:
{
if(nLen >= 2) chrTemp = 1;
else chrTemp = 0;
break;
}
case 3:
{
if(nLen >= 2) chrTemp = 1;
else chrTemp = 0;
break;
}
case 4:
{
break;
}
case 5:
{
break;
}
case 6:
{
if(nLen >= 3) chrTemp = 1;
else chrTemp = 0;
break;
}
case 7:
{
if(nLen >= 3) chrTemp = 1;
else chrTemp = 0;
break;
}
case 8:
{
if(nLen >= 3) chrTemp = 1;
else chrTemp = 0;
break;
}
case 9:
{
if(nLen >= 1) chrTemp = 1;
else chrTemp = 0;
break;
}
default:
{
chrTemp = 0;
break;
}
}
return chrTemp;
}
char OpenDoorSelf(char nTemp,char nIn[],int nLen,char nRoom_Mode)
{
unsigned int nAddr;
char nValue[4];
char chrTemp = 0;
nIn[nLen] = nTemp;
switch(nRoom_Mode)
{
case 1:
{
if(nLen >= 6)
{
chrTemp = 1;
nAddr = ((nIn[0] * 10 + nIn[1] - 1) * 4 + nIn[2]) * 2;
nValue[0] = I2C_Read(nAddr);
Delay();
nAddr += 1;
nValue[1] = I2C_Read(nAddr);
Delay();
nValue[2] = nIn[3] * 16 + nIn[4];
nValue[3] = nIn[5] * 16 + nIn[6];
if((nValue[0] == nValue[2]) && (nValue[1] == nValue[3]))
{
//Dialog
P4OUT &= ~(BIT0);
//un_lock
P4OUT &=~(BIT1);
//code
P4OUT &= ~(BIT4);
//Ring
P4OUT &= ~(BIT2);
}
else
{
//提示音三次
Ring();
P4OUT &= ~(BIT2);
Delay_1s();
Ring();
P4OUT &= ~(BIT2);
Delay_1s();
Ring();
Delay_1s();
P4OUT &= ~(BIT2);
}
}
else chrTemp = 0;
break;
}
case 2:
{
if(nLen >= 6)
{
chrTemp = 1;
}
else chrTemp = 0;
break;
}
case 3:
{
if(nLen >= 6)
{
chrTemp = 1;
}
else chrTemp = 0;
break;
}
case 4:
{
break;
}
case 5:
{
break;
}
case 6:
{
if(nLen >= 7)
{
chrTemp = 1;
}
else chrTemp = 0;
break;
}
case 7:
{
if(nLen >= 7)
{
chrTemp = 1;
}
else chrTemp = 0;
break;
}
case 8:
{
if(nLen >= 7)
{
chrTemp = 1;
}
else chrTemp = 0;
break;
}
case 9:
{
if(nLen >= 5)
{
chrTemp = 1;
}
else chrTemp = 0;
break;
}
default:
{
chrTemp = 0;
break;
}
}
return chrTemp;
}
char Administrator(char nTemp,char nIn[],int nLen,char nRoom_Mode)
{
unsigned int nAddr;
unsigned char nValue[2];
char chrTemp = 0;
nIn[nLen] = nTemp;
switch(nRoom_Mode)
{
case 1:
{
if(nLen >= 6)
{
nAddr = ((nIn[0] * 10 + nIn[1] - 1) * 4 + nIn[2]) * 2;
nValue[0] = nIn[3] * 16 + nIn[4];
I2C_Write(nAddr,nValue[0]);
Delay();
nAddr += 1;
nValue[1] = nIn[5] * 16 + nIn[6];
I2C_Write(nAddr,nValue[1]);
Delay();
chrTemp = 1;
}
else chrTemp = 0;
break;
}
case 2:
{
if(nLen >= 6)
{
chrTemp = 1;
}
else chrTemp = 0;
break;
}
case 3:
{
if(nLen >= 6)
{
chrTemp = 1;
}
else chrTemp = 0;
break;
}
case 4:
{
break;
}
case 5:
{
break;
}
case 6:
{
if(nLen >= 7)
{
chrTemp = 1;
}
else chrTemp = 0;
break;
}
case 7:
{
if(nLen >= 7)
{
chrTemp = 1;
}
else chrTemp = 0;
break;
}
case 8:
{
if(nLen >= 7)
{
chrTemp = 1;
}
else chrTemp = 0;
break;
}
case 9:
{
if(nLen >= 5)
{
chrTemp = 1;
}
else chrTemp = 0;
break;
}
default:
{
chrTemp = 0;
break;
}
}
return chrTemp;
}
char SetRoomMode(char nTemp,char nIn[],int nLen)//管理员设置房号模式
{
unsigned char nRoom_Mode;
unsigned char nValue[4];
char chrTemp = 0;
nIn[nLen] = nTemp;
if(nLen >= 4)
{
chrTemp = 1;
nValue[0] = nIn[0] * 16 + nIn[1];
nValue[1] = nIn[2] * 16 + nIn[3];
nValue[2] = I2C_Read(0);
Delay();
nValue[3] = I2C_Read(1);
Delay();
if((nValue[0] == nValue[2]) && (nValue[1] == nValue[3]))
{
nRoom_Mode = nIn[4];
if(nRoom_Mode > 9) chrTemp = 2;
else I2C_Write(513,nRoom_Mode);
Delay();
}
else chrTemp = 2;
}
else chrTemp = 0;
return chrTemp;
}
char SetRingTime(char nTemp,char nIn[],int nLen)//管理员设置振铃时间
{
unsigned char nRing_Time;
unsigned char nValue[4];
char chrTemp = 0;
nIn[nLen] = nTemp;
if(nLen >= 5)
{
chrTemp = 1;
nValue[0] = nIn[0] * 16 + nIn[1];
nValue[1] = nIn[2] * 16 + nIn[3];
nValue[2] = I2C_Read(0);
Delay();
nValue[3] = I2C_Read(1);
if((nValue[0] == nValue[2]) && (nValue[1] == nValue[3]))
{
nRing_Time = nIn[4] * 16 + nIn[5];
I2C_Write(514,nRing_Time);
}
else chrTemp = 2;
}
else chrTemp = 0;
return chrTemp;
}
char SetDialogTime(char nTemp,char nIn[],int nLen)//管理员设置对话时间
{
unsigned char nDialog_Time;
unsigned char nValue[4];
char chrTemp = 0;
nIn[nLen] = nTemp;
if(nLen >= 5)
{
chrTemp = 1;
nValue[0] = nIn[0] * 16 + nIn[1];
nValue[1] = nIn[2] * 16 + nIn[3];
nValue[2] = I2C_Read(0);
Delay();
nValue[3] = I2C_Read(1);
if((nValue[0] == nValue[2]) && (nValue[1] == nValue[3]))
{
nDialog_Time = nIn[4] * 16 + nIn[5];
I2C_Write(515,nDialog_Time);
}
else chrTemp = 2;
}
else chrTemp = 0;
return chrTemp;
}
char SetMasterPass(char nTemp,char nIn[],int nLen)
{
unsigned char nNum;
unsigned char nValue[6];
char chrTemp = 0;
nIn[nLen] = nTemp;
if(nLen >= 7)
{
chrTemp = 1;
//输入的新密码
nValue[0] = nIn[4] * 16 + nIn[5];
nValue[1] = nIn[6] * 16 + nIn[7];
//以前的密码,如果为第一次设置时,密码为1111
nValue[4] = nIn[0] * 16 + nIn[1];
nValue[5] = nIn[2] * 16 + nIn[3];
nValue[2] = I2C_Read(0);
Delay();
nValue[3] = I2C_Read(1);
if((nValue[2] == 0xff) && (nValue[3] == 0xff))//第一次设置密码
{
if((nValue[4] == 0x11) && (nValue[5] == 0x11))
{
//写入新密码
I2C_Write(0,nValue[0]);
Delay();
I2C_Write(1,nValue[1]);
chrTemp = 1;
}
else
{
chrTemp = 2;
}
}
else//不是第一次设置密码
{
if((nValue[4] == nValue[2]) && (nValue[5] == nValue[3]))//与以前的久密码进行比较,确定是否是管理员
{
//写入新密码
I2C_Write(0,nValue[0]);
Delay();
I2C_Write(1,nValue[1]);
chrTemp = 1;
}
else
{
chrTemp = 2;
}
//进入管理员设置用户密码模式
if((nValue[4] == nValue[0]) && (nValue[5] == nValue[1])) AdministratorFlag = 1;
}
}
else chrTemp = 0;
return chrTemp;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -