⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 host.c

📁 msp430实现的楼宇间通讯系统的原代码实现
💻 C
📖 第 1 页 / 共 2 页
字号:
        //清除锁存信号
	    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 + -