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

📄 getkey.c

📁 采用430单片机完成的门禁控制器程序
💻 C
字号:
/*************************************************************/
/***********获取按键程序**************************************/
/*************************************************************/
void GETKEY()
{
  key =P2IN;
  key &= 0xc0;
  if(key==key_pre)
  {
    key_cnt++;
    if(key_cnt>=5)
    {
      if(key_pre == 0x40) // p2.7口作为开门按键
      {
        FLAG |=gb_lock;        
        cardnum      = 0x00;
        recordbuf = 0x00;
        REMARK = 0X03;
        STATUS =0X00;
        GETSTATUS();
        FLAG        |= gb_re1302;
        FLAG        |= gb_buzzer;
        buzzer_cycle = 1;
        FLAG1       |= gb_wrmsg; 
        buzzer_cycle = 1;        
        FLAG2       |= gb_doorval;
      }
      else if(key_pre == 0x80) //p2.6口作为布防撤防按键
      {        
        FLAG1       &= ~gb_protect;
        FLAG        |= gb_buzzer;        
        buzzer_cycle = 1;
        RUNBUZZER();
        Delay_ms(irdly_cnt * 100);
      }
    }
  }
  else
  {
    key_pre =key;
    key_cnt =0;
  }
}
/**************************************************/
/*****获取门的状态*********************************/
/**************************************************/
uchar GETDOORCLOSE()
{
  door =P1IN;
  door &= BIT5;
  if(door == door_pre)
  {
    door_cnt++;
    if(door_cnt>=5)
    {
      if(door == door_close)// 门关返回1
      {
        return 1;
      }
    }
  }
  else 
  {
    door_pre = door;
    door_cnt =0;
  }
  return 0;
}
/**************************************************/
/********获取红外的状态****************************/
/**************************************************/
uchar GETIRCLOSE()
{
  ir  = P1IN;
  ir &= BIT4;
  if(ir == ir_pre)
  {
    ir_cnt++;
    if(ir_cnt>=5)
    {
      if(ir == ir_close)// 红外关返回1
      {
        return 1;
      }
    }
  }
  else 
  {
    ir_pre = ir;
    ir_cnt =0;
  }
  return 0;
}
/**********************************************************/
/*************获取红外和门的状态***************************/
/**********************************************************/
uchar GETIDSTATUS()
{
  uchar buf = 0x03;
  ir  = P1IN;
  ir &= 0x30;
  if(ir == ir_pre)
  {
    ir_cnt++;
    if(ir_cnt >= iren_cnt)
    {
      if(ir_close == (ir & BIT4))// 红外关
      {
        buf &= ~BIT0;
      }
      if(door_close == (ir & BIT5))//门关
      {
        buf &= ~BIT1;
      }
      return buf; 
      //0 门和红外都是关的
      //1 门是开的,红外是关的
      //2 门是关的,红外是开的
      //3 门和红外都是开的
    }
  }
  else 
  {
    ir_pre = ir;
    ir_cnt =0;
  }
  return 4;
}
/*******************************************************/
/*********************************************************/
/********************************************************/
void msg_predeal()
{
  recordbuf = 0x00;
  REMARK = 0X05;
  ERRORSTATUS();
  FLAG        |= gb_re1302;
  FLAG        |= gb_buzzer;
  buzzer_cycle = 1;
  FLAG1       |= gb_wrmsg; 
  buzzer_cycle = 1; 
}
/**************************************************/
/**********监控红外和门的状态****************************/
/**************************************************/
void GETDOOR()
{
  uchar buf;
  if(FLAG2 & gb_doorval) // 监测门由于刷卡、遥控、按键开门
  {                      //后,是否关门了已经。
    if(GETDOORCLOSE())// 门关的处理程序
    {
      FLAG2 &= ~gb_doorval;
    }
  }
  else if(FLAG2 & gb_concon)
  {
    if(FLAG2 & gb_doornval)//监测门由于监控门和红外的状态
    {                      //产生报警或门开所引起的记录,门和红外是否已关 
      if(GETDOORCLOSE())
      {
        FLAG2 &= ~gb_doornval;
        cardnum = 0x03;   
        msg_predeal();
      }
    }
    else if(FLAG2 & gb_irval)
    {
      if(GETIRCLOSE())
      {
        FLAG2 &= ~gb_irval;
        cardnum = 0x01;
        msg_predeal();
      }
    }
    else if(FLAG2 & gb_concon1)//监测时段内的门和红外状态
    {
      buf = GETIDSTATUS();
      switch(buf)
      {        
        case 2: cardnum = 0x00; FLAG2 |= gb_irval;    break;//2 门是关的,红外是开的
        case 3:                       //3 门和红外都是开的
        case 1: cardnum = 0x02; FLAG2 |= gb_doornval; break;//1 门是开的,红外是关的
        case 0:          //0 门和红外都是关的
        case 4: goto getdoorend; // 4  程序没有进行完
      }
      msg_predeal();
    }
    else   //由上位机所进行的监测
    {
      buf = GETIDSTATUS();
      switch(buf)
      {        
        case 2: if(conone & BIT6){cardnum = 0x00; FLAG2 |= gb_irval;}    break;//2 门是关的,红外是开的
        case 3:                       //3 门和红外都是开的
        case 1: if(conone & BIT7){cardnum = 0x02; FLAG2 |= gb_doornval;} break;//1 门是开的,红外是关的
        case 0:          //0 门和红外都是关的
        case 4: goto getdoorend; // 4  程序没有进行完
      }
      if((FLAG2 & gb_irval) || (FLAG2 & gb_doornval))
      {
        msg_predeal();
      }
    }
  }
getdoorend:
  return;
}
/********************************************/
/*****获取红外报警状态***********************/
/********************************************/
uchar GETIR()
{
  uchar i;
  uchar buf;
  for(i=0; i<10; i++)
  {
    buf = P1IN;
  }
  buf &= 0x30;
  if(conone & BIT6)
  {
    if(buf & 0x10)//红外状态
    {
      if(conone & BIT2)
      {
        return 1;
      }
    }  
  }
  return 0;
}
/*********************************************/
/*********获取门的开关状态********************/
/*********************************************/
uchar GET_DOOR()
{
  uchar i;
  uchar buf;
  for(i=0; i<10; i++)
  {
    buf = P1IN;
  }
  buf &= 0x30;
  if(buf & 0x20)//门状态
  {
    if(conone & BIT3)
    {
      return 1;
    }
  }
  return 0;
}
/********************************************/
/******读取监控状态**************************/
/********************************************/
void jiankong()
{
  if(FLAG2 & gb_rejian)
  {
    FLAG2 &= ~gb_rejian;
    uchar buf = 0;
    if(conone & BIT7)
    {
      buf |= BIT2;
    }
    if(conone & BIT6)
    {
      buf |= BIT3;
    }
    if(FLAG & gb_lock)
    {
      buf |= BIT1;
    }
    if(GETIR())
    {
      buf |= BIT0;
    }
    set_tx();
    TX_DATA[7]  = '0';
    TX_DATA[8]  = '0';
    TX_DATA[9]  = 'C';
    TX_DATA[10] = '0';
    TX_DATA[11] = '0';
    TX_DATA[12] = '4';
    TX_DATA[13] = c_hex((buf >> 4) & 0x0f);
    TX_DATA[14] = c_hex(buf & 0x0f);
    buf = 0;
    if(FLAG & gb_lock)
    {
      buf |= BIT0;
    }
    if(GETIR())
    {
      buf |= BIT2;
    }
    if(GET_DOOR())
    {
      buf |= BIT3;
    }
    TX_DATA[15] = c_hex((buf >> 4) & 0x0f);
    TX_DATA[16] = c_hex(buf & 0x0f);
    jisuanhe(17);
  }
}
/******************************************************/
/*************读取控制信息*****************************/
/******************************************************/
void conmsg()
{
  if(FLAG2 & gb_conmsg)
  {
    FLAG2 &= ~gb_conmsg;
    set_tx();
    TX_DATA[7]   = '0';
    TX_DATA[8]   = '0';
    TX_DATA[9]   = '6';
    TX_DATA[10]  = '0';
    TX_DATA[11]  = '0';
    TX_DATA[12]  = 'A';
    TX_DATA[13]  = c_hex((conone >> 4) & 0x0f);
    TX_DATA[14]  = c_hex(conone & 0x0f);
    TX_DATA[15]  = c_hex((delay_cnt >> 4) & 0x0f);
    TX_DATA[16]  = c_hex(delay_cnt & 0x0f);
    TX_DATA[17]  = c_hex((wait_cnt >> 4) & 0x0f);
    TX_DATA[18]  = c_hex(wait_cnt & 0x0f);
    TX_DATA[19]  = c_hex((iren_cnt >> 4) & 0x0f);
    TX_DATA[20]  = c_hex(iren_cnt & 0x0f);
    TX_DATA[21]  = '1';
    TX_DATA[22]  = '0';
    jisuanhe(23);
  }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -